diff --git a/autobuild_mac80211_release/Release.md b/autobuild_mac80211_release/Release.md
index 27c951a..1f0ba06 100644
--- a/autobuild_mac80211_release/Release.md
+++ b/autobuild_mac80211_release/Release.md
@@ -85,7 +85,7 @@
 
 
 
-#### Filogic 830/820/630 WiFi6 MP2.3 Release (20240426)
+#### Filogic 830/820/630 WiFi6 MP2.3 Release (Coming Soon)
 
 ```
 #Get Openwrt 21.02 source code from Git server
diff --git a/autobuild_mac80211_release/mt7981-mac80211/.config b/autobuild_mac80211_release/mt7981_mac80211/.config
similarity index 100%
rename from autobuild_mac80211_release/mt7981-mac80211/.config
rename to autobuild_mac80211_release/mt7981_mac80211/.config
diff --git a/autobuild_mac80211_release/mt7981-mac80211/lede-branch-build-sanity.sh b/autobuild_mac80211_release/mt7981_mac80211/lede-branch-build-sanity.sh
similarity index 100%
rename from autobuild_mac80211_release/mt7981-mac80211/lede-branch-build-sanity.sh
rename to autobuild_mac80211_release/mt7981_mac80211/lede-branch-build-sanity.sh
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/lede-branch-build-sanity.sh b/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/lede-branch-build-sanity.sh
index d23c040..d17a0d5 100755
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/lede-branch-build-sanity.sh
+++ b/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/lede-branch-build-sanity.sh
@@ -75,19 +75,14 @@
 # remove crypto-eip package since it not support at mt76 yet
 rm -rf ${BUILD_DIR}/package/mtk_soc/drivers/crypto-eip/
 
-# ========== specific modification on mt7996 autobuild for EHT support ==========
-# patch hostapd to use latest version and add 11BE config
-patch -p1 < ${BUILD_DIR}/autobuild/${branch_name}/0002-add-EHT-config-for-hostapd.patch || exit 1
-
 # remove some iw patches to let EHT work normally
 rm -rf ${BUILD_DIR}/package/network/utils/iw/patches/001-nl80211_h_sync.patch
 rm -rf ${BUILD_DIR}/package/network/utils/iw/patches/120-antenna_gain.patch
 # ===========================================================
 
-# Add afc build config
-patch -p1 < ${BUILD_DIR}/autobuild/0007-add-afcd-build-configuration.patch || exit 1
-# Add mlo commit
-patch -p1 < ${BUILD_DIR}/autobuild/${branch_name}/0003-sync-mlo-commit-for-hostapd.patch || exit 1
+# ========== specific modification on mt7996 autobuild for MLO support ==========
+do_patch ${MTK_FEED_DIR}/autobuild_mac80211_release/openwrt_patches${OPENWRT_VER}/wifi7_mlo || exit 1
+
 # disable RADIUS in hostapd config
 sed -i "s/.*CONFIG_RADIUS_SERVER.*/# CONFIG_RADIUS_SERVER=y/g" ${BUILD_DIR}/package/network/services/hostapd/files/hostapd-full.config
 sed -i "s/.*CONFIG_NO_RADIUS=y.*/CONFIG_NO_RADIUS=y/g" ${BUILD_DIR}/package/network/services/hostapd/files/hostapd-full.config
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh b/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh
deleted file mode 100644
index 01fec4a..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh
+++ /dev/null
@@ -1,1887 +0,0 @@
-. /lib/functions/network.sh
-. /lib/functions.sh
-
-wpa_supplicant_add_rate() {
-	local var="$1"
-	local val="$(($2 / 1000))"
-	local sub="$((($2 / 100) % 10))"
-	append $var "$val" ","
-	[ $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"
-
-	wep_keyidx=0
-	set_default key 1
-	case "$key" in
-		[1234])
-			for idx in 1 2 3 4; do
-				local zidx
-				zidx="$(($idx - 1))"
-				json_get_var ckey "key${idx}"
-				[ -n "$ckey" ] && \
-					append $var "wep_key${zidx}=$(prepare_key_wep "$ckey")" "$N$T"
-			done
-			wep_keyidx="$((key - 1))"
-		;;
-		*)
-			append $var "wep_key0=$(prepare_key_wep "$key")" "$N$T"
-		;;
-	esac
-}
-
-hostapd_append_wpa_key_mgmt() {
-	local auth_type_l="$(echo $auth_type | tr 'a-z' 'A-Z')"
-
-	case "$auth_type" in
-		psk|eap)
-			append wpa_key_mgmt "WPA-$auth_type_l"
-			[ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt "FT-${auth_type_l}"
-			[ "${ieee80211w:-0}" -gt 0 ] && append wpa_key_mgmt "WPA-${auth_type_l}-SHA256"
-		;;
-		eap192)
-			append wpa_key_mgmt "WPA-EAP-SUITE-B-192"
-			[ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt "FT-EAP-SHA384"
-		;;
-		eap-eap2)
-			append wpa_key_mgmt "WPA-EAP"
-			append wpa_key_mgmt "WPA-EAP-SHA256"
-			[ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt "FT-EAP"
-		;;
-		eap2)
-			[ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt "FT-EAP"
-			append wpa_key_mgmt "WPA-EAP-SHA256"
-		;;
-		sae)
-			case "$encryption" in
-			*sae-ext*)
-				append wpa_key_mgmt "SAE-EXT-KEY"
-			;;
-			*)
-				append wpa_key_mgmt "SAE"
-			;;
-			esac
-			[ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt "FT-SAE"
-		;;
-		psk-sae)
-			append wpa_key_mgmt "WPA-PSK"
-			[ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt "FT-PSK"
-			[ "${ieee80211w:-0}" -gt 0 ] && append wpa_key_mgmt "WPA-PSK-SHA256"
-			append wpa_key_mgmt "SAE"
-			[ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt "FT-SAE"
-		;;
-		owe)
-			append wpa_key_mgmt "OWE"
-		;;
-	esac
-
-	[ "$fils" -gt 0 ] && {
-		case "$auth_type" in
-			eap-192)
-				append wpa_key_mgmt FILS-SHA384
-				[ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt FT-FILS-SHA384
-			;;
-			eap*)
-				append wpa_key_mgmt FILS-SHA256
-				[ "${ieee80211r:-0}" -gt 0 ] && append wpa_key_mgmt FT-FILS-SHA256
-			;;
-		esac
-	}
-
-	[ "$auth_osen" = "1" ] && append wpa_key_mgmt "OSEN"
-}
-
-hostapd_add_log_config() {
-	config_add_boolean \
-		log_80211 \
-		log_8021x \
-		log_radius \
-		log_wpa \
-		log_driver \
-		log_iapp \
-		log_mlme
-
-	config_add_int log_level
-}
-
-hostapd_common_add_device_config() {
-	config_add_array basic_rate
-	config_add_array supported_rates
-	config_add_string beacon_rate
-
-	config_add_string country country3
-	config_add_boolean country_ie doth
-	config_add_boolean spectrum_mgmt_required
-	config_add_int local_pwr_constraint
-	config_add_string require_mode
-	config_add_boolean legacy_rates
-	config_add_int cell_density
-	config_add_int rts_threshold
-	config_add_int rssi_reject_assoc_rssi
-	config_add_int rssi_ignore_probe_request
-	config_add_int rssi_reject_assoc_timeout
-	config_add_int maxassoc
-
-	config_add_string acs_chan_bias
-	config_add_array hostapd_options
-
-	config_add_int airtime_mode
-	config_add_int mbssid
-
-	hostapd_add_log_config
-}
-
-hostapd_prepare_device_config() {
-	local config="$1"
-	local driver="$2"
-
-	local base_cfg=
-
-	json_get_vars country country3 country_ie beacon_int:100 doth require_mode legacy_rates \
-		acs_chan_bias local_pwr_constraint spectrum_mgmt_required airtime_mode cell_density \
-		rts_threshold beacon_rate rssi_reject_assoc_rssi rssi_ignore_probe_request maxassoc \
-		mbssid:0
-
-	hostapd_set_log_options base_cfg
-
-	set_default country_ie 1
-	set_default spectrum_mgmt_required 0
-	set_default doth 1
-	set_default legacy_rates 0
-	set_default airtime_mode 0
-	set_default cell_density 0
-
-	[ -n "$country" ] && {
-		append base_cfg "country_code=$country" "$N"
-		[ -n "$country3" ] && append base_cfg "country3=$country3" "$N"
-
-		[ "$country_ie" -gt 0 ] && {
-			append base_cfg "ieee80211d=1" "$N"
-			[ -n "$local_pwr_constraint" ] && append base_cfg "local_pwr_constraint=$local_pwr_constraint" "$N"
-			[ "$spectrum_mgmt_required" -gt 0 ] && append base_cfg "spectrum_mgmt_required=$spectrum_mgmt_required" "$N"
-		}
-		[ "$hwmode" = "a" -a "$doth" -gt 0 ] && append base_cfg "ieee80211h=1" "$N"
-	}
-
-	[ -n "$acs_chan_bias" ] && append base_cfg "acs_chan_bias=$acs_chan_bias" "$N"
-
-	local brlist= br
-	json_get_values basic_rate_list basic_rate
-	local rlist= r
-	json_get_values rate_list supported_rates
-
-	[ -n "$hwmode" ] && append base_cfg "hw_mode=$hwmode" "$N"
-	if [ "$hwmode" = "g" ] || [ "$hwmode" = "a" ]; then
-		[ -n "$require_mode" ] && legacy_rates=0
-		case "$require_mode" in
-			n) append base_cfg "require_ht=1" "$N";;
-			ac) append base_cfg "require_vht=1" "$N";;
-		esac
-	fi
-	case "$hwmode" in
-		b)
-			if [ "$cell_density" -eq 1 ]; then
-				set_default rate_list "5500 11000"
-				set_default basic_rate_list "5500 11000"
-			elif [ "$cell_density" -ge 2 ]; then
-				set_default rate_list "11000"
-				set_default basic_rate_list "11000"
-			fi
-		;;
-		g)
-			if [ "$cell_density" -eq 0 ] || [ "$cell_density" -eq 1 ]; then
-				if [ "$legacy_rates" -eq 0 ]; then
-					set_default rate_list "6000 9000 12000 18000 24000 36000 48000 54000"
-					set_default basic_rate_list "6000 12000 24000"
-				elif [ "$cell_density" -eq 1 ]; then
-					set_default rate_list "5500 6000 9000 11000 12000 18000 24000 36000 48000 54000"
-					set_default basic_rate_list "5500 11000"
-				fi
-			elif [ "$cell_density" -ge 3 ] && [ "$legacy_rates" -ne 0 ] || [ "$cell_density" -eq 2 ]; then
-				if [ "$legacy_rates" -eq 0 ]; then
-					set_default rate_list "12000 18000 24000 36000 48000 54000"
-					set_default basic_rate_list "12000 24000"
-				else
-					set_default rate_list "11000 12000 18000 24000 36000 48000 54000"
-					set_default basic_rate_list "11000"
-				fi
-			elif [ "$cell_density" -ge 3 ]; then
-				set_default rate_list "24000 36000 48000 54000"
-				set_default basic_rate_list "24000"
-			fi
-		;;
-		a)
-			if [ "$cell_density" -eq 1 ]; then
-				set_default rate_list "6000 9000 12000 18000 24000 36000 48000 54000"
-				set_default basic_rate_list "6000 12000 24000"
-			elif [ "$cell_density" -eq 2 ]; then
-				set_default rate_list "12000 18000 24000 36000 48000 54000"
-				set_default basic_rate_list "12000 24000"
-			elif [ "$cell_density" -ge 3 ]; then
-				set_default rate_list "24000 36000 48000 54000"
-				set_default basic_rate_list "24000"
-			fi
-		;;
-	esac
-
-	for r in $rate_list; do
-		hostapd_add_rate rlist "$r"
-	done
-
-	for br in $basic_rate_list; do
-		hostapd_add_rate brlist "$br"
-	done
-
-	json_get_vars rssi_reject_assoc_timeout
-	[ -n "$rssi_reject_assoc_rssi" ] && append base_cfg "rssi_reject_assoc_rssi=$rssi_reject_assoc_rssi" "$N"
-	[ -n "$rssi_ignore_probe_request" ] && append base_cfg "rssi_ignore_probe_request=$rssi_ignore_probe_request" "$N"
-	[ -n "$rssi_reject_assoc_timeout" ] && append base_cfg "rssi_reject_assoc_timeout=$rssi_reject_assoc_timeout" "$N"
-	[ -n "$beacon_rate" ] && append base_cfg "beacon_rate=$beacon_rate" "$N"
-	[ -n "$rlist" ] && append base_cfg "supported_rates=$rlist" "$N"
-	[ -n "$brlist" ] && append base_cfg "basic_rates=$brlist" "$N"
-	append base_cfg "beacon_int=$beacon_int" "$N"
-	[ -n "$rts_threshold" ] && append base_cfg "rts_threshold=$rts_threshold" "$N"
-	[ "$airtime_mode" -gt 0 ] && append base_cfg "airtime_mode=$airtime_mode" "$N"
-	[ -n "$maxassoc" ] && append base_cfg "iface_max_num_sta=$maxassoc" "$N"
-	[ "$mbssid" -gt 0 ] && [ "$mbssid" -le 2 ] && append base_cfg "mbssid=$mbssid" "$N"
-
-	json_get_values opts hostapd_options
-	for val in $opts; do
-		append base_cfg "$val" "$N"
-	done
-
-	cat > "$config" <<EOF
-driver=$driver
-$base_cfg
-EOF
-}
-
-hostapd_common_add_bss_config() {
-	config_add_string 'bssid:macaddr' 'ssid:string'
-	config_add_boolean wds wmm uapsd hidden utf8_ssid ppsk
-
-	config_add_int maxassoc max_inactivity
-	config_add_boolean disassoc_low_ack isolate short_preamble skip_inactivity_poll
-
-	config_add_int \
-		wep_rekey eap_reauth_period \
-		wpa_group_rekey wpa_pair_rekey wpa_master_rekey
-	config_add_boolean wpa_strict_rekey
-	config_add_boolean wpa_disable_eapol_key_retries
-
-	config_add_boolean tdls_prohibit
-
-	config_add_boolean rsn_preauth auth_cache
-	config_add_int ieee80211w
-	config_add_int eapol_version
-
-	config_add_array auth_server acct_server
-	config_add_string 'server:host'
-	config_add_string auth_secret key
-	config_add_int 'auth_port:port' 'port:port'
-
-	config_add_string acct_secret
-	config_add_int acct_port
-	config_add_int acct_interval
-
-	config_add_int bss_load_update_period chan_util_avg_period
-
-	config_add_string dae_client
-	config_add_string dae_secret
-	config_add_int dae_port
-
-	config_add_string nasid
-	config_add_string ownip
-	config_add_string radius_client_addr
-	config_add_string iapp_interface
-	config_add_string eap_type ca_cert client_cert identity anonymous_identity auth priv_key priv_key_pwd
-	config_add_boolean ca_cert_usesystem ca_cert2_usesystem
-	config_add_string subject_match subject_match2
-	config_add_array altsubject_match altsubject_match2
-	config_add_array domain_match domain_match2 domain_suffix_match domain_suffix_match2
-	config_add_string ieee80211w_mgmt_cipher
-
-	config_add_int dynamic_vlan vlan_naming vlan_no_bridge
-	config_add_string vlan_tagged_interface vlan_bridge
-	config_add_string vlan_file
-
-	config_add_string 'key1:wepkey' 'key2:wepkey' 'key3:wepkey' 'key4:wepkey' 'password:wpakey'
-
-	config_add_string wpa_psk_file
-
-	config_add_int multi_ap
-
-	config_add_boolean wps_pushbutton wps_label ext_registrar wps_pbc_in_m1
-	config_add_int wps_ap_setup_locked wps_independent
-	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 wnm_sleep_mode wnm_sleep_mode_no_keys bss_transition mbo
-	config_add_int time_advertisement
-	config_add_string time_zone
-	config_add_string vendor_elements
-
-	config_add_boolean ieee80211k rrm_neighbor_report rrm_beacon_report
-
-	config_add_boolean ftm_responder stationary_ap
-	config_add_string lci civic
-
-	config_add_boolean ieee80211r pmk_r1_push ft_psk_generate_local ft_over_ds
-	config_add_int r0_key_lifetime reassociation_deadline
-	config_add_string mobility_domain r1_key_holder
-	config_add_array r0kh r1kh
-
-	config_add_int ieee80211w_max_timeout ieee80211w_retry_timeout
-
-	config_add_string macfilter 'macfile:file'
-	config_add_array 'maclist:list(macaddr)'
-
-	config_add_array bssid_blacklist
-	config_add_array bssid_whitelist
-
-	config_add_int mcast_rate
-	config_add_array basic_rate
-	config_add_array supported_rates
-
-	config_add_boolean sae_require_mfp
-	config_add_int sae_pwe
-
-	config_add_string 'owe_transition_bssid:macaddr' 'owe_transition_ssid:string'
-	config_add_string owe_transition_ifname
-
-	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 iw_venue_name iw_venue_url
-
-	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_string hs20_t_c_server_url
-
-	config_add_array airtime_sta_weight
-	config_add_int airtime_bss_weight airtime_bss_limit
-
-	config_add_boolean multicast_to_unicast multicast_to_unicast_all proxy_arp per_sta_vif
-
-	config_add_array hostapd_bss_options
-	config_add_boolean default_disabled
-
-	config_add_boolean request_cui
-	config_add_array radius_auth_req_attr
-	config_add_array radius_acct_req_attr
-
-	config_add_int eap_server
-	config_add_string eap_user_file ca_cert server_cert private_key private_key_passwd server_id
-
-	config_add_boolean fils
-	config_add_string fils_dhcp
-
-	config_add_int ocv
-
-	config_add_int disable_eht
-	config_add_int disable_he
-	config_add_int disable_vht
-	config_add_int disable_ht
-
-	config_add_boolean beacon_prot interworking
-
-	config_add_int unsol_bcast_probe_resp_interval
-	config_add_int fils_discovery_min_interval
-	config_add_int fils_discovery_max_interval
-	config_add_boolean rnr
-
-	config_add_array sae_groups
-	config_add_array owe_groups
-	config_add_array pairwise
-	config_add_string group_cipher
-	config_add_string group_mgmt_cipher
-
-	config_add_int assoc_phy
-	config_add_int mld_id mld_assoc_phy mld_allowed_phy_bitmap mld_allowed_links
-	config_add_boolean mld_primary mld_single_link
-	config_add_string mld_addr
-}
-
-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_iw_venue_name() {
-	[ -n "$1" ] && append bss_conf "venue_name=$1" "$N"
-}
-
-append_iw_venue_url() {
-	[ -n "$1" ] && append bss_conf "venue_url=$1" "$N"
-}
-
-append_hs20_oper_friendly_name() {
-	append bss_conf "hs20_oper_friendly_name=$1" "$N"
-}
-
-append_osu_provider_friendly_name() {
-	append bss_conf "osu_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_friendly_name append_osu_friendly_name
-	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_radius_acct_req_attr() {
-	[ -n "$1" ] && append bss_conf "radius_acct_req_attr=$1" "$N"
-}
-
-append_radius_auth_req_attr() {
-	[ -n "$1" ] && append bss_conf "radius_auth_req_attr=$1" "$N"
-}
-
-append_airtime_sta_weight() {
-	[ -n "$1" ] && append bss_conf "airtime_sta_weight=$1" "$N"
-}
-
-append_auth_server() {
-	[ -n "$1" ] || return
-	append bss_conf "auth_server_addr=$1" "$N"
-	append bss_conf "auth_server_port=$auth_port" "$N"
-	[ -n "$auth_secret" ] && append bss_conf "auth_server_shared_secret=$auth_secret" "$N"
-}
-
-append_acct_server() {
-	[ -n "$1" ] || return
-	append bss_conf "acct_server_addr=$1" "$N"
-	append bss_conf "acct_server_port=$acct_port" "$N"
-	[ -n "$acct_secret" ] && append bss_conf "acct_server_shared_secret=$acct_secret" "$N"
-}
-
-hostapd_set_bss_options() {
-	local var="$1"
-	local phy="$2"
-	local vif="$3"
-
-	wireless_vif_parse_encryption
-
-	local bss_conf bss_md5sum ft_key
-	local wep_rekey wpa_group_rekey wpa_pair_rekey wpa_master_rekey wpa_key_mgmt
-
-	json_get_vars \
-		wep_rekey wpa_group_rekey wpa_pair_rekey wpa_master_rekey wpa_strict_rekey \
-		wpa_disable_eapol_key_retries tdls_prohibit \
-		maxassoc max_inactivity disassoc_low_ack isolate auth_cache \
-		wps_pushbutton wps_label ext_registrar wps_pbc_in_m1 wps_ap_setup_locked \
-		wps_independent wps_device_type wps_device_name wps_manufacturer wps_pin \
-		macfilter ssid utf8_ssid wmm uapsd hidden short_preamble rsn_preauth \
-		iapp_interface eapol_version dynamic_vlan ieee80211w nasid \
-		acct_secret acct_port acct_interval \
-		bss_load_update_period chan_util_avg_period sae_require_mfp sae_pwe \
-		multi_ap multi_ap_backhaul_ssid multi_ap_backhaul_key skip_inactivity_poll \
-		ppsk airtime_bss_weight airtime_bss_limit airtime_sta_weight \
-		multicast_to_unicast_all proxy_arp per_sta_vif \
-		eap_server eap_user_file ca_cert server_cert private_key private_key_passwd server_id \
-		vendor_elements fils ocv unsol_bcast_probe_resp_interval fils_discovery_min_interval \
-		fils_discovery_max_interval rnr group_cipher group_mgmt_cipher \
-		mld_id mld_primary mld_addr mld_allowed_links
-
-	set_default fils 0
-	set_default isolate 0
-	set_default maxassoc 0
-	set_default max_inactivity 0
-	set_default short_preamble 1
-	set_default disassoc_low_ack 1
-	set_default skip_inactivity_poll 0
-	set_default hidden 0
-	set_default wmm 1
-	set_default uapsd 1
-	set_default wpa_disable_eapol_key_retries 0
-	set_default tdls_prohibit 0
-	set_default eapol_version $((wpa & 1))
-	set_default acct_port 1813
-	set_default bss_load_update_period 60
-	set_default chan_util_avg_period 600
-	set_default utf8_ssid 1
-	set_default multi_ap 0
-	set_default ppsk 0
-	set_default airtime_bss_weight 0
-	set_default airtime_bss_limit 0
-	set_default eap_server 0
-
-	/usr/sbin/hostapd -vfils || fils=0
-
-	if [ -z $mld_id ] || [ "$mld_primary" = "1" ]; then
-		append bss_conf "ctrl_interface=/var/run/hostapd"
-	fi
-
-	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"
-	fi
-	if [ "$max_inactivity" -gt 0 ]; then
-		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"
-	json_for_each_item append_airtime_sta_weight airtime_sta_weight
-
-	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"
-	append bss_conf "skip_inactivity_poll=$skip_inactivity_poll" "$N"
-	append bss_conf "preamble=$short_preamble" "$N"
-	append bss_conf "wmm_enabled=$wmm" "$N"
-	append bss_conf "ignore_broadcast_ssid=$hidden" "$N"
-	append bss_conf "uapsd_advertisement_enabled=$uapsd" "$N"
-	append bss_conf "utf8_ssid=$utf8_ssid" "$N"
-	append bss_conf "multi_ap=$multi_ap" "$N"
-	[ -n "$vendor_elements" ] && append bss_conf "vendor_elements=$vendor_elements" "$N"
-
-	[ "$tdls_prohibit" -gt 0 ] && append bss_conf "tdls_prohibit=$tdls_prohibit" "$N"
-
-	[ "$wpa" -gt 0 ] && {
-		[ -n "$wpa_group_rekey"  ] && append bss_conf "wpa_group_rekey=$wpa_group_rekey" "$N"
-		[ -n "$wpa_pair_rekey"   ] && append bss_conf "wpa_ptk_rekey=$wpa_pair_rekey"    "$N"
-		[ -n "$wpa_master_rekey" ] && append bss_conf "wpa_gmk_rekey=$wpa_master_rekey"  "$N"
-		[ -n "$wpa_strict_rekey" ] && append bss_conf "wpa_strict_rekey=$wpa_strict_rekey" "$N"
-	}
-
-	[ -n "$nasid" ] && append bss_conf "nas_identifier=$nasid" "$N"
-
-	[ -n "$acct_interval" ] && \
-		append bss_conf "radius_acct_interim_interval=$acct_interval" "$N"
-	json_for_each_item append_acct_server acct_server
-	json_for_each_item append_radius_acct_req_attr radius_acct_req_attr
-
-	[ -n "$ocv" ] && append bss_conf "ocv=$ocv" "$N"
-
-	case "$auth_type" in
-		sae|owe|eap2|eap192)
-			set_default ieee80211w 2
-			set_default sae_require_mfp 1
-			set_default sae_pwe 2
-		;;
-		psk-sae|eap-eap2)
-			set_default ieee80211w 1
-			set_default sae_require_mfp 1
-			set_default sae_pwe 2
-		;;
-	esac
-	[ -n "$sae_require_mfp" ] && append bss_conf "sae_require_mfp=$sae_require_mfp" "$N"
-	[ -n "$sae_pwe" ] && append bss_conf "sae_pwe=$sae_pwe" "$N"
-
-	local vlan_possible=""
-
-	case "$auth_type" in
-		none|owe)
-			json_get_vars owe_transition_bssid owe_transition_ssid owe_transition_ifname
-
-			[ -n "$owe_transition_ssid" ] && append bss_conf "owe_transition_ssid=\"$owe_transition_ssid\"" "$N"
-			[ -n "$owe_transition_bssid" ] && append bss_conf "owe_transition_bssid=$owe_transition_bssid" "$N"
-			[ -n "$owe_transition_ifname" ] && append bss_conf "owe_transition_ifname=$owe_transition_ifname" "$N"
-
-			wps_possible=1
-			# Here we make the assumption that if we're in open mode
-			# with WPS enabled, we got to be in unconfigured state.
-			wps_not_configured=1
-		;;
-		psk|sae|psk-sae)
-			json_get_vars key wpa_psk_file
-			if [ "$auth_type" = "psk" ] && [ "$ppsk" -ne 0 ] ; then
-				json_get_vars auth_secret auth_port
-				set_default auth_port 1812
-				json_for_each_item append_auth_server auth_server
-				append bss_conf "macaddr_acl=2" "$N"
-				append bss_conf "wpa_psk_radius=2" "$N"
-			elif [ ${#key} -eq 64 ]; then
-				append bss_conf "wpa_psk=$key" "$N"
-			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|eap2|eap-eap2|eap192)
-			json_get_vars \
-				auth_server auth_secret auth_port \
-				dae_client dae_secret dae_port \
-				dynamic_ownip ownip radius_client_addr \
-				eap_reauth_period request_cui \
-				erp_domain mobility_domain \
-				fils_realm fils_dhcp
-
-			# radius can provide VLAN ID for clients
-			vlan_possible=1
-
-			set_default dynamic_ownip 1
-
-			# legacy compatibility
-			[ -n "$auth_server" ] || json_get_var auth_server server
-			[ -n "$auth_port" ] || json_get_var auth_port port
-			[ -n "$auth_secret" ] || json_get_var auth_secret key
-
-			[ "$fils" -gt 0 ] && {
-				set_default erp_domain "$mobility_domain"
-				set_default erp_domain "$(echo "$ssid" | md5sum | head -c 8)"
-				set_default fils_realm "$erp_domain"
-
-				append bss_conf "erp_send_reauth_start=1" "$N"
-				append bss_conf "erp_domain=$erp_domain" "$N"
-				append bss_conf "fils_realm=$fils_realm" "$N"
-				append bss_conf "fils_cache_id=$(echo "$fils_realm" | md5sum | head -c 4)" "$N"
-
-				[ "$fils_dhcp" = "*" ] && {
-					json_get_values network network
-					fils_dhcp=
-					for net in $network; do
-						fils_dhcp="$(ifstatus "$net" | jsonfilter -e '@.data.dhcpserver')"
-						[ -n "$fils_dhcp" ] && break
-					done
-
-					[ -z "$fils_dhcp" -a -n "$network_bridge" -a -n "$network_ifname" ] && \
-						fils_dhcp="$(udhcpc -B -n -q -s /lib/netifd/dhcp-get-server.sh -t 1 -i "$network_ifname" 2>/dev/null)"
-				}
-				[ -n "$fils_dhcp" ] && append bss_conf "dhcp_server=$fils_dhcp" "$N"
-			}
-
-			set_default auth_port 1812
-			set_default dae_port 3799
-			set_default request_cui 0
-
-			[ "$eap_server" -eq 0 ] && json_for_each_item append_auth_server auth_server
-			[ "$request_cui" -gt 0 ] && append bss_conf "radius_request_cui=$request_cui" "$N"
-			[ -n "$eap_reauth_period" ] && append bss_conf "eap_reauth_period=$eap_reauth_period" "$N"
-
-			[ -n "$dae_client" -a -n "$dae_secret" ] && {
-				append bss_conf "radius_das_port=$dae_port" "$N"
-				append bss_conf "radius_das_client=$dae_client $dae_secret" "$N"
-			}
-			json_for_each_item append_radius_auth_req_attr radius_auth_req_attr
-
-			if [ -n "$ownip" ]; then
-				append bss_conf "own_ip_addr=$ownip" "$N"
-			elif [ "$dynamic_ownip" -gt 0 ]; then
-				append bss_conf "dynamic_own_ip_addr=$dynamic_ownip" "$N"
-			fi
-
-			[ -n "$radius_client_addr" ] && append bss_conf "radius_client_addr=$radius_client_addr" "$N"
-			append bss_conf "eapol_key_index_workaround=1" "$N"
-			append bss_conf "ieee8021x=1" "$N"
-
-			[ "$eapol_version" -ge "1" -a "$eapol_version" -le "2" ] && append bss_conf "eapol_version=$eapol_version" "$N"
-		;;
-		wep)
-			local wep_keyidx=0
-			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
-
-	case "$auth_type" in
-		none|owe|psk|sae|psk-sae|wep)
-			json_get_vars \
-			auth_server auth_port auth_secret \
-			ownip radius_client_addr
-
-			[ -n "$auth_server" ] &&  {
-				set_default auth_port 1812
-
-				json_for_each_item append_auth_server auth_server
-				[ -n "$ownip" ] && append bss_conf "own_ip_addr=$ownip" "$N"
-				[ -n "$radius_client_addr" ] && append bss_conf "radius_client_addr=$radius_client_addr" "$N"
-				append bss_conf "macaddr_acl=2" "$N"
-			}
-		;;
-	esac
-
-	local auth_algs="$((($auth_mode_shared << 1) | $auth_mode_open))"
-	append bss_conf "auth_algs=${auth_algs:-1}" "$N"
-	append bss_conf "wpa=$wpa" "$N"
-
-	json_get_values pairwise pairwise
-	json_get_vars group_cipher
-	if [ -n "$pairwise" ]; then
-		case "$pairwise" in
-			*tkip+aes|*tkip+ccmp|*aes+tkip|*ccmp+tkip)
-				wpa_cipher="CCMP TKIP"
-			;;
-			*ccmp256)
-				wpa_cipher="CCMP-256"
-			;;
-			*aes|*ccmp)
-				wpa_cipher="CCMP"
-			;;
-			*tkip)
-				wpa_cipher="TKIP"
-			;;
-			*gcmp256)
-				wpa_cipher="GCMP-256"
-			;;
-			*gcmp)
-				wpa_cipher="GCMP"
-			;;
-			*)
-				wpa_cipher=""
-			;;
-		esac
-	fi
-	[ -n "$wpa_cipher" ] && wpa_pairwise="$wpa_cipher"
-
-	[ -n "$wpa_pairwise" ] && append bss_conf "wpa_pairwise=$wpa_pairwise" "$N"
-
-	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
-	[ "$wps_label" -gt 0 ] && append config_methods label
-
-	# WPS not possible on Multi-AP backhaul-only SSID
-	[ "$multi_ap" = 1 ] && wps_possible=
-
-	[ -n "$wps_possible" -a -n "$config_methods" ] && {
-		set_default ext_registrar 0
-		set_default wps_device_type "6-0050F204-1"
-		set_default wps_device_name "OpenWrt AP"
-		set_default wps_manufacturer "www.openwrt.org"
-		set_default wps_independent 1
-
-		wps_state=2
-		[ -n "$wps_not_configured" ] && wps_state=1
-
-		[ "$ext_registrar" -gt 0 -a -n "$network_bridge" ] && append bss_conf "upnp_iface=$network_bridge" "$N"
-
-		append bss_conf "eap_server=1" "$N"
-		[ -n "$wps_pin" ] && append bss_conf "ap_pin=$wps_pin" "$N"
-		append bss_conf "wps_state=$wps_state" "$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"
-		append bss_conf "wps_independent=$wps_independent" "$N"
-		[ -n "$wps_ap_setup_locked" ] && append bss_conf "ap_setup_locked=$wps_ap_setup_locked" "$N"
-		[ "$wps_pbc_in_m1" -gt 0 ] && append bss_conf "pbc_in_m1=$wps_pbc_in_m1" "$N"
-		[ "$multi_ap" -gt 0 ] && [ -n "$multi_ap_backhaul_ssid" ] && {
-			append bss_conf "multi_ap_backhaul_ssid=\"$multi_ap_backhaul_ssid\"" "$N"
-			if [ -z "$multi_ap_backhaul_key" ]; then
-				:
-			elif [ ${#multi_ap_backhaul_key} -lt 8 ]; then
-				wireless_setup_vif_failed INVALID_WPA_PSK
-				return 1
-			elif [ ${#multi_ap_backhaul_key} -eq 64 ]; then
-				append bss_conf "multi_ap_backhaul_wpa_psk=$multi_ap_backhaul_key" "$N"
-			else
-				append bss_conf "multi_ap_backhaul_wpa_passphrase=$multi_ap_backhaul_key" "$N"
-			fi
-		}
-	}
-
-	append bss_conf "ssid=$ssid" "$N"
-	[ -n "$network_bridge" ] && append bss_conf "bridge=$network_bridge${N}wds_bridge=$network_bridge" "$N"
-	[ -n "$network_ifname" ] && append bss_conf "snoop_iface=$network_ifname" "$N"
-	[ -n "$iapp_interface" ] && {
-		local ifname
-		network_get_device ifname "$iapp_interface" || ifname="$iapp_interface"
-		append bss_conf "iapp_interface=$ifname" "$N"
-	}
-
-	json_get_vars time_advertisement time_zone wnm_sleep_mode wnm_sleep_mode_no_keys bss_transition mbo
-	set_default bss_transition 0
-	set_default wnm_sleep_mode 0
-	set_default wnm_sleep_mode_no_keys 0
-	set_default mbo 0
-
-	[ -n "$time_advertisement" ] && append bss_conf "time_advertisement=$time_advertisement" "$N"
-	[ -n "$time_zone" ] && append bss_conf "time_zone=$time_zone" "$N"
-	if [ "$wnm_sleep_mode" -eq "1" ]; then
-		append bss_conf "wnm_sleep_mode=1" "$N"
-		[ "$wnm_sleep_mode_no_keys" -eq "1" ] && append bss_conf "wnm_sleep_mode_no_keys=1" "$N"
-	fi
-	[ "$bss_transition" -eq "1" ] && append bss_conf "bss_transition=1" "$N"
-	[ "$mbo" -eq 1 ] && append bss_conf "mbo=1" "$N"
-
-	json_get_vars ieee80211k rrm_neighbor_report rrm_beacon_report rnr
-	set_default ieee80211k 0
-	set_default rnr 0
-	if [ "$ieee80211k" -eq "1" ]; then
-		set_default rrm_neighbor_report 1
-		set_default rrm_beacon_report 1
-	else
-		set_default rrm_neighbor_report 0
-		set_default rrm_beacon_report 0
-	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"
-	[ "$rnr" -eq "1" ] && append bss_conf "rnr=1" "$N"
-
-	json_get_vars ftm_responder stationary_ap lci civic
-	set_default ftm_responder 0
-	if [ "$ftm_responder" -eq "1" ]; then
-		set_default stationary_ap 0
-		iw phy "$phy" info | grep -q "ENABLE_FTM_RESPONDER" && {
-			append bss_conf "ftm_responder=1" "$N"
-			[ "$stationary_ap" -eq "1" ] && append bss_conf "stationary_ap=1" "$N"
-			[ -n "$lci" ] && append bss_conf "lci=$lci" "$N"
-			[ -n "$civic" ] && append bss_conf "civic=$civic" "$N"
-		}
-	fi
-
-	if [ "$wpa" -ge "1" ]; then
-		json_get_vars ieee80211r
-		set_default ieee80211r 0
-
-		if [ "$ieee80211r" -gt "0" ]; then
-			json_get_vars mobility_domain ft_psk_generate_local ft_over_ds reassociation_deadline
-
-			set_default mobility_domain "$(echo "$ssid" | md5sum | head -c 4)"
-			set_default ft_over_ds 0
-			set_default reassociation_deadline 1000
-
-			case "$auth_type" in
-				psk|sae|psk-sae)
-					set_default ft_psk_generate_local 1
-				;;
-				*)
-					set_default ft_psk_generate_local 0
-				;;
-			esac
-
-			[ -n "$network_ifname" ] && append bss_conf "ft_iface=$network_ifname" "$N"
-			append bss_conf "mobility_domain=$mobility_domain" "$N"
-			append bss_conf "ft_psk_generate_local=$ft_psk_generate_local" "$N"
-			append bss_conf "ft_over_ds=$ft_over_ds" "$N"
-			append bss_conf "reassociation_deadline=$reassociation_deadline" "$N"
-
-			if [ "$ft_psk_generate_local" -eq "0" ]; then
-				json_get_vars r0_key_lifetime r1_key_holder pmk_r1_push
-				json_get_values r0kh r0kh
-				json_get_values r1kh r1kh
-
-				set_default r0_key_lifetime 10000
-				set_default pmk_r1_push 0
-
-				[ -n "$r0kh" -a -n "$r1kh" ] || {
-					ft_key=`echo -n "$mobility_domain/${auth_secret:-${key}}" | md5sum | awk '{print $1}'`
-
-					set_default r0kh "ff:ff:ff:ff:ff:ff,*,$ft_key"
-					set_default r1kh "00:00:00:00:00:00,00:00:00:00:00:00,$ft_key"
-				}
-
-				[ -n "$r1_key_holder" ] && append bss_conf "r1_key_holder=$r1_key_holder" "$N"
-				append bss_conf "r0_key_lifetime=$r0_key_lifetime" "$N"
-				append bss_conf "pmk_r1_push=$pmk_r1_push" "$N"
-
-				for kh in $r0kh; do
-					append bss_conf "r0kh=${kh//,/ }" "$N"
-				done
-				for kh in $r1kh; do
-					append bss_conf "r1kh=${kh//,/ }" "$N"
-				done
-			fi
-		fi
-		if [ "$fils" -gt 0 ]; then
-			json_get_vars fils_realm
-			set_default fils_realm "$(echo "$ssid" | md5sum | head -c 8)"
-		fi
-
-		append bss_conf "wpa_disable_eapol_key_retries=$wpa_disable_eapol_key_retries" "$N"
-
-		hostapd_append_wpa_key_mgmt
-		[ -n "$wpa_key_mgmt" ] && append bss_conf "wpa_key_mgmt=$wpa_key_mgmt" "$N"
-	fi
-
-	if [ "$wpa" -ge "2" ]; then
-		json_get_values sae_groups sae_groups
-		json_get_values owe_groups owe_groups
-		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=$network_bridge" "$N"
-		else
-			case "$auth_type" in
-			sae|psk-sae|owe)
-				set_default auth_cache 1
-			;;
-			*)
-				set_default auth_cache 0
-			;;
-			esac
-		fi
-
-		append bss_conf "okc=$auth_cache" "$N"
-		[ "$auth_cache" = 0 -a "$fils" = 0 ] && append bss_conf "disable_pmksa_caching=1" "$N"
-
-		[ -z "$group_cipher" ] && group_cipher="$wpa_cipher"
-
-		if [ -n "$sae_groups" -o -n "$owe_groups" ]; then
-			case "$auth_type" in
-			sae*)
-				append bss_conf "sae_groups=$sae_groups" "$N"
-				append bss_conf "group_cipher=$group_cipher" "$N"
-			;;
-			owe)
-				append bss_conf "owe_groups=$owe_groups" "$N"
-				append bss_conf "group_cipher=$group_cipher" "$N"
-			;;
-			esac
-		fi
-
-		# RSN -> allow management frame protection
-		case "$ieee80211w" in
-			[012])
-				json_get_vars ieee80211w_mgmt_cipher ieee80211w_max_timeout ieee80211w_retry_timeout beacon_prot
-				append bss_conf "ieee80211w=$ieee80211w" "$N"
-				[ "$ieee80211w" -gt "0" ] && {
-					if [ -z "$group_mgmt_cipher" ]; then
-						case "$group_cipher" in
-						CCMP-256)
-							ieee80211w_mgmt_cipher="BIP-CMAC-256"
-						;;
-						CCMP)
-							ieee80211w_mgmt_cipher="AES-128-CMAC"
-						;;
-						GCMP-256)
-							ieee80211w_mgmt_cipher="BIP-GMAC-256"
-						;;
-						GCMP)
-							ieee80211w_mgmt_cipher="BIP-GMAC-128"
-						;;
-						esac
-					else
-						ieee80211w_mgmt_cipher="$group_mgmt_cipher"
-					fi
-					if [ "$auth_type" = "eap192" ]; then
-						append bss_conf "group_mgmt_cipher=BIP-GMAC-256" "$N"
-					else
-						append bss_conf "group_mgmt_cipher=${ieee80211w_mgmt_cipher:-AES-128-CMAC}" "$N"
-					fi
-					[ -n "$beacon_prot" ] && \
-						append bss_conf "beacon_prot=$beacon_prot" "$N"
-					[ -n "$ieee80211w_max_timeout" ] && \
-						append bss_conf "assoc_sa_query_max_timeout=$ieee80211w_max_timeout" "$N"
-					[ -n "$ieee80211w_retry_timeout" ] && \
-						append bss_conf "assoc_sa_query_retry_timeout=$ieee80211w_retry_timeout" "$N"
-				}
-			;;
-		esac
-	fi
-
-	_macfile="/var/run/hostapd-$ifname.maclist"
-	case "$macfilter" in
-		allow)
-			append bss_conf "macaddr_acl=1" "$N"
-			append bss_conf "accept_mac_file=$_macfile" "$N"
-			# accept_mac_file can be used to set MAC to VLAN ID mapping
-			vlan_possible=1
-		;;
-		deny)
-			append bss_conf "macaddr_acl=0" "$N"
-			append bss_conf "deny_mac_file=$_macfile" "$N"
-		;;
-		*)
-			_macfile=""
-		;;
-	esac
-
-	[ -n "$_macfile" ] && {
-		json_get_vars macfile
-		json_get_values maclist maclist
-
-		rm -f "$_macfile"
-		(
-			for mac in $maclist; do
-				echo "$mac"
-			done
-			[ -n "$macfile" -a -f "$macfile" ] && cat "$macfile"
-		) > "$_macfile"
-	}
-
-	[ -n "$vlan_possible" -a -n "$dynamic_vlan" ] && {
-		json_get_vars vlan_naming vlan_tagged_interface vlan_bridge vlan_file vlan_no_bridge
-		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"
-		if [ -n "$vlan_bridge" ]; then
-			append bss_conf "vlan_bridge=$vlan_bridge" "$N"
-		else
-			set_default vlan_no_bridge 1
-		fi
-		append bss_conf "vlan_no_bridge=$vlan_no_bridge" "$N"
-		[ -n "$vlan_tagged_interface" ] && \
-			append bss_conf "vlan_tagged_interface=$vlan_tagged_interface" "$N"
-		[ -n "$vlan_file" ] && {
-			[ -e "$vlan_file" ] || touch "$vlan_file"
-			append bss_conf "vlan_file=$vlan_file" "$N"
-		}
-	}
-
-	json_get_vars iw_enabled iw_internet iw_asra iw_esr iw_uesa iw_access_network_type
-	json_get_vars iw_hessid iw_venue_group iw_venue_type iw_network_auth_type
-	json_get_vars iw_roaming_consortium iw_domain_name iw_anqp_3gpp_cell_net iw_nai_realm
-	json_get_vars iw_anqp_elem iw_qos_map_set iw_ipaddr_type_availability iw_gas_address3
-	json_get_vars iw_venue_name iw_venue_url
-	json_get_vars interworking
-
-	set_default iw_enabled 0
-	if [ "$iw_enabled" = "1" ] || [ "$interworking" = "1" ]; then
-		append bss_conf "interworking=1" "$N"
-		set_default iw_internet 1
-		set_default iw_asra 0
-		set_default iw_esr 0
-		set_default iw_uesa 0
-
-		append bss_conf "internet=$iw_internet" "$N"
-		append bss_conf "asra=$iw_asra" "$N"
-		append bss_conf "esr=$iw_esr" "$N"
-		append bss_conf "uesa=$iw_uesa" "$N"
-
-		[ -n "$iw_access_network_type" ] && \
-			append bss_conf "access_network_type=$iw_access_network_type" "$N"
-		[ -n "$iw_hessid" ] && append bss_conf "hessid=$iw_hessid" "$N"
-		[ -n "$iw_venue_group" ] && \
-			append bss_conf "venue_group=$iw_venue_group" "$N"
-		[ -n "$iw_venue_type" ] && append bss_conf "venue_type=$iw_venue_type" "$N"
-		[ -n "$iw_network_auth_type" ] && \
-			append bss_conf "network_auth_type=$iw_network_auth_type" "$N"
-		[ -n "$iw_gas_address3" ] && append bss_conf "gas_address3=$iw_gas_address3" "$N"
-
-		json_for_each_item append_iw_roaming_consortium iw_roaming_consortium
-		json_for_each_item append_iw_anqp_elem iw_anqp_elem
-		json_for_each_item append_iw_nai_realm iw_nai_realm
-		json_for_each_item append_iw_venue_name iw_venue_name
-		json_for_each_item append_iw_venue_url iw_venue_url
-
-		iw_domain_name_conf=
-		json_for_each_item append_iw_domain_name iw_domain_name
-		[ -n "$iw_domain_name_conf" ] && \
-			append bss_conf "domain_name=$iw_domain_name_conf" "$N"
-
-		iw_anqp_3gpp_cell_net_conf=
-		json_for_each_item append_iw_anqp_3gpp_cell_net iw_anqp_3gpp_cell_net
-		[ -n "$iw_anqp_3gpp_cell_net_conf" ] && \
-			append bss_conf "anqp_3gpp_cell_net=$iw_anqp_3gpp_cell_net_conf" "$N"
-	fi
-
-	set_default iw_qos_map_set 0,0,2,16,1,1,255,255,18,22,24,38,40,40,44,46,48,56
-	case "$iw_qos_map_set" in
-		*,*);;
-		*) iw_qos_map_set="";;
-	esac
-	[ -n "$iw_qos_map_set" ] && append bss_conf "qos_map_set=$iw_qos_map_set" "$N"
-
-	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 \
-		hs20_t_c_server_url
-	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 \
-		hs20_t_c_server_url
-
-	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"
-		[ -n "$hs20_t_c_server_url" ] && append bss_conf "hs20_t_c_server_url=$hs20_t_c_server_url" "$N"
-		json_for_each_item append_hs20_oper_friendly_name hs20_oper_friendly_name
-		json_for_each_item append_hs20_conn_capab hs20_conn_capab
-		json_for_each_item append_osu_provider osu_provider
-		json_for_each_item append_operator_icon operator_icon
-	fi
-
-	if [ "$eap_server" = "1" ]; then
-		append bss_conf "eap_server=1" "$N"
-		append bss_conf "eap_server_erp=1" "$N"
-		[ -n "$eap_user_file" ] && append bss_conf "eap_user_file=$eap_user_file" "$N"
-		[ -n "$ca_cert" ] && append bss_conf "ca_cert=$ca_cert" "$N"
-		[ -n "$server_cert" ] && append bss_conf "server_cert=$server_cert" "$N"
-		[ -n "$private_key" ] && append bss_conf "private_key=$private_key" "$N"
-		[ -n "$private_key_passwd" ] && append bss_conf "private_key_passwd=$private_key_passwd" "$N"
-		[ -n "$server_id" ] && append bss_conf "server_id=$server_id" "$N"
-	fi
-
-	set_default multicast_to_unicast_all 0
-	if [ "$multicast_to_unicast_all" -gt 0 ]; then
-		append bss_conf "multicast_to_unicast=$multicast_to_unicast_all" "$N"
-	fi
-	set_default proxy_arp 0
-	if [ "$proxy_arp" -gt 0 ]; then
-		append bss_conf "proxy_arp=$proxy_arp" "$N"
-	fi
-
-	set_default per_sta_vif 0
-	if [ "$per_sta_vif" -gt 0 ]; then
-		append bss_conf "per_sta_vif=$per_sta_vif" "$N"
-	fi
-
-	json_get_values opts hostapd_bss_options
-	for val in $opts; do
-		append bss_conf "$val" "$N"
-	done
-
-	if [ "$unsol_bcast_probe_resp_interval" -gt 0 ]; then
-		append bss_conf "unsol_bcast_probe_resp_interval=$unsol_bcast_probe_resp_interval" "$N"
-	fi
-
-	if [ -n "$fils_discovery_min_interval" ]; then
-		append bss_conf "fils_discovery_min_interval=$fils_discovery_min_interval" "$N"
-	fi
-
-	if [ -n "$fils_discovery_max_interval" ]; then
-		append bss_conf "fils_discovery_max_interval=$fils_discovery_max_interval" "$N"
-	fi
-
-	if [ -n "$rnr" ]; then
-		append bss_conf "rnr=$rnr" "$N"
-	fi
-
-	if [ -n "$mld_id" ]; then
-		if !([ "$mld_id" -ge 0 ] && [ "$mld_id" -le 255 ]); then
-			echo "Invalid mld_id: ${mld_id}"
-			return 1
-		fi
-		append bss_conf "mld_ap=1" "$N"
-		if [ -n "$mld_addr" ]; then
-			append bss_conf "mld_addr=$mld_addr" "$N"
-		fi
-	fi
-
-	if [ "$mld_primary" -gt 0 ]; then
-		append bss_conf "mld_primary=${mld_primary}" "$N"
-	fi
-
-	if [ "$mld_allowed_links" -gt 0 ]; then
-		append bss_conf "mld_allowed_links=${mld_allowed_links}" "$N"
-	fi
-
-	append "$var" "$bss_conf" "$N"
-	return 0
-}
-
-hostapd_set_log_options() {
-	local var="$1"
-
-	local log_level log_80211 log_8021x log_radius log_wpa log_driver log_iapp log_mlme
-	json_get_vars log_level log_80211 log_8021x log_radius log_wpa log_driver log_iapp log_mlme
-
-	set_default log_level 2
-	set_default log_80211  1
-	set_default log_8021x  1
-	set_default log_radius 1
-	set_default log_wpa    1
-	set_default log_driver 1
-	set_default log_iapp   1
-	set_default log_mlme   1
-
-	local log_mask="$(( \
-		($log_80211  << 0) | \
-		($log_8021x  << 1) | \
-		($log_radius << 2) | \
-		($log_wpa    << 3) | \
-		($log_driver << 4) | \
-		($log_iapp   << 5) | \
-		($log_mlme   << 6)   \
-	))"
-
-	append "$var" "logger_syslog=$log_mask" "$N"
-	append "$var" "logger_syslog_level=$log_level" "$N"
-	append "$var" "logger_stdout=$log_mask" "$N"
-	append "$var" "logger_stdout_level=$log_level" "$N"
-
-	return 0
-}
-
-_wpa_supplicant_common() {
-	local ifname="$1"
-
-	_rpath="/var/run/wpa_supplicant"
-	_config="${_rpath}-$ifname.conf"
-}
-
-wpa_supplicant_teardown_interface() {
-	_wpa_supplicant_common "$1"
-	rm -rf "$_rpath/$1" "$_config"
-}
-
-wpa_supplicant_prepare_interface() {
-	local ifname="$1"
-	_w_driver="$2"
-
-	_wpa_supplicant_common "$1"
-
-	json_get_vars mode wds multi_ap assoc_phy mld_single_link mld_assoc_phy mld_allowed_phy_bitmap
-	set_default mld_allowed_phy_bitmap 0
-
-	[ -n "$network_bridge" ] && {
-		fail=
-		case "$mode" in
-			adhoc)
-				fail=1
-			;;
-			sta)
-				[ "$wds" = 1 -o "$multi_ap" = 1 ] || fail=1
-			;;
-		esac
-
-		[ -n "$fail" ] && {
-			wireless_setup_vif_failed BRIDGE_NOT_ALLOWED
-			return 1
-		}
-	}
-
-	local ap_scan=
-
-	_w_mode="$mode"
-
-	[ "$mode" = adhoc ] && {
-		ap_scan="ap_scan=2"
-	}
-
-	local country_str=
-	[ -n "$country" ] && {
-		country_str="country=$country"
-	}
-
-	local mld_force_single_link=
-	[ -n "$mld_single_link" ] && {
-		mld_force_single_link=$mld_single_link
-	}
-
-	if !([ "$mld_allowed_phy_bitmap" -ge 0 ] && [ "$mld_allowed_phy_bitmap" -le 7 ]); then
-		echo "Error: Invalid MLD allowed phy: ${mld_allowed_phy_bitmap}"
-		return 1
-	fi
-
-	local phy0_scan_list="2412 2417 2422 2427 2432 2437 2442 2447 2452 2457 2462 2467 2472"
-	local phy1_scan_list="5180 5200 5220 5240 5260 5280 5300 5320 5500 5520 5540 5560 5580 5600 5620 5640 5660 5680 5700 5720 5745 5765 5785 5805 5825 5845 5865 5885"
-	local phy2_scan_list="5955 5975 5995 6015 6035 6055 6075 6095 6115 6135 6155 6175 6195 6215 6235 6255 6275 6295 6315 6335 6355 6375 6395 6415 6435 6455 6475 6495 6515 6535 6555 6575 6595 6615 6635 6655 6675 6695 6715 6735 6755 6775 6795 6815 6835 6855 6875 6895"
-	local scan_list=
-	if [ $mld_allowed_phy_bitmap -gt 0 ] && [ $mld_allowed_phy_bitmap -lt 7 ]; then
-		[ $(($mld_allowed_phy_bitmap & 1)) -ne 0 ] && {
-			scan_list="$scan_list $phy0_scan_list"
-		}
-
-		[ $(($mld_allowed_phy_bitmap & 2)) -ne 0 ] && {
-			scan_list="$scan_list $phy1_scan_list"
-		}
-
-		[ $(($mld_allowed_phy_bitmap & 4)) -ne 0 ] && {
-			scan_list="$scan_list $phy2_scan_list"
-		}
-	elif [ "$mld_allowed_phy_bitmap" -eq 0 ]; then
-		# For Legacy STA
-		if [ "$phy" = "phy0" ]; then
-			scan_list="$phy0_scan_list"
-		elif [ "$phy" = "phy1" ]; then
-			scan_list="$phy1_scan_list"
-		elif [ "$phy" = "phy2" ]; then
-			scan_list="$phy2_scan_list"
-		fi
-	fi
-
-	[ -n "$assoc_phy" ] && mld_assoc_phy=$assoc_phy
-
-	local mld_connect_band_pref=
-	if [ -n "$mld_assoc_phy" ]; then
-		if [ $(($mld_allowed_phy_bitmap & $((1<<$mld_assoc_phy)))) -eq 0 ]; then
-			echo "Error: Conflict between preferred association phy and allowed phy"
-			return 1
-		fi
-
-		mld_connect_band_pref=$(($mld_assoc_phy+1))
-	fi
-
-	local tx_queue_data2_burst="tx_queue_data2_burst=0"
-	multiap_flag_file="${_config}.is_multiap"
-	if [ "$multi_ap" = "1" ]; then
-		touch "$multiap_flag_file"
-	else
-		[ -e "$multiap_flag_file" ] && rm "$multiap_flag_file"
-	fi
-
-	wpa_supplicant_teardown_interface "$ifname"
-	cat > "$_config" <<EOF
-${scan_list:+freq_list=$scan_list}
-$ap_scan
-$country_str
-$tx_queue_data2_burst
-${mld_connect_band_pref:+mld_connect_band_pref=$mld_connect_band_pref}
-${mld_force_single_link:+mld_force_single_link=$mld_force_single_link}
-${mld_allowed_phy_bitmap:+mld_allowed_phy=$mld_allowed_phy_bitmap}
-EOF
-	return 0
-}
-
-wpa_supplicant_set_fixed_freq() {
-	local freq="$1"
-	local htmode="$2"
-
-	append network_data "fixed_freq=1" "$N$T"
-	append network_data "frequency=$freq" "$N$T"
-	case "$htmode" in
-		NOHT) append network_data "disable_ht=1" "$N$T";;
-		HE20|HT20|VHT20) append network_data "disable_ht40=1" "$N$T";;
-		HT40*|VHT40|VHT80|VHT160|HE40|HE80|HE160) append network_data "ht40=1" "$N$T";;
-	esac
-	case "$htmode" in
-		VHT*) append network_data "vht=1" "$N$T";;
-	esac
-	case "$htmode" in
-		HE80|VHT80) append network_data "max_oper_chwidth=1" "$N$T";;
-		HE160|VHT160) append network_data "max_oper_chwidth=2" "$N$T";;
-		HE20|HE40|VHT20|VHT40) append network_data "max_oper_chwidth=0" "$N$T";;
-		*) append network_data "disable_vht=1" "$N$T";;
-	esac
-}
-
-wpa_supplicant_add_network() {
-	local ifname="$1"
-	local freq="$2"
-	local htmode="$3"
-	local noscan="$4"
-
-	_wpa_supplicant_common "$1"
-	wireless_vif_parse_encryption
-
-	json_get_vars \
-		ssid bssid key \
-		basic_rate mcast_rate \
-		ieee80211w ieee80211r fils ocv \
-		multi_ap \
-		default_disabled
-
-	case "$auth_type" in
-		sae|owe|eap2|eap192)
-			set_default ieee80211w 2
-		;;
-		psk-sae)
-			set_default ieee80211w 1
-		;;
-	esac
-
-	set_default ieee80211r 0
-	set_default multi_ap 0
-	set_default default_disabled 0
-
-	local key_mgmt='NONE'
-	local network_data=
-	local T="	"
-
-	local scan_ssid="scan_ssid=1"
-	local freq wpa_key_mgmt
-
-	[ "$_w_mode" = "adhoc" ] && {
-		append network_data "mode=1" "$N$T"
-		[ -n "$freq" ] && wpa_supplicant_set_fixed_freq "$freq" "$htmode"
-		[ "$noscan" = "1" ] && append network_data "noscan=1" "$N$T"
-
-		scan_ssid="scan_ssid=0"
-
-		[ "$_w_driver" = "nl80211" ] ||	append wpa_key_mgmt "WPA-NONE"
-	}
-
-	[ "$_w_mode" = "mesh" ] && {
-		json_get_vars mesh_id mesh_fwding mesh_rssi_threshold encryption
-		[ -n "$mesh_id" ] && ssid="${mesh_id}"
-
-		append network_data "mode=5" "$N$T"
-		[ -n "$mesh_fwding" ] && append network_data "mesh_fwding=${mesh_fwding}" "$N$T"
-		[ -n "$mesh_rssi_threshold" ] && append network_data "mesh_rssi_threshold=${mesh_rssi_threshold}" "$N$T"
-		[ -n "$freq" ] && wpa_supplicant_set_fixed_freq "$freq" "$htmode"
-		[ "$noscan" = "1" ] && append network_data "noscan=1" "$N$T"
-		[ "$encryption" = "none" -o -z "$encryption" ] || append wpa_key_mgmt "SAE"
-		scan_ssid=""
-	}
-
-	[ "$_w_mode" = "sta" ] && {
-		[ "$multi_ap" = 1 ] && append network_data "multi_ap_backhaul_sta=1" "$N$T"
-		[ "$default_disabled" = 1 ] && append network_data "disabled=1" "$N$T"
-	}
-
-	[ -n "$ocv" ] && append network_data "ocv=$ocv" "$N$T"
-
-	case "$auth_type" in
-		none) ;;
-		owe)
-			hostapd_append_wpa_key_mgmt
-			key_mgmt="$wpa_key_mgmt"
-		;;
-		wep)
-			local wep_keyidx=0
-			hostapd_append_wep_key network_data
-			append network_data "wep_tx_keyidx=$wep_keyidx" "$N$T"
-		;;
-		wps)
-			key_mgmt='WPS'
-		;;
-		psk|sae|psk-sae)
-			local passphrase
-
-			if [ "$_w_mode" != "mesh" ]; then
-				hostapd_append_wpa_key_mgmt
-			fi
-
-			key_mgmt="$wpa_key_mgmt"
-
-			if [ "$_w_mode" = "mesh" ] || [ "$auth_type" = "sae" ]; then
-				passphrase="sae_password=\"${key}\""
-			else
-				if [ ${#key} -eq 64 ]; then
-					passphrase="psk=${key}"
-				else
-					passphrase="psk=\"${key}\""
-				fi
-			fi
-			append network_data "$passphrase" "$N$T"
-		;;
-		eap|eap2|eap192)
-			hostapd_append_wpa_key_mgmt
-			key_mgmt="$wpa_key_mgmt"
-
-			json_get_vars eap_type identity anonymous_identity ca_cert ca_cert_usesystem
-
-			[ "$fils" -gt 0 ] && append network_data "erp=1" "$N$T"
-			if [ "$ca_cert_usesystem" -eq "1" -a -f "/etc/ssl/certs/ca-certificates.crt" ]; then
-				append network_data "ca_cert=\"/etc/ssl/certs/ca-certificates.crt\"" "$N$T"
-			else
-				[ -n "$ca_cert" ] && append network_data "ca_cert=\"$ca_cert\"" "$N$T"
-			fi
-			[ -n "$identity" ] && append network_data "identity=\"$identity\"" "$N$T"
-			[ -n "$anonymous_identity" ] && append network_data "anonymous_identity=\"$anonymous_identity\"" "$N$T"
-			case "$eap_type" in
-				tls)
-					json_get_vars client_cert priv_key priv_key_pwd
-					append network_data "client_cert=\"$client_cert\"" "$N$T"
-					append network_data "private_key=\"$priv_key\"" "$N$T"
-					append network_data "private_key_passwd=\"$priv_key_pwd\"" "$N$T"
-
-					json_get_vars subject_match
-					[ -n "$subject_match" ] && append network_data "subject_match=\"$subject_match\"" "$N$T"
-
-					json_get_values altsubject_match altsubject_match
-					if [ -n "$altsubject_match" ]; then
-						local list=
-						for x in $altsubject_match; do
-							append list "$x" ";"
-						done
-						append network_data "altsubject_match=\"$list\"" "$N$T"
-					fi
-
-					json_get_values domain_match domain_match
-					if [ -n "$domain_match" ]; then
-						local list=
-						for x in $domain_match; do
-							append list "$x" ";"
-						done
-						append network_data "domain_match=\"$list\"" "$N$T"
-					fi
-
-					json_get_values domain_suffix_match domain_suffix_match
-					if [ -n "$domain_suffix_match" ]; then
-						local list=
-						for x in $domain_suffix_match; do
-							append list "$x" ";"
-						done
-						append network_data "domain_suffix_match=\"$list\"" "$N$T"
-					fi
-				;;
-				fast|peap|ttls)
-					json_get_vars auth password ca_cert2 ca_cert2_usesystem client_cert2 priv_key2 priv_key2_pwd
-					set_default auth MSCHAPV2
-
-					if [ "$auth" = "EAP-TLS" ]; then
-						if [ "$ca_cert2_usesystem" -eq "1" -a -f "/etc/ssl/certs/ca-certificates.crt" ]; then
-							append network_data "ca_cert2=\"/etc/ssl/certs/ca-certificates.crt\"" "$N$T"
-						else
-							[ -n "$ca_cert2" ] && append network_data "ca_cert2=\"$ca_cert2\"" "$N$T"
-						fi
-						append network_data "client_cert2=\"$client_cert2\"" "$N$T"
-						append network_data "private_key2=\"$priv_key2\"" "$N$T"
-						append network_data "private_key2_passwd=\"$priv_key2_pwd\"" "$N$T"
-					else
-						append network_data "password=\"$password\"" "$N$T"
-					fi
-
-					json_get_vars subject_match
-					[ -n "$subject_match" ] && append network_data "subject_match=\"$subject_match\"" "$N$T"
-
-					json_get_values altsubject_match altsubject_match
-					if [ -n "$altsubject_match" ]; then
-						local list=
-						for x in $altsubject_match; do
-							append list "$x" ";"
-						done
-						append network_data "altsubject_match=\"$list\"" "$N$T"
-					fi
-
-					json_get_values domain_match domain_match
-					if [ -n "$domain_match" ]; then
-						local list=
-						for x in $domain_match; do
-							append list "$x" ";"
-						done
-						append network_data "domain_match=\"$list\"" "$N$T"
-					fi
-
-					json_get_values domain_suffix_match domain_suffix_match
-					if [ -n "$domain_suffix_match" ]; then
-						local list=
-						for x in $domain_suffix_match; do
-							append list "$x" ";"
-						done
-						append network_data "domain_suffix_match=\"$list\"" "$N$T"
-					fi
-
-					phase2proto="auth="
-					case "$auth" in
-						"auth"*)
-							phase2proto=""
-						;;
-						"EAP-"*)
-							auth="$(echo $auth | cut -b 5- )"
-							[ "$eap_type" = "ttls" ] &&
-								phase2proto="autheap="
-							json_get_vars subject_match2
-							[ -n "$subject_match2" ] && append network_data "subject_match2=\"$subject_match2\"" "$N$T"
-
-							json_get_values altsubject_match2 altsubject_match2
-							if [ -n "$altsubject_match2" ]; then
-								local list=
-								for x in $altsubject_match2; do
-									append list "$x" ";"
-								done
-								append network_data "altsubject_match2=\"$list\"" "$N$T"
-							fi
-
-							json_get_values domain_match2 domain_match2
-							if [ -n "$domain_match2" ]; then
-								local list=
-								for x in $domain_match2; do
-									append list "$x" ";"
-								done
-								append network_data "domain_match2=\"$list\"" "$N$T"
-							fi
-
-							json_get_values domain_suffix_match2 domain_suffix_match2
-							if [ -n "$domain_suffix_match2" ]; then
-								local list=
-								for x in $domain_suffix_match2; do
-									append list "$x" ";"
-								done
-								append network_data "domain_suffix_match2=\"$list\"" "$N$T"
-							fi
-						;;
-					esac
-					append network_data "phase2=\"$phase2proto$auth\"" "$N$T"
-				;;
-			esac
-			append network_data "eap=$(echo $eap_type | tr 'a-z' 'A-Z')" "$N$T"
-		;;
-	esac
-
-	json_get_values pairwise pairwise
-	json_get_vars group_cipher group_mgmt_cipher
-	if [ -n "$pairwise" ]; then
-		case "$pairwise" in
-			*tkip+aes|*tkip+ccmp|*aes+tkip|*ccmp+tkip)
-				wpa_cipher="CCMP TKIP"
-			;;
-			*ccmp256)
-				wpa_cipher="CCMP-256"
-			;;
-			*aes|*ccmp)
-				wpa_cipher="CCMP"
-			;;
-			*tkip)
-				wpa_cipher="TKIP"
-			;;
-			*gcmp256)
-				wpa_cipher="GCMP-256"
-			;;
-			*gcmp)
-				wpa_cipher="GCMP"
-			;;
-			*)
-				wpa_cipher=""
-			;;
-		esac
-	fi
-	[ -n "$wpa_cipher" ] && wpa_pairwise="$wpa_cipher"
-
-	[ "$mode" = mesh ] || {
-		json_get_values sae_groups sae_groups
-		json_get_values owe_groups owe_groups
-
-		case "$wpa" in
-			1)
-				append network_data "proto=WPA" "$N$T"
-			;;
-			2)
-				append network_data "proto=RSN" "$N$T"
-			;;
-		esac
-
-		[ -n "$wpa_pairwise" ] && append network_data "pairwise=$wpa_pairwise" "$N$T"
-		[ -z "$group_cipher" ] && group_cipher="$wpa_cipher"
-
-		if [ -n "$sae_groups" -o -n "$owe_groups" ]; then
-			case "$auth_type" in
-			sae*)
-				echo "sae_groups=$sae_groups" >> "$_config"
-				append network_data "group=$group_cipher" "$N$T"
-			;;
-			owe)
-				append network_data "owe_group=$owe_groups" "$N$T"
-				append network_data "group=$group_cipher" "$N$T"
-			;;
-			esac
-		fi
-
-		# RSN -> allow management frame protection
-		case "$ieee80211w" in
-			[012])
-				json_get_vars ieee80211w_mgmt_cipher ieee80211w_max_timeout ieee80211w_retry_timeout beacon_prot
-				append network_data "ieee80211w=$ieee80211w" "$N$T"
-				[ "$ieee80211w" -gt "0" ] && {
-					if [ -z "$group_mgmt_cipher" ]; then
-						case "$group_cipher" in
-						CCMP-256)
-							ieee80211w_mgmt_cipher="BIP-CMAC-256"
-						;;
-						CCMP)
-							ieee80211w_mgmt_cipher="AES-128-CMAC"
-						;;
-						GCMP-256)
-							ieee80211w_mgmt_cipher="BIP-GMAC-256"
-						;;
-						GCMP)
-							ieee80211w_mgmt_cipher="BIP-GMAC-128"
-						;;
-						esac
-					else
-						ieee80211w_mgmt_cipher="$group_mgmt_cipher"
-					fi
-					if [ "$auth_type" = "eap192" ]; then
-						append network_data "group_mgmt=BIP-GMAC-256" "$N$T"
-					else
-						append network_data "group_mgmt=${ieee80211w_mgmt_cipher:-AES-128-CMAC}" "$N$T"
-					fi
-					[ -n "$beacon_prot" ] && \
-						append network_data "beacon_prot=$beacon_prot" "$N$T"
-				}
-			;;
-		esac
-	}
-
-	[ -n "$bssid" ] && append network_data "bssid=$bssid" "$N$T"
-	[ -n "$beacon_int" ] && append network_data "beacon_int=$beacon_int" "$N$T"
-
-	local bssid_blacklist bssid_whitelist
-	json_get_values bssid_blacklist bssid_blacklist
-	json_get_values bssid_whitelist bssid_whitelist
-
-	[ -n "$bssid_blacklist" ] && append network_data "bssid_blacklist=$bssid_blacklist" "$N$T"
-	[ -n "$bssid_whitelist" ] && append network_data "bssid_whitelist=$bssid_whitelist" "$N$T"
-
-        local disable_eht
-        local disable_he
-        local disable_vht
-        local disable_ht
-        json_get_vars disable_eht
-        json_get_vars disable_he
-        json_get_vars disable_vht
-        json_get_vars disable_ht
-
-        [ -n "$disable_eht" ] && append network_data "disable_eht=$disable_eht" "$N$T"
-        [ -n "$disable_he" ] && append network_data "disable_he=$disable_he" "$N$T"
-        [ -n "$disable_vht" ] && append network_data "disable_vht=$disable_vht" "$N$T"
-        [ -n "$disable_ht" ] && append network_data "disable_ht=$disable_ht" "$N$T"
-
-	[ -n "$basic_rate" ] && {
-		local br rate_list=
-		for br in $basic_rate; do
-			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=
-		wpa_supplicant_add_rate mc_rate "$mcast_rate"
-		append network_data "mcast_rate=$mc_rate" "$N$T"
-	}
-
-	if [ "$auth_type" = "sae" ]; then
-		json_get_vars sae_pwe sae_pwe
-		[ -n "$sae_pwe" ] && echo "sae_pwe=$sae_pwe" >> "$_config"
-	fi
-
-	if [ "$key_mgmt" = "WPS" ]; then
-		echo "wps_cred_processing=1" >> "$_config"
-	else
-		cat >> "$_config" <<EOF
-network={
-	$scan_ssid
-	ssid="$ssid"
-	key_mgmt=$key_mgmt
-	$network_data
-}
-EOF
-	fi
-	return 0
-}
-
-hostapd_common_cleanup() {
-	killall meshd-nl80211
-}
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh b/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
deleted file mode 100755
index 0ec893e..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
+++ /dev/null
@@ -1,1494 +0,0 @@
-#!/bin/sh
-. /lib/netifd/netifd-wireless.sh
-. /lib/netifd/hostapd.sh
-. /lib/functions/system.sh
-
-init_wireless_driver "$@"
-
-MP_CONFIG_INT="mesh_retry_timeout mesh_confirm_timeout mesh_holding_timeout mesh_max_peer_links
-	       mesh_max_retries mesh_ttl mesh_element_ttl mesh_hwmp_max_preq_retries
-	       mesh_path_refresh_time mesh_min_discovery_timeout mesh_hwmp_active_path_timeout
-	       mesh_hwmp_preq_min_interval mesh_hwmp_net_diameter_traversal_time mesh_hwmp_rootmode
-	       mesh_hwmp_rann_interval mesh_gate_announcements mesh_sync_offset_max_neighor
-	       mesh_rssi_threshold mesh_hwmp_active_path_to_root_timeout mesh_hwmp_root_interval
-	       mesh_hwmp_confirmation_interval mesh_awake_window mesh_plink_timeout"
-MP_CONFIG_BOOL="mesh_auto_open_plinks mesh_fwding"
-MP_CONFIG_STRING="mesh_power_mode"
-
-wdev_tool() {
-	ucode /usr/share/hostap/wdev.uc "$@"
-}
-
-ubus_call() {
-	flock /var/run/hostapd.lock ubus call "$@"
-}
-
-drv_mac80211_init_device_config() {
-	hostapd_common_add_device_config
-
-	config_add_string path phy 'macaddr:macaddr'
-	config_add_string tx_burst
-	config_add_string distance
-	config_add_int mbssid mu_onoff sr_enable sr_enhanced rnr obss_interval band_idx
-	config_add_int beacon_int chanbw frag rts
-	config_add_int rxantenna txantenna txpower min_tx_power
-	config_add_int num_global_macaddr multiple_bssid
-	config_add_boolean noscan ht_coex acs_exclude_dfs background_radar
-	config_add_boolean noscan ht_coex acs_exclude_dfs background_radar background_cert_mode
-	config_add_array ht_capab
-	config_add_array channels
-	config_add_array scan_list
-	config_add_boolean \
-		rxldpc \
-		short_gi_80 \
-		short_gi_160 \
-		tx_stbc_2by1 \
-		su_beamformer \
-		su_beamformee \
-		mu_beamformer \
-		mu_beamformee \
-		he_su_beamformer \
-		he_su_beamformee \
-		he_mu_beamformer \
-		vht_txop_ps \
-		htc_vht \
-		rx_antenna_pattern \
-		tx_antenna_pattern \
-		he_spr_sr_control \
-		he_spr_psr_enabled \
-		he_bss_color_enabled \
-		he_twt_required \
-		he_twt_responder \
-		etxbfen \
-		itxbfen
-	config_add_int \
-		beamformer_antennas \
-		beamformee_antennas \
-		vht_max_a_mpdu_len_exp \
-		vht_max_mpdu \
-		vht_link_adapt \
-		vht160 \
-		rx_stbc \
-		tx_stbc \
-		he_bss_color \
-		he_spr_non_srg_obss_pd_max_offset \
-		pp_bitmap \
-		pp_mode
-	config_add_boolean \
-		ldpc \
-		greenfield \
-		short_gi_20 \
-		short_gi_40 \
-		max_amsdu \
-		dsss_cck_40
-}
-
-drv_mac80211_init_iface_config() {
-	hostapd_common_add_bss_config
-
-	config_add_string 'macaddr:macaddr' ifname
-
-	config_add_boolean wds powersave enable
-	config_add_string wds_bridge
-	config_add_int maxassoc
-	config_add_int max_listen_int
-	config_add_int dtim_period
-	config_add_int start_disabled
-	config_add_int vif_txpower
-
-	# mesh
-	config_add_string mesh_id
-	config_add_int $MP_CONFIG_INT
-	config_add_boolean $MP_CONFIG_BOOL
-	config_add_string $MP_CONFIG_STRING
-}
-
-mac80211_add_capabilities() {
-	local __var="$1"; shift
-	local __mask="$1"; shift
-	local __out= oifs
-
-	oifs="$IFS"
-	IFS=:
-	for capab in "$@"; do
-		set -- $capab
-
-		[ "$(($4))" -gt 0 ] || continue
-		[ "$(($__mask & $2))" -eq "$((${3:-$2}))" ] || continue
-		__out="$__out[$1]"
-	done
-	IFS="$oifs"
-
-	export -n -- "$__var=$__out"
-}
-
-mac80211_add_he_capabilities() {
-	local __out= oifs
-
-	oifs="$IFS"
-	IFS=:
-	for capab in "$@"; do
-		set -- $capab
-		[ "$(($4))" -gt 0 ] || continue
-		[ "$(((0x$2) & $3))" -gt 0 ] || {
-			eval "$1=0"
-			continue
-		}
-		append base_cfg "$1=1" "$N"
-	done
-	IFS="$oifs"
-}
-
-mac80211_hostapd_setup_base() {
-	local phy="$1"
-
-	json_select config
-
-	[ "$auto_channel" -gt 0 ] && channel=acs_survey
-
-	[ "$auto_channel" -gt 0 ] && json_get_vars acs_exclude_dfs
-	[ -n "$acs_exclude_dfs" ] && [ "$acs_exclude_dfs" -gt 0 ] &&
-		append base_cfg "acs_exclude_dfs=1" "$N"
-
-	json_get_vars noscan ht_coex min_tx_power:0 tx_burst mbssid mu_onoff rnr obss_interval band_idx
-	json_get_vars etxbfen:1 itxbfen:0
-	json_get_values ht_capab_list ht_capab
-	json_get_values channel_list channels
-
-	[ "$min_tx_power" -gt 0 ] && append base_cfg "min_tx_power=$min_tx_power" "$N"
-
-	set_default noscan 0
-
-	[ "$noscan" -gt 0 ] && hostapd_noscan=1
-	[ "$tx_burst" = 0 ] && tx_burst=
-
-	chan_ofs=0
-	[ "$band" = "6g" ] && chan_ofs=1
-
-	ieee80211n=1
-	ht_capab=
-	case "$htmode" in
-		VHT20|HT20|HE20|EHT20) ;;
-		HT40*|VHT40|VHT80|VHT160|HE40*|HE80|HE160|EHT40*|EHT80|EHT160|EHT320*)
-			case "$hwmode" in
-				a)
-					case "$(( (($channel / 4) + $chan_ofs) % 2 ))" in
-						1) ht_capab="[HT40+]";;
-						0) ht_capab="[HT40-]";;
-					esac
-					case "$htmode" in
-						HT40-|HE40-|EHT40-)
-							if [ "$auto_channel" -gt 0 ]; then
-								ht_capab="[HT40-]"
-							fi
-						;;
-					esac
-				;;
-				*)
-					case "$htmode" in
-						HT40+|HE40+|EHT40+)
-							if [ "$channel" -gt 9 ]; then
-								echo "Could not set the center freq with this HT mode setting"
-								return 1
-							else
-								ht_capab="[HT40+]"
-							fi
-						;;
-						HT40-|HE40-|EHT40-)
-							if [ "$channel" -lt 5 -a "$auto_channel" -eq 0 ]; then
-								echo "Could not set the center freq with this HT mode setting"
-								return 1
-							else
-								ht_capab="[HT40-]"
-							fi
-						;;
-						*)
-							if [ "$channel" -lt 7 -o "$auto_channel" -gt 0 ]; then
-								ht_capab="[HT40+]"
-							else
-								ht_capab="[HT40-]"
-							fi
-						;;
-					esac
-				;;
-			esac
-		;;
-		*) ieee80211n= ;;
-	esac
-
-	[ -n "$ieee80211n" ] && {
-		append base_cfg "ieee80211n=1" "$N"
-
-		set_default ht_coex 0
-		append base_cfg "ht_coex=$ht_coex" "$N"
-
-		[ "$ht_coex" -eq 1 ] && {
-			set_default obss_interval 300
-			append base_cfg "obss_interval=$obss_interval" "$N"
-		}
-
-		json_get_vars \
-			ldpc:1 \
-			greenfield:0 \
-			short_gi_20:1 \
-			short_gi_40:1 \
-			tx_stbc:1 \
-			rx_stbc:3 \
-			max_amsdu:1 \
-			dsss_cck_40:1
-
-		ht_cap_mask=0
-		for cap in $(iw phy "$phy" info | grep 'Capabilities: 0x' | cut -d: -f2); do
-			ht_cap_mask="$(($ht_cap_mask | $cap))"
-		done
-
-		cap_rx_stbc=$((($ht_cap_mask >> 8) & 3))
-		[ "$rx_stbc" -lt "$cap_rx_stbc" ] && cap_rx_stbc="$rx_stbc"
-		ht_cap_mask="$(( ($ht_cap_mask & ~(0x300)) | ($cap_rx_stbc << 8) ))"
-
-		mac80211_add_capabilities ht_capab_flags $ht_cap_mask \
-			LDPC:0x1::$ldpc \
-			GF:0x10::$greenfield \
-			SHORT-GI-20:0x20::$short_gi_20 \
-			SHORT-GI-40:0x40::$short_gi_40 \
-			TX-STBC:0x80::$tx_stbc \
-			RX-STBC1:0x300:0x100:1 \
-			RX-STBC12:0x300:0x200:1 \
-			RX-STBC123:0x300:0x300:1 \
-			MAX-AMSDU-7935:0x800::$max_amsdu \
-			DSSS_CCK-40:0x1000::$dsss_cck_40
-
-		ht_capab="$ht_capab$ht_capab_flags"
-		[ -n "$ht_capab" ] && append base_cfg "ht_capab=$ht_capab" "$N"
-	}
-
-	# 802.11ac
-	enable_ac=0
-	vht_oper_chwidth=0
-	vht_center_seg0=
-
-	idx="$channel"
-	case "$htmode" in
-		VHT20|HE20|EHT20) enable_ac=1;;
-		VHT40|HE40|EHT40)
-			case "$(( (($channel / 4) + $chan_ofs) % 2 ))" in
-				1) idx=$(($channel + 2));;
-				0) idx=$(($channel - 2));;
-			esac
-			enable_ac=1
-			vht_center_seg0=$idx
-		;;
-		VHT80|HE80|EHT80)
-			case "$(( (($channel / 4) + $chan_ofs) % 4 ))" in
-				1) idx=$(($channel + 6));;
-				2) idx=$(($channel + 2));;
-				3) idx=$(($channel - 2));;
-				0) idx=$(($channel - 6));;
-			esac
-			enable_ac=1
-			vht_oper_chwidth=1
-			vht_center_seg0=$idx
-		;;
-		VHT160|HE160|EHT160)
-			if [ "$band" = "6g" ]; then
-				case "$channel" in
-					1|5|9|13|17|21|25|29) idx=15;;
-					33|37|41|45|49|53|57|61) idx=47;;
-					65|69|73|77|81|85|89|93) idx=79;;
-					97|101|105|109|113|117|121|125) idx=111;;
-					129|133|137|141|145|149|153|157) idx=143;;
-					161|165|169|173|177|181|185|189) idx=175;;
-					193|197|201|205|209|213|217|221) idx=207;;
-				esac
-			else
-				case "$channel" in
-					36|40|44|48|52|56|60|64) idx=50;;
-					100|104|108|112|116|120|124|128) idx=114;;
-					149|153|157|161|165|169|173|177) idx=163;;
-				esac
-			fi
-			enable_ac=1
-			vht_oper_chwidth=2
-			vht_center_seg0=$idx
-		;;
-		EHT320*)
-			case "$channel" in
-				1|5|9|13|17|21|25|29) idx=31;;
-				33|37|41|45|49|53|57|61| \
-				65|69|73|77|81|85|89|93) idx=63;;
-				97|101|105|109|113|117|121|125| \
-				129|133|137|141|145|149|153|157) idx=127;;
-				161|165|169|173|177|181|185|189| \
-				193|197|201|205|209|213|217|221) idx=191;;
-			esac
-			if [[ "$htmode" = "EHT320-1" && "$channel" -ge "193" ]] ||
-			   [[ "$htmode" = "EHT320-2" && "$channel" -le "29" ]]; then
-				echo "Could not set the center freq with this EHT setting"
-				return 1
-			elif [[ "$htmode" = "EHT320-1" && "$channel" -ge "33" ]]; then
-				if [ "$channel" -gt $idx ]; then
-					idx=$(($idx + 32))
-				else
-					idx=$(($idx - 32))
-				fi
-			fi
-			vht_oper_chwidth=2
-			if [ "$channel" -gt $idx ]; then
-				vht_center_seg0=$(($idx + 16))
-			else
-				vht_center_seg0=$(($idx - 16))
-			fi
-			eht_oper_chwidth=9
-			eht_oper_centr_freq_seg0_idx=$idx
-
-			case $htmode in
-				EHT320-1) eht_bw320_offset=1;;
-				EHT320-2) eht_bw320_offset=2;;
-				EHT320) eht_bw320_offset=0;;
-			esac
-		;;
-	esac
-	[ "$band" = "5g" ] && {
-		json_get_vars \
-			background_radar:0 \
-			background_cert_mode:0 \
-
-		[ "$background_radar" -eq 1 ] && append base_cfg "enable_background_radar=1" "$N"
-		[ "$background_cert_mode" -eq 1 ] && append base_cfg "background_radar_mode=1" "$N"
-	}
-	[ "$band" = "6g" ] && {
-		op_class=
-		case "$htmode" in
-			HE20|EHT20) op_class=131;;
-			EHT320*) op_class=137;;
-			HE*|EHT*) op_class=$((132 + $vht_oper_chwidth))
-		esac
-		[ -n "$op_class" ] && append base_cfg "op_class=$op_class" "$N"
-	}
-	[ "$hwmode" = "a" ] || enable_ac=0
-
-	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 \
-			beamformee_antennas:5 \
-			beamformer_antennas:4 \
-			rx_antenna_pattern:1 \
-			tx_antenna_pattern:1 \
-			vht_max_a_mpdu_len_exp:7 \
-			vht_max_mpdu:11454 \
-			rx_stbc:4 \
-			vht_link_adapt:3 \
-			vht160:2
-
-		append base_cfg "ieee80211ac=1" "$N"
-		vht_cap=0
-		for cap in $(iw phy "$phy" info | awk -F "[()]" '/VHT Capabilities/ { print $2 }'); do
-			vht_cap="$(($vht_cap | $cap))"
-		done
-
-		append base_cfg "vht_oper_chwidth=$vht_oper_chwidth" "$N"
-		append base_cfg "vht_oper_centr_freq_seg0_idx=$vht_center_seg0" "$N"
-
-		cap_rx_stbc=$((($vht_cap >> 8) & 7))
-		[ "$rx_stbc" -lt "$cap_rx_stbc" ] && cap_rx_stbc="$rx_stbc"
-		vht_cap="$(( ($vht_cap & ~(0x700)) | ($cap_rx_stbc << 8) ))"
-
-		[ "$vht_oper_chwidth" -lt 2 ] && {
-			vht160=0
-			short_gi_160=0
-		}
-
-		[ "$etxbfen" -eq 0 ] && {
-			su_beamformer=0
-			su_beamformee=0
-			mu_beamformer=0
-		}
-
-		mac80211_add_capabilities vht_capab $vht_cap \
-			RXLDPC:0x10::$rxldpc \
-			SHORT-GI-80:0x20::$short_gi_80 \
-			SHORT-GI-160:0x40::$short_gi_160 \
-			TX-STBC-2BY1:0x80::$tx_stbc_2by1 \
-			SU-BEAMFORMER:0x800::$su_beamformer \
-			SU-BEAMFORMEE:0x1000::$su_beamformee \
-			MU-BEAMFORMER:0x80000::$mu_beamformer \
-			MU-BEAMFORMEE:0x100000::$mu_beamformee \
-			VHT-TXOP-PS:0x200000::$vht_txop_ps \
-			HTC-VHT:0x400000::$htc_vht \
-			RX-ANTENNA-PATTERN:0x10000000::$rx_antenna_pattern \
-			TX-ANTENNA-PATTERN:0x20000000::$tx_antenna_pattern \
-			RX-STBC-1:0x700:0x100:1 \
-			RX-STBC-12:0x700:0x200:1 \
-			RX-STBC-123:0x700:0x300:1 \
-			RX-STBC-1234:0x700:0x400:1 \
-
-		[ "$(($vht_cap & 0x800))" -gt 0 -a "$su_beamformer" -gt 0 ] && {
-			cap_ant="$(( ( ($vht_cap >> 16) & 3 ) + 1 ))"
-			[ "$cap_ant" -gt "$beamformer_antennas" ] && cap_ant="$beamformer_antennas"
-			[ "$cap_ant" -gt 1 ] && vht_capab="$vht_capab[SOUNDING-DIMENSION-$cap_ant]"
-		}
-
-		[ "$(($vht_cap & 0x1000))" -gt 0 -a "$su_beamformee" -gt 0 ] && {
-			cap_ant="$(( ( ($vht_cap >> 13) & 7 ) + 1 ))"
-			[ "$cap_ant" -gt "$beamformee_antennas" ] && cap_ant="$beamformee_antennas"
-			[ "$cap_ant" -gt 1 ] && vht_capab="$vht_capab[BF-ANTENNA-$cap_ant]"
-		}
-
-		# 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]"
-
-		# maximum A-MPDU length exponent
-		vht_max_a_mpdu_len_exp_hw=0
-		[ "$(($vht_cap & 58720256))" -ge 8388608 -a 1 -le "$vht_max_a_mpdu_len_exp" ] && \
-			vht_max_a_mpdu_len_exp_hw=1
-		[ "$(($vht_cap & 58720256))" -ge 16777216 -a 2 -le "$vht_max_a_mpdu_len_exp" ] && \
-			vht_max_a_mpdu_len_exp_hw=2
-		[ "$(($vht_cap & 58720256))" -ge 25165824 -a 3 -le "$vht_max_a_mpdu_len_exp" ] && \
-			vht_max_a_mpdu_len_exp_hw=3
-		[ "$(($vht_cap & 58720256))" -ge 33554432 -a 4 -le "$vht_max_a_mpdu_len_exp" ] && \
-			vht_max_a_mpdu_len_exp_hw=4
-		[ "$(($vht_cap & 58720256))" -ge 41943040 -a 5 -le "$vht_max_a_mpdu_len_exp" ] && \
-			vht_max_a_mpdu_len_exp_hw=5
-		[ "$(($vht_cap & 58720256))" -ge 50331648 -a 6 -le "$vht_max_a_mpdu_len_exp" ] && \
-			vht_max_a_mpdu_len_exp_hw=6
-		[ "$(($vht_cap & 58720256))" -ge 58720256 -a 7 -le "$vht_max_a_mpdu_len_exp" ] && \
-			vht_max_a_mpdu_len_exp_hw=7
-		vht_capab="$vht_capab[MAX-A-MPDU-LEN-EXP$vht_max_a_mpdu_len_exp_hw]"
-
-		# 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
-
-	# 802.11ax
-	enable_ax=0
-	case "$htmode" in
-		HE*|EHT*) enable_ax=1 ;;
-	esac
-
-	if [ "$enable_ax" != "0" ]; then
-		json_get_vars \
-			he_su_beamformer:1 \
-			he_su_beamformee:1 \
-			he_mu_beamformer:1 \
-			he_twt_required:0 \
-			he_twt_responder \
-			he_spr_sr_control:3 \
-			he_spr_psr_enabled:0 \
-			he_spr_non_srg_obss_pd_max_offset:0 \
-			he_bss_color \
-			he_bss_color_enabled:1
-
-		he_phy_cap=$(iw phy "$phy" info | sed -n '/HE Iftypes: AP/,$p' | awk -F "[()]" '/HE PHY Capabilities/ { print $2 }' | head -1)
-		he_phy_cap=${he_phy_cap:2}
-		he_mac_cap=$(iw phy "$phy" info | sed -n '/HE Iftypes: AP/,$p' | awk -F "[()]" '/HE MAC Capabilities/ { print $2 }' | head -1)
-		he_mac_cap=${he_mac_cap:2}
-
-		append base_cfg "ieee80211ax=1" "$N"
-		[ "$hwmode" = "a" ] && {
-			append base_cfg "he_oper_chwidth=$vht_oper_chwidth" "$N"
-			append base_cfg "he_oper_centr_freq_seg0_idx=$vht_center_seg0" "$N"
-		}
-
-		[ "$etxbfen" -eq 0 ] && {
-			he_su_beamformer=0
-			he_mu_beamformer=0
-		}
-
-		mac80211_add_he_capabilities \
-			he_su_beamformer:${he_phy_cap:6:2}:0x80:$he_su_beamformer \
-			he_su_beamformee:${he_phy_cap:8:2}:0x1:$he_su_beamformee \
-			he_mu_beamformer:${he_phy_cap:8:2}:0x2:$he_mu_beamformer \
-			he_spr_psr_enabled:${he_phy_cap:14:2}:0x1:$he_spr_psr_enabled \
-			he_twt_required:${he_mac_cap:0:2}:0x6:$he_twt_required
-
-		if [ -n "$he_twt_responder" ]; then
-			append base_cfg "he_twt_responder=$he_twt_responder" "$N"
-		fi
-		if [ "$he_bss_color_enabled" -gt 0 ]; then
-			if !([ "$he_bss_color" -gt 0 ] && [ "$he_bss_color" -le 64 ]); then
-				rand=$(head -n 1 /dev/urandom | tr -dc 0-9 | head -c 2)
-				he_bss_color=$((rand % 63 + 1))
-			fi
-			append base_cfg "he_bss_color=$he_bss_color" "$N"
-			[ "$he_spr_non_srg_obss_pd_max_offset" -gt 0 ] && { \
-				append base_cfg "he_spr_non_srg_obss_pd_max_offset=$he_spr_non_srg_obss_pd_max_offset" "$N"
-				he_spr_sr_control=$((he_spr_sr_control | (1 << 2)))
-			}
-			[ "$he_spr_psr_enabled" -gt 0 ] || he_spr_sr_control=$((he_spr_sr_control | (1 << 0)))
-			append base_cfg "he_spr_sr_control=$he_spr_sr_control" "$N"
-		else
-			append base_cfg "he_bss_color_disabled=1" "$N"
-		fi
-
-
-		append base_cfg "he_default_pe_duration=4" "$N"
-		append base_cfg "he_rts_threshold=1023" "$N"
-		append base_cfg "he_mu_edca_qos_info_param_count=0" "$N"
-		append base_cfg "he_mu_edca_qos_info_q_ack=0" "$N"
-		append base_cfg "he_mu_edca_qos_info_queue_request=0" "$N"
-		append base_cfg "he_mu_edca_qos_info_txop_request=0" "$N"
-		append base_cfg "he_mu_edca_ac_be_aifsn=0" "$N"
-		append base_cfg "he_mu_edca_ac_be_aci=0" "$N"
-		append base_cfg "he_mu_edca_ac_be_ecwmin=9" "$N"
-		append base_cfg "he_mu_edca_ac_be_ecwmax=10" "$N"
-		append base_cfg "he_mu_edca_ac_be_timer=3" "$N"
-		append base_cfg "he_mu_edca_ac_bk_aifsn=0" "$N"
-		append base_cfg "he_mu_edca_ac_bk_aci=1" "$N"
-		append base_cfg "he_mu_edca_ac_bk_ecwmin=9" "$N"
-		append base_cfg "he_mu_edca_ac_bk_ecwmax=10" "$N"
-		append base_cfg "he_mu_edca_ac_bk_timer=3" "$N"
-		append base_cfg "he_mu_edca_ac_vi_ecwmin=5" "$N"
-		append base_cfg "he_mu_edca_ac_vi_ecwmax=7" "$N"
-		append base_cfg "he_mu_edca_ac_vi_aifsn=0" "$N"
-		append base_cfg "he_mu_edca_ac_vi_aci=2" "$N"
-		append base_cfg "he_mu_edca_ac_vi_timer=3" "$N"
-		append base_cfg "he_mu_edca_ac_vo_aifsn=0" "$N"
-		append base_cfg "he_mu_edca_ac_vo_aci=3" "$N"
-		append base_cfg "he_mu_edca_ac_vo_ecwmin=5" "$N"
-		append base_cfg "he_mu_edca_ac_vo_ecwmax=7" "$N"
-		append base_cfg "he_mu_edca_ac_vo_timer=3" "$N"
-	fi
-
-	set_default tx_burst 2
-
-	# 802.11be
-	enable_be=0
-	case "$htmode" in
-		EHT*) enable_be=1 ;;
-	esac
-
-	if [ "$enable_be" != "0" ]; then
-
-		json_get_vars \
-			pp_bitmap \
-			pp_mode
-
-		append base_cfg "ieee80211be=1" "$N"
-		if [ "$etxbfen" -eq 0 ]; then
-			append base_cfg "eht_su_beamformee=1" "$N"
-		else
-			append base_cfg "eht_su_beamformer=1" "$N"
-			append base_cfg "eht_su_beamformee=1" "$N"
-			append base_cfg "eht_mu_beamformer=1" "$N"
-		fi
-		[ "$hwmode" = "a" ] && {
-			case $htmode in
-				EHT320*)
-					append base_cfg "eht_oper_chwidth=$eht_oper_chwidth" "$N"
-					append base_cfg "eht_oper_centr_freq_seg0_idx=$eht_oper_centr_freq_seg0_idx" "$N"
-					append base_cfg "eht_bw320_offset=$eht_bw320_offset" "$N"
-				;;
-				*)
-					append base_cfg "eht_oper_chwidth=$vht_oper_chwidth" "$N"
-					append base_cfg "eht_oper_centr_freq_seg0_idx=$vht_center_seg0" "$N"
-				;;
-			esac
-		}
-
-		if [ -n "$pp_bitmap" ]; then
-			append base_cfg "punct_bitmap=$pp_bitmap" "$N"
-		fi
-
-		if [ -n "$pp_mode" ]; then
-			append base_cfg "pp_mode=$pp_mode" "$N"
-		fi
-	fi
-
-	hostapd_prepare_device_config "$hostapd_conf_file" nl80211
-	cat >> "$hostapd_conf_file" <<EOF
-${channel:+channel=$channel}
-${channel_list:+chanlist=$channel_list}
-${hostapd_noscan:+noscan=1}
-${tx_burst:+tx_queue_data2_burst=$tx_burst}
-${mbssid:+mbssid=$mbssid}
-${mu_onoff:+mu_onoff=$mu_onoff}
-${rnr:+rnr=$rnr}
-${multiple_bssid:+mbssid=$multiple_bssid}
-${band_idx:+band_idx=$band_idx}
-#num_global_macaddr=$num_global_macaddr
-#single_hw=1
-$base_cfg
-
-EOF
-	json_select ..
-}
-
-mac80211_hostapd_setup_bss() {
-	local phy="$1"
-	local ifname="$2"
-	local macaddr="$3"
-	local type="$4"
-
-	hostapd_cfg=
-	append hostapd_cfg "$type=$ifname" "$N"
-
-	hostapd_set_bss_options hostapd_cfg "$phy" "$vif" || return 1
-	json_get_vars wds wds_bridge dtim_period max_listen_int start_disabled
-
-	set_default wds 0
-	set_default start_disabled 0
-
-	[ "$wds" -gt 0 ] && {
-		append hostapd_cfg "wds_sta=1" "$N"
-		[ -n "$wds_bridge" ] && append hostapd_cfg "wds_bridge=$wds_bridge" "$N"
-	}
-	[ "$start_disabled" -eq 1 ] && append hostapd_cfg "start_disabled=1" "$N"
-
-	cat >> /var/run/hostapd-$phy.conf <<EOF
-$hostapd_cfg
-bssid=$macaddr
-${dtim_period:+dtim_period=$dtim_period}
-${max_listen_int:+max_listen_interval=$max_listen_int}
-EOF
-}
-
-mac80211_generate_mbssid_mac() {
-	local phy="$1"
-	local transmitted_bssid="$2"
-	local id="${mbssidx:-0}"
-
-	local ref="$(cat /sys/class/ieee80211/${phy}/macaddress)"
-
-	if [ -z "$transmitted_bssid" ]; then
-		transmitted_bssid=$ref
-	fi
-
-	if [ $id -eq 0 ]; then
-		echo "$transmitted_bssid"
-		return
-	fi
-
-	local oIFS="$IFS"; IFS=":"; set -- $transmitted_bssid; IFS="$oIFS"
-
-	# Calculate nontransmitted bssid
-	b6="0x$6"
-	ref_b6=$(($b6 % $max_mbssid))
-	b6=$(($b6 - $ref_b6 + ($ref_b6 + $id) % $max_mbssid))
-	printf "%s:%s:%s:%s:%s:%02x" $1 $2 $3 $4 $5 $b6
-}
-
-mac80211_get_addr() {
-	local phy="$1"
-	local idx="$(($2 + 1))"
-
-	head -n $idx /sys/class/ieee80211/${phy}/addresses | tail -n1
-}
-
-mac80211_generate_mac() {
-	local phy="$1"
-	local id="${macidx:-0}"
-
-	wdev_tool "$phy" get_macaddr id=$id num_global=$num_global_macaddr mbssid=${multiple_bssid:-0}
-}
-
-get_board_phy_name() (
-	local path="$1"
-	local fallback_phy=""
-
-	__check_phy() {
-		local val="$1"
-		local key="$2"
-		local ref_path="$3"
-
-		json_select "$key"
-		json_get_values path
-		json_select ..
-
-		[ "${ref_path%+*}" = "$path" ] && fallback_phy=$key
-		[ "$ref_path" = "$path" ] || return 0
-
-		echo "$key"
-		exit
-	}
-
-	json_load_file /etc/board.json
-	json_for_each_item __check_phy wlan "$path"
-	[ -n "$fallback_phy" ] && echo "${fallback_phy}.${path##*+}"
-)
-
-rename_board_phy_by_path() {
-	local path="$1"
-
-	local new_phy="$(get_board_phy_name "$path")"
-	[ -z "$new_phy" -o "$new_phy" = "$phy" ] && return
-
-	iw "$phy" set name "$new_phy" && phy="$new_phy"
-}
-
-rename_board_phy_by_name() (
-	local phy="$1"
-	local suffix="${phy##*.}"
-	[ "$suffix" = "$phy" ] && suffix=
-
-	json_load_file /etc/board.json
-	json_select wlan
-	json_select "${phy%.*}" || return 0
-	json_get_values path
-
-	prev_phy="$(iwinfo nl80211 phyname "path=$path${suffix:++$suffix}")"
-	[ -n "$prev_phy" ] || return 0
-
-	[ "$prev_phy" = "$phy" ] && return 0
-
-	iw "$prev_phy" set name "$phy"
-)
-
-find_phy() {
-	[ -n "$phy" ] && {
-		rename_board_phy_by_name "$phy"
-		[ -d /sys/class/ieee80211/$phy ] && return 0
-	}
-	[ -n "$path" ] && {
-		phy="$(iwinfo nl80211 phyname "path=$path")"
-		[ -n "$phy" ] && {
-			rename_board_phy_by_path "$path"
-			return 0
-		}
-	}
-	[ -n "$macaddr" ] && {
-		for phy in $(ls /sys/class/ieee80211 2>/dev/null); do
-			grep -i -q "$macaddr" "/sys/class/ieee80211/${phy}/macaddress" && {
-				path="$(iwinfo nl80211 path "$phy")"
-				rename_board_phy_by_path "$path"
-				return 0
-			}
-		done
-	}
-	return 1
-}
-
-mac80211_check_ap() {
-	has_ap=1
-}
-
-mac80211_set_ifname() {
-	local phy="$1"
-	local prefix="$2"
-	eval "ifname=\"$phy-$prefix\${idx_$prefix:-0}\"; idx_$prefix=\$((\${idx_$prefix:-0 } + 1))"
-}
-
-fill_mld_params() {
-	local target_mld_id=$1
-	local phy_idx=$(echo $2 | tr -d "phy")
-	local found_mld=0
-	local is_primary=1
-	local mld_allowed_links=0
-
-	iface_list="$(cat /etc/config/wireless | grep wifi-iface | cut -d ' ' -f3 | tr -s "'\n" ' ')"
-	for iface in $iface_list
-	do
-		local mld_id="$(uci show wireless.$iface | grep "mld_id" | cut -d '=' -f2 | tr -d "'")"
-		local radio_id="$(uci show wireless.$iface | grep "device" | cut -d '=' -f2 | tr -d "radio'")"
-		local iface_disabled="$(uci show wireless.$iface | grep "disabled" | cut -d '=' -f2 | tr -d "'")"
-
-		if [ "$iface_disabled" != "1" ] && [ $mld_id = $target_mld_id ]; then
-			mld_allowed_links=$(($mld_allowed_links * 2 + 1))
-			[ $radio_id -lt $phy_idx ] && is_primary=0
-		fi
-	done
-	json_add_string "mld_primary" $is_primary
-	json_add_string "mld_allowed_links" $mld_allowed_links
-
-        mld_list="$(cat /etc/config/wireless | grep wifi-mld | cut -d ' ' -f3 | tr -s "'\n" ' ')"
-        for m in $mld_list
-        do
-		local mld_id="$(uci show wireless.$m | grep "mld_id" | cut -d '=' -f2 | tr -d "'")"
-		[ $mld_id = $target_mld_id ] || continue
-		found_mld=1
-
-                option_list="$(uci show wireless.$m | tr -s "\n" ' ')"
-                for option in $option_list
-                do
-                        local key="$(echo $option | cut -d '.' -f3 | cut -d '=' -f1)"
-                        local val="$(echo $option | cut -d '.' -f3 | cut -d '=' -f2 | tr -d "'")"
-			[ -n "$key" ] && json_add_string $key $val
-                done
-        done
-
-	if [ $found_mld -eq 0 ]; then
-		echo "mld_id $target_mld_id is not found"
-		return 1
-	fi
-	return 0
-}
-
-mac80211_prepare_vif() {
-	json_select config
-
-	json_get_vars mld_id
-	if [ -n "$mld_id" ]; then
-		fill_mld_params $mld_id $phy || return
-
-		json_get_vars mld_addr
-		if [ -z "$mld_addr" ]; then
-			json_add_string mld_addr "$(mac80211_generate_mac phy0)"
-		fi
-	fi
-
-	json_get_vars ifname mode ssid wds powersave macaddr enable wpa_psk_file vlan_file
-
-	[ -n "$ifname" ] || {
-		local prefix;
-
-		case "$mode" in
-		ap|sta|mesh) prefix=$mode;;
-		adhoc) prefix=ibss;;
-		monitor) prefix=mon;;
-		esac
-
-		mac80211_set_ifname "$phy" "$prefix"
-	}
-
-	append active_ifnames "$ifname"
-	set_default wds 0
-	set_default powersave 0
-	json_add_string _ifname "$ifname"
-
-	if [ "$mbssid" -gt 0 ] && [ "$mode" == "ap" ]; then
-		[ "$mbssidx" -eq 0 ] && {
-			if [ -z $macaddr ]; then
-				transmitted_bssid="$(mac80211_generate_mac $phy)"
-			else
-				# uci set mac address
-				transmitted_bssid=$macaddr
-			fi
-			macidx="$(($macidx + 1))"
-		}
-		macaddr="$(mac80211_generate_mbssid_mac $phy $transmitted_bssid)"
-		mbssidx="$(($mbssidx + 1))"
-	elif [ -z "$macaddr" ]; then
-		macaddr="$(mac80211_generate_mac $phy)"
-		macidx="$(($macidx + 1))"
-	elif [ "$macaddr" = 'random' ]; then
-		macaddr="$(macaddr_random)"
-	fi
-	json_add_string _macaddr "$macaddr"
-	json_select ..
-
-
-	[ "$mode" == "ap" ] && {
-		[ -z "$wpa_psk_file" ] && hostapd_set_psk "$ifname"
-		[ -z "$vlan_file" ] && hostapd_set_vlan "$ifname"
-	}
-
-	json_select config
-
-	# It is far easier to delete and create the desired interface
-	case "$mode" in
-		ap)
-			# Hostapd will handle recreating the interface and
-			# subsequent virtual APs belonging to the same PHY
-			if [ -n "$hostapd_ctrl" ]; then
-				type=bss
-			else
-				type=interface
-			fi
-
-			mac80211_hostapd_setup_bss "$phy" "$ifname" "$macaddr" "$type" || return
-
-			[ -n "$hostapd_ctrl" ] || {
-				ap_ifname="${ifname}"
-				hostapd_ctrl="${hostapd_ctrl:-/var/run/hostapd/$ifname}"
-			}
-		;;
-	esac
-
-	json_select ..
-}
-
-mac80211_prepare_iw_htmode() {
-	case "$htmode" in
-		VHT20|HT20|HE20) iw_htmode=HT20;;
-		HT40*|VHT40|VHT160|HE40)
-			case "$band" in
-				2g)
-					case "$htmode" in
-						HT40+) iw_htmode="HT40+";;
-						HT40-) iw_htmode="HT40-";;
-						*)
-							if [ "$channel" -lt 7 ]; then
-								iw_htmode="HT40+"
-							else
-								iw_htmode="HT40-"
-							fi
-						;;
-					esac
-				;;
-				*)
-					case "$(( ($channel / 4) % 2 ))" in
-						1) iw_htmode="HT40+" ;;
-						0) iw_htmode="HT40-";;
-					esac
-				;;
-			esac
-			[ "$auto_channel" -gt 0 ] && iw_htmode="HT40+"
-		;;
-		VHT80|HE80)
-			iw_htmode="80MHZ"
-		;;
-		NONE|NOHT)
-			iw_htmode="NOHT"
-		;;
-		*) iw_htmode="" ;;
-	esac
-}
-
-mac80211_add_mesh_params() {
-	for var in $MP_CONFIG_INT $MP_CONFIG_BOOL $MP_CONFIG_STRING; do
-		eval "mp_val=\"\$$var\""
-		[ -n "$mp_val" ] && json_add_string "$var" "$mp_val"
-	done
-}
-
-mac80211_setup_adhoc() {
-	local enable=$1
-	json_get_vars bssid ssid key mcast_rate
-
-	NEWUMLIST="${NEWUMLIST}$ifname "
-
-	[ "$enable" = 0 ] && {
-		ip link set dev "$ifname" down
-		return 0
-	}
-
-	keyspec=
-	[ "$auth_type" = "wep" ] && {
-		set_default key 1
-		case "$key" in
-			[1234])
-				local idx
-				for idx in 1 2 3 4; do
-					json_get_var ikey "key$idx"
-
-					[ -n "$ikey" ] && {
-						ikey="$(($idx - 1)):$(prepare_key_wep "$ikey")"
-						[ $idx -eq $key ] && ikey="d:$ikey"
-						append keyspec "$ikey"
-					}
-				done
-			;;
-			*)
-				append keyspec "d:0:$(prepare_key_wep "$key")"
-			;;
-		esac
-	}
-
-	brstr=
-	for br in $basic_rate_list; do
-		wpa_supplicant_add_rate brstr "$br"
-	done
-
-	mcval=
-	[ -n "$mcast_rate" ] && wpa_supplicant_add_rate mcval "$mcast_rate"
-
-	local prev
-	json_set_namespace wdev_uc prev
-
-	json_add_object "$ifname"
-	json_add_string mode adhoc
-	json_add_string macaddr "$macaddr"
-	json_add_string ssid "$ssid"
-	json_add_string freq "$freq"
-	json_add_string htmode "$iw_htmode"
-	[ -n "$bssid" ] && json_add_string bssid "$bssid"
-	json_add_int beacon-interval "$beacon_int"
-	[ -n "$brstr" ] && json_add_string basic-rates "$brstr"
-	[ -n "$mcval" ] && json_add_string mcast-rate "$mcval"
-	[ -n "$keyspec" ] && json_add_string keys "$keyspec"
-	json_close_object
-
-	json_set_namespace "$prev"
-}
-
-mac80211_setup_mesh() {
-	json_get_vars ssid mesh_id mcast_rate
-
-	mcval=
-	[ -n "$mcast_rate" ] && wpa_supplicant_add_rate mcval "$mcast_rate"
-	[ -n "$mesh_id" ] && ssid="$mesh_id"
-
-	local prev
-	json_set_namespace wdev_uc prev
-
-	json_add_object "$ifname"
-	json_add_string mode mesh
-	json_add_string macaddr "$macaddr"
-	json_add_string ssid "$ssid"
-	json_add_string freq "$freq"
-	json_add_string htmode "$iw_htmode"
-	[ -n "$mcval" ] && json_add_string mcast-rate "$mcval"
-	json_add_int beacon-interval "$beacon_int"
-	mac80211_add_mesh_params
-
-	json_close_object
-
-	json_set_namespace "$prev"
-}
-
-mac80211_setup_monitor() {
-	local prev
-	json_set_namespace wdev_uc prev
-
-	json_add_object "$ifname"
-	json_add_string mode monitor
-	[ -n "$freq" ] && json_add_string freq "$freq"
-	json_add_string htmode "$iw_htmode"
-	json_close_object
-
-	json_set_namespace "$prev"
-}
-
-mac80211_set_vif_txpower() {
-	local name="$1"
-
-	json_select config
-	json_get_var ifname _ifname
-	json_get_vars vif_txpower
-	json_select ..
-
-	[ -z "$vif_txpower" ] || iw dev "$ifname" set txpower fixed "${vif_txpower%%.*}00"
-}
-
-wpa_supplicant_init_config() {
-	json_set_namespace wpa_supp prev
-
-	json_init
-	json_add_array config
-
-	json_set_namespace "$prev"
-}
-
-wpa_supplicant_add_interface() {
-	local ifname="$1"
-	local mode="$2"
-	local prev
-
-	_wpa_supplicant_common "$ifname"
-
-	json_set_namespace wpa_supp prev
-
-	json_add_object
-	json_add_string ctrl "$_rpath"
-	json_add_string iface "$ifname"
-	json_add_string mode "$mode"
-	json_add_string config "$_config"
-	json_add_string macaddr "$macaddr"
-	[ -n "$network_bridge" ] && json_add_string bridge "$network_bridge"
-	[ -n "$wds" ] && json_add_boolean 4addr "$wds"
-	json_add_boolean powersave "$powersave"
-	[ "$mode" = "mesh" ] && mac80211_add_mesh_params
-	json_close_object
-
-	json_set_namespace "$prev"
-
-	wpa_supp_init=1
-}
-
-wpa_supplicant_set_config() {
-	local phy="$1"
-	local prev
-
-	json_set_namespace wpa_supp prev
-	json_close_array
-	json_add_string phy "$phy"
-	json_add_boolean defer 1
-	local data="$(json_dump)"
-
-	json_cleanup
-	json_set_namespace "$prev"
-
-	ubus -S -t 0 wait_for wpa_supplicant || {
-		[ -n "$wpa_supp_init" ] || return 0
-
-		ubus wait_for wpa_supplicant
-	}
-
-	local supplicant_res="$(ubus_call wpa_supplicant config_set "$data")"
-	ret="$?"
-	[ "$ret" != 0 -o -z "$supplicant_res" ] && wireless_setup_vif_failed WPA_SUPPLICANT_FAILED
-
-	wireless_add_process "$(jsonfilter -s "$supplicant_res" -l 1 -e @.pid)" "/usr/sbin/wpa_supplicant" 1 1
-
-}
-
-hostapd_set_config() {
-
-	if [ "$inconsistent_country" -eq 1 ]; then
-		echo "ERROR: Please use the same country for all the radios."
-		wireless_setup_failed HOSTAPD_START_FAILED
-		drv_mac80211_teardown
-		return
-	fi
-
-	[ -n "$hostapd_ctrl" ] || {
-		ubus_call hostapd config_set '{ "phy": "'"$phy"'", "config": "", "prev_config": "'"${hostapd_conf_file}.prev"'" }' > /dev/null
-		return 0;
-	}
-
-	ubus wait_for hostapd
-
-	# each phy sleeps different times to prevent for ubus race condition.
-	if [ "$phy" = "phy1" ]; then
-		sleep 3;
-	elif [ "$phy" = "phy2" ]; then
-		sleep 6;
-	fi
-
-	local hostapd_res="$(ubus_call hostapd config_set "{ \"phy\": \"$phy\", \"config\":\"${hostapd_conf_file}\", \"prev_config\": \"${hostapd_conf_file}.prev\"}")"
-	ret="$?"
-	[ "$ret" != 0 -o -z "$hostapd_res" ] && {
-		wireless_setup_failed HOSTAPD_START_FAILED
-		return
-	}
-	wireless_add_process "$(jsonfilter -s "$hostapd_res" -l 1 -e @.pid)" "/usr/sbin/hostapd" 1 1
-}
-
-
-wpa_supplicant_start() {
-	local phy="$1"
-
-	[ -n "$wpa_supp_init" ] || return 0
-
-	ubus_call wpa_supplicant config_set '{ "phy": "'"$phy"'" }' > /dev/null
-}
-
-mac80211_setup_supplicant() {
-	local enable=$1
-	local add_sp=0
-
-	wpa_supplicant_prepare_interface "$ifname" nl80211 || return 1
-
-	if [ "$mode" = "sta" ]; then
-		wpa_supplicant_add_network "$ifname"
-	else
-		wpa_supplicant_add_network "$ifname" "$freq" "$htmode" "$hostapd_noscan"
-	fi
-
-	wpa_supplicant_add_interface "$ifname" "$mode"
-
-	return 0
-}
-
-mac80211_setup_vif() {
-	local name="$1"
-	local failed
-
-	json_select config
-	json_get_var ifname _ifname
-	json_get_var macaddr _macaddr
-	json_get_vars mode wds powersave
-
-	set_default powersave 0
-	set_default wds 0
-
-	case "$mode" in
-		mesh)
-			json_get_vars $MP_CONFIG_INT $MP_CONFIG_BOOL $MP_CONFIG_STRING
-			wireless_vif_parse_encryption
-			[ -z "$htmode" ] && htmode="NOHT";
-			if wpa_supplicant -vmesh; then
-				mac80211_setup_supplicant || failed=1
-			else
-				mac80211_setup_mesh
-			fi
-		;;
-		adhoc)
-			wireless_vif_parse_encryption
-			if [ "$wpa" -gt 0 -o "$auto_channel" -gt 0 ]; then
-				mac80211_setup_supplicant || failed=1
-			else
-				mac80211_setup_adhoc
-			fi
-		;;
-		sta)
-			mac80211_setup_supplicant || failed=1
-		;;
-		monitor)
-			mac80211_setup_monitor
-		;;
-	esac
-
-	json_select ..
-	[ -n "$failed" ] || wireless_add_vif "$name" "$ifname"
-
-	echo "Setup SMP Affinity"
-	/sbin/smp-mt76.sh
-}
-
-get_freq() {
-	local phy="$1"
-	local channel="$2"
-	local band="$3"
-
-	case "$band" in
-		2g) band="1:";;
-		5g) band="2:";;
-		60g) band="3:";;
-		6g) band="4:";;
-	esac
-
-	iw "$phy" info | awk -v band="$band" -v channel="[$channel]" '
-
-$1 ~ /Band/ {
-	band_match = band == $2
-}
-
-band_match && $3 == "MHz" && $4 == channel {
-	print $2
-	exit
-}
-'
-}
-
-chan_is_dfs() {
-	local phy="$1"
-	local chan="$2"
-	iw "$phy" info | grep -E -m1 "(\* ${chan:-....} MHz${chan:+|\\[$chan\\]})" | grep -q "MHz.*radar detection"
-	return $!
-}
-
-mac80211_set_noscan() {
-	hostapd_noscan=1
-}
-
-drv_mac80211_cleanup() {
-	hostapd_common_cleanup
-}
-
-mac80211_reset_config() {
-	local phy="$1"
-
-	hostapd_conf_file="/var/run/hostapd-$phy.conf"
-	ubus_call hostapd config_set '{ "phy": "'"$phy"'", "config": "", "prev_config": "'"$hostapd_conf_file"'" }' > /dev/null
-	ubus_call wpa_supplicant config_set '{ "phy": "'"$phy"'", "config": [] }' > /dev/null
-	wdev_tool "$phy" set_config '{}'
-}
-
-mac80211_count_ap() {
-	total_num_ap=$(($total_num_ap + 1))
-}
-
-country_consistent_check() {
-	local i
-	inconsistent_country=0
-	country_list="$(cat /etc/config/wireless | grep country | cut -d ' ' -f3 | tr -s "'\n" ' ')"
-	for i in $country_list
-	do
-		ret="$(echo $country_list | awk '{print ($2 == "" || $1 == $2)}')"
-		[ $ret = '0' ] && {
-			inconsistent_country=1
-			return
-		}
-		country_list="$(echo $country_list | sed -r 's/[A-Z]{2}( )*//')"
-	done
-}
-
-drv_mac80211_setup() {
-	json_select config
-	json_get_vars \
-		phy macaddr path \
-		country chanbw distance \
-		txpower \
-		rxantenna txantenna \
-		frag rts beacon_int:100 htmode \
-		num_global_macaddr:1 multiple_bssid \
-		sr_enable sr_enhanced
-	json_get_values basic_rate_list basic_rate
-	json_get_values scan_list scan_list
-	json_select ..
-
-	json_select data && {
-		json_get_var prev_rxantenna rxantenna
-		json_get_var prev_txantenna txantenna
-		json_select ..
-	}
-
-	find_phy || {
-		echo "Could not find PHY for device '$1'"
-		wireless_set_retry 0
-		return 1
-	}
-
-	local wdev
-	local cwdev
-	local found
-
-	# convert channel to frequency
-	[ "$auto_channel" -gt 0 ] || freq="$(get_freq "$phy" "$channel" "$band")"
-
-	[ -n "$country" ] && {
-		iw reg get | grep -q "^country $country:" || {
-			iw reg set "$country"
-			sleep 1
-		}
-	}
-
-	hostapd_conf_file="/var/run/hostapd-$phy.conf"
-
-	macidx=0
-	staidx=0
-	mbssidx=0
-
-	if [ "$phy" = "phy1" ]; then
-		macidx=20;
-	elif [ "$phy" = "phy2" ]; then
-		macidx=40;
-	fi
-
-	[ -n "$chanbw" ] && {
-		for file in /sys/kernel/debug/ieee80211/$phy/ath9k*/chanbw /sys/kernel/debug/ieee80211/$phy/ath5k/bwmode; do
-			[ -f "$file" ] && echo "$chanbw" > "$file"
-		done
-	}
-
-	set_default rxantenna 0xffffffff
-	set_default txantenna 0xffffffff
-	set_default distance 0
-
-	[ "$txantenna" = "all" ] && txantenna=0xffffffff
-	[ "$rxantenna" = "all" ] && rxantenna=0xffffffff
-
-	[ "$rxantenna" = "$prev_rxantenna" -a "$txantenna" = "$prev_txantenna" ] || mac80211_reset_config "$phy"
-	wireless_set_data phy="$phy" txantenna="$txantenna" rxantenna="$rxantenna"
-
-	iw phy "$phy" set antenna $txantenna $rxantenna >/dev/null 2>&1
-	iw phy "$phy" set distance "$distance" >/dev/null 2>&1
-
-	if [ -n "$txpower" ]; then
-		iw phy "$phy" set txpower fixed "${txpower%%.*}00"
-	else
-		iw phy "$phy" set txpower auto
-	fi
-
-	[ -n "$frag" ] && iw phy "$phy" set frag "${frag%%.*}"
-	[ -n "$rts" ] && iw phy "$phy" set rts "${rts%%.*}"
-
-	has_ap=
-	hostapd_ctrl=
-	ap_ifname=
-	hostapd_noscan=
-	wpa_supp_init=
-	for_each_interface "ap" mac80211_check_ap
-
-	[ -f "$hostapd_conf_file" ] && mv "$hostapd_conf_file" "$hostapd_conf_file.prev"
-
-	for_each_interface "sta adhoc mesh" mac80211_set_noscan
-	[ -n "$has_ap" ] && mac80211_hostapd_setup_base "$phy"
-
-	local prev
-	json_set_namespace wdev_uc prev
-	json_init
-	json_set_namespace "$prev"
-
-	wpa_supplicant_init_config
-
-	total_num_ap=0
-	max_mbssid=1
-	for_each_interface "ap" mac80211_count_ap
-	total_num_ap=$(($total_num_ap - 1))
-	while [ $total_num_ap -gt 0 ]
-	do
-		total_num_ap=$(($total_num_ap >> 1))
-		max_mbssid=$(($max_mbssid << 1))
-	done
-
-	mac80211_prepare_iw_htmode
-	active_ifnames=
-	for_each_interface "ap sta adhoc mesh monitor" mac80211_prepare_vif
-	for_each_interface "ap sta adhoc mesh monitor" mac80211_setup_vif
-
-	country_consistent_check
-
-	[ -x /usr/sbin/wpa_supplicant ] && wpa_supplicant_set_config "$phy"
-	[ -x /usr/sbin/hostapd ] && hostapd_set_config "$phy"
-
-	[ -n "$sr_enable" ] && echo "$sr_enable" > /sys/kernel/debug/ieee80211/$phy/mt76/sr_enable
-	[ -n "$sr_enhanced" ] && echo "$sr_enhanced" > /sys/kernel/debug/ieee80211/$phy/mt76/sr_enhanced_enable
-
-	[ -x /usr/sbin/wpa_supplicant ] && wpa_supplicant_start "$phy"
-
-	json_set_namespace wdev_uc prev
-	wdev_tool "$phy" set_config "$(json_dump)" $active_ifnames
-	json_set_namespace "$prev"
-
-	for_each_interface "ap sta adhoc mesh monitor" mac80211_set_vif_txpower
-	wireless_set_up
-
-	echo /tmp/%e.core > /proc/sys/kernel/core_pattern
-}
-
-_list_phy_interfaces() {
-	local phy="$1"
-	if [ -d "/sys/class/ieee80211/${phy}/device/net" ]; then
-		ls "/sys/class/ieee80211/${phy}/device/net" 2>/dev/null;
-	else
-		ls "/sys/class/ieee80211/${phy}/device" 2>/dev/null | grep net: | sed -e 's,net:,,g'
-	fi
-}
-
-list_phy_interfaces() {
-	local phy="$1"
-
-	for dev in $(_list_phy_interfaces "$phy"); do
-		readlink "/sys/class/net/${dev}/phy80211" | grep -q "/${phy}\$" || continue
-		echo "$dev"
-	done
-}
-
-drv_mac80211_teardown() {
-	json_select data
-	json_get_vars phy
-	json_select ..
-	[ -n "$phy" ] || {
-		echo "Bug: PHY is undefined for device '$1'"
-		return 1
-	}
-
-	# each phy sleeps different times to prevent for ubus race condition.
-	if [ "$phy" = "phy1" ]; then
-		sleep 3;
-	elif [ "$phy" = "phy0" ]; then
-		sleep 6;
-	fi
-
-	mac80211_reset_config "$phy"
-
-	for wdev in $(list_phy_interfaces "$phy"); do
-		ip link set dev "$wdev" down
-		iw dev "$wdev" del
-	done
-}
-
-add_driver mac80211
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/wifi/mac80211.sh b/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/wifi/mac80211.sh
deleted file mode 100644
index d8a1756..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/config/wifi-scripts/files/lib/wifi/mac80211.sh
+++ /dev/null
@@ -1,331 +0,0 @@
-#!/bin/sh
-
-append DRIVERS "mac80211"
-
-check_mac80211_device() {
-	local device="$1"
-	local path="$2"
-	local macaddr="$3"
-
-	[ -n "$found" ] && return 0
-
-	phy_path=
-	config_get phy "$device" phy
-	json_select wlan
-	[ -n "$phy" ] && case "$phy" in
-		phy*)
-			[ -d /sys/class/ieee80211/$phy ] && \
-				phy_path="$(iwinfo nl80211 path "$dev")"
-		;;
-		*)
-			if json_is_a "$phy" object; then
-				json_select "$phy"
-				json_get_var phy_path path
-				json_select ..
-			elif json_is_a "${phy%.*}" object; then
-				json_select "${phy%.*}"
-				json_get_var phy_path path
-				json_select ..
-				phy_path="$phy_path+${phy##*.}"
-			fi
-		;;
-	esac
-	json_select ..
-	[ -n "$phy_path" ] || config_get phy_path "$device" path
-	[ -n "$path" -a "$phy_path" = "$path" ] && {
-		found=1
-		return 0
-	}
-
-	config_get dev_macaddr "$device" macaddr
-
-	[ -n "$macaddr" -a "$dev_macaddr" = "$macaddr" ] && found=1
-
-	return 0
-}
-
-
-__get_band_defaults() {
-	local phy="$1"
-
-	( iw phy "$phy" info; echo ) | awk '
-BEGIN {
-        bands = ""
-}
-
-($1 == "Band" || $1 == "") && band {
-        if (channel) {
-		mode="NOHT"
-		if (ht) mode="HT20"
-		if (vht && band != "1:") mode="VHT80"
-		if (he) mode="HE80"
-		if (he && band == "1:") mode="HE20"
-		if (eht && band == "2:") mode="EHT160"
-		if (eht && band == "4:") mode="EHT320"
-		if (eht && band == "1:") mode="EHT20"
-                sub("\\[", "", channel)
-                sub("\\]", "", channel)
-                bands = bands band channel ":" mode " "
-        }
-        band=""
-}
-
-$1 == "Band" {
-        band = $2
-        channel = ""
-	vht = ""
-	ht = ""
-	he = ""
-	eht = ""
-}
-
-$0 ~ "Capabilities:" {
-	ht=1
-}
-
-$0 ~ "VHT Capabilities" {
-	vht=1
-}
-
-$0 ~ "HE Iftypes" {
-	he=1
-}
-
-$0 ~ "EHT Iftypes" {
-	eht=1
-}
-
-$0 ~ / *HE MAC Capabilities \(0x000000000000\)/ {
-	he=0
-}
-
-$0 ~ / *EHT MAC Capabilities \(0x0000\)/ {
-	eht=0
-}
-
-$1 == "*" && $3 == "MHz" && $0 !~ /disabled/ && band && !channel {
-        channel = $4
-}
-
-END {
-        print bands
-}'
-}
-
-get_band_defaults() {
-	local phy="$1"
-
-	for c in $(__get_band_defaults "$phy"); do
-		local band="${c%%:*}"
-		c="${c#*:}"
-		local chan="${c%%:*}"
-		c="${c#*:}"
-		local mode="${c%%:*}"
-
-		case "$band" in
-			1) band=2g;;
-			2) band=5g;;
-			3) band=60g;;
-			4) band=6g;;
-			*) band="";;
-		esac
-
-		[ -n "$band" ] || continue
-		[ -n "$mode_band" -a "$band" = "6g" ] && return
-
-		# hardcode for default band selection in MLO codebase
-		[ "$phy" = "phy0" -a "$band" != "2g" ] && continue
-		[ "$phy" = "phy1" -a "$band" != "5g" ] && continue
-		[ "$phy" = "phy2" -a "$band" != "6g" ] && continue
-
-		mode_band="$band"
-		channel="$chan"
-		htmode="$mode"
-		if [ "$band" = "6g" ]
-		then
-			encryption=sae
-			key=12345678
-			sae_pwe=2
-			ieee80211w=2
-			channel=37
-			mbssid=1
-			mbo=1
-			band_idx=2
-		elif [ "$band" = "5g" ]
-		then
-			noscan=1
-			encryption=none
-			rnr=1
-			background_radar=1
-			mbo=0
-			band_idx=1
-		else
-			noscan=1
-			encryption=none
-			rnr=1
-			mbo=0
-			band_idx=0
-		fi
-	done
-}
-
-check_devidx() {
-	case "$1" in
-	radio[0-9]*)
-		local idx="${1#radio}"
-		[ "$devidx" -ge "${1#radio}" ] && devidx=$((idx + 1))
-		;;
-	esac
-}
-
-check_board_phy() {
-	local name="$2"
-
-	json_select "$name"
-	json_get_var phy_path path
-	json_select ..
-
-	if [ "$path" = "$phy_path" ]; then
-		board_dev="$name"
-	elif [ "${path%+*}" = "$phy_path" ]; then
-		fallback_board_dev="$name.${path#*+}"
-	fi
-}
-
-detect_mac80211() {
-	devidx=0
-	disabled=0
-	config_load wireless
-	config_foreach check_devidx wifi-device
-
-	json_load_file /etc/board.json
-
-	# generate random bytes for macaddr
-	rand=$(hexdump -C /dev/urandom | head -n 1 &)
-	killall hexdump
-
-	if (dmesg | grep -q "WM_TM"); then
-		disabled=1
-	fi
-
-	for _dev in /sys/class/ieee80211/*; do
-		[ -e "$_dev" ] || continue
-
-		dev="${_dev##*/}"
-
-		mode_band=""
-		channel=""
-		htmode=""
-		ht_capab=""
-		encryption=""
-		noscan=""
-		key=""
-		sae_pwe=""
-		ieee80211w=""
-		mbssid=""
-		rnr=""
-		background_radar=""
-		band_idx=""
-
-		get_band_defaults "$dev"
-
-		path="$(iwinfo nl80211 path "$dev")"
-		macaddr="$(cat /sys/class/ieee80211/${dev}/macaddress)"
-
-		# work around phy rename related race condition
-		[ -n "$path" -o -n "$macaddr" ] || continue
-
-		board_dev=
-		fallback_board_dev=
-		json_for_each_item check_board_phy wlan
-		[ -n "$board_dev" ] || board_dev="$fallback_board_dev"
-		[ -n "$board_dev" ] && dev="$board_dev"
-
-		found=
-		config_foreach check_mac80211_device wifi-device "$path" "$macaddr"
-		[ -n "$found" ] && continue
-
-		name="radio${devidx}"
-		devidx=$(($devidx + 1))
-		case "$dev" in
-			phy*)
-				if [ -n "$path" ]; then
-					dev_id="set wireless.${name}.path='$path'"
-				else
-					dev_id="set wireless.${name}.macaddr='$macaddr'"
-				fi
-				;;
-			*)
-				dev_id="set wireless.${name}.phy='$dev'"
-				;;
-		esac
-
-		macaddr=""
-		if (dmesg | grep -q "eeprom load fail"); then
-			for i in $(seq 2 3); do
-				macaddr=${macaddr}:$(echo $rand | cut -d ' ' -f $i)
-			done
-			macaddr="00:0$(($devidx + 1)):55:66${macaddr}"
-		fi
-
-		tx_burst=""
-		if (lspci | grep -q "7992"); then
-			tx_burst=0.0
-		fi
-
-		uci -q batch <<-EOF
-			set wireless.${name}=wifi-device
-			set wireless.${name}.type=mac80211
-			${dev_id}
-			set wireless.${name}.channel=${channel}
-			set wireless.${name}.band=${mode_band}
-			set wireless.${name}.htmode=$htmode
-			set wireless.${name}.country='US'
-			set wireless.${name}.noscan=${noscan}
-			set wireless.${name}.disabled=${disabled}
-EOF
-		[ -n "$mbssid" ] && {
-			uci -q set wireless.${name}.mbssid=${mbssid}
-		}
-		[ -n "$rnr" ] && {
-			uci -q set wireless.${name}.rnr=${rnr}
-		}
-		[ -n "$background_radar" ] && {
-			uci -q set wireless.${name}.background_radar=${background_radar}
-		}
-		[ -n "$tx_burst" ] && {
-			uci -q set wireless.${name}.tx_burst=${tx_burst}
-		}
-		[ -n "$band_idx" ] && {
-			uci -q set wireless.${name}.band_idx=${band_idx}
-		}
-
-		uci -q batch <<-EOF
-			set wireless.default_${name}=wifi-iface
-			set wireless.default_${name}.device=${name}
-			set wireless.default_${name}.network=lan
-			set wireless.default_${name}.mode=ap
-			set wireless.default_${name}.ssid=OpenWrt-${mode_band}
-			set wireless.default_${name}.encryption=${encryption}
-EOF
-
-		# calibrated board will use eeprom macaddress, not ramdom address
-		[ -n "$macaddr" ] && {
-			uci -q set wireless.default_${name}.macaddr=${macaddr}
-		}
-
-		[ -n "$key" ] && {
-			uci -q set wireless.default_${name}.key=${key}
-		}
-		[ -n "$sae_pwe" ] && {
-			uci -q set wireless.default_${name}.sae_pwe=${sae_pwe}
-		}
-		[ -n "$ieee80211w" ] && {
-			uci -q set wireless.default_${name}.ieee80211w=${ieee80211w}
-		}
-		[ -n "$mbo" ] && {
-			uci -q set wireless.default_${name}.mbo=${mbo}
-		}
-		uci -q commit wireless
-	done
-}
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/services/hostapd/files/hostapd.uc b/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/services/hostapd/files/hostapd.uc
deleted file mode 100644
index 7e9fde4..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/services/hostapd/files/hostapd.uc
+++ /dev/null
@@ -1,936 +0,0 @@
-let libubus = require("ubus");
-import { open, readfile } from "fs";
-import { wdev_create, wdev_remove, is_equal, vlist_new, phy_is_fullmac, phy_open } from "common";
-
-let ubus = libubus.connect(null, 60);
-
-hostapd.data.config = {};
-hostapd.data.pending_config = {};
-
-hostapd.data.file_fields = {
-	vlan_file: true,
-	wpa_psk_file: true,
-	accept_mac_file: true,
-	deny_mac_file: true,
-	eap_user_file: true,
-	ca_cert: true,
-	server_cert: true,
-	server_cert2: true,
-	private_key: true,
-	private_key2: true,
-	dh_file: true,
-	eap_sim_db: true,
-};
-
-function iface_remove(cfg)
-{
-	if (!cfg || !cfg.bss || !cfg.bss[0] || !cfg.bss[0].ifname)
-		return;
-
-	for (let bss in cfg.bss)
-		if (!bss.mld_ap || bss.mld_primary == 1)
-			wdev_remove(bss.ifname);
-}
-
-function iface_gen_config(phy, config, start_disabled)
-{
-	let str = `data:
-${join("\n", config.radio.data)}
-channel=${config.radio.channel}
-`;
-
-	for (let i = 0; i < length(config.bss); i++) {
-		let bss = config.bss[i];
-		let type = i > 0 ? "bss" : "interface";
-		let nasid = bss.nasid ?? replace(bss.bssid, ":", "");
-
-		str += `
-${type}=${bss.ifname}
-bssid=${bss.bssid}
-${join("\n", bss.data)}
-nas_identifier=${nasid}
-`;
-		if (start_disabled)
-			str += `
-start_disabled=1
-`;
-	}
-
-	return str;
-}
-
-function iface_freq_info(iface, config, params)
-{
-	let freq = params.frequency;
-	let bw320_offset = params.bw320_offset;
-	let band_idx = params.band_idx;
-	if (!freq)
-		return null;
-
-	let sec_offset = params.sec_chan_offset;
-	if (sec_offset != -1 && sec_offset != 1)
-		sec_offset = 0;
-
-	let width = 0;
-	if (params.ch_width >= 0){
-		width = params.ch_width;
-	} else {
-		for (let line in config.radio.data) {
-			if (!sec_offset && match(line, /^ht_capab=.*HT40/)) {
-				sec_offset = null; // auto-detect
-				continue;
-			}
-
-			let val = match(line, /^(vht_oper_chwidth|he_oper_chwidth|eht_oper_chwidth)=(\d+)/);
-			if (!val)
-				continue;
-
-			val = int(val[2]);
-			if (val > width)
-				width = val;
-		}
-	}
-
-	if (freq < 4000)
-		width = 0;
-
-	return hostapd.freq_info(freq, sec_offset, width, bw320_offset, band_idx);
-}
-
-function iface_add(phy, config, phy_status)
-{
-	let config_inline = iface_gen_config(phy, config, !!phy_status);
-
-	let bss = config.bss[0];
-	let ret = hostapd.add_iface(`bss_config=${phy}:${config_inline}`);
-	if (ret < 0)
-		return false;
-
-	if (!phy_status)
-		return true;
-
-	let iface = hostapd.interfaces[phy];
-	if (!iface)
-		return false;
-
-	let freq_info = iface_freq_info(iface, config, phy_status);
-
-	return iface.start(freq_info) >= 0;
-}
-
-function iface_config_macaddr_list(config)
-{
-	let macaddr_list = {};
-	for (let i = 0; i < length(config.bss); i++) {
-		let bss = config.bss[i];
-		if (!bss.default_macaddr)
-			macaddr_list[bss.bssid] = i;
-	}
-
-	return macaddr_list;
-}
-
-function iface_update_supplicant_macaddr(phy, config)
-{
-	let macaddr_list = [];
-	for (let i = 0; i < length(config.bss); i++)
-		push(macaddr_list, config.bss[i].bssid);
-	ubus.defer("wpa_supplicant", "phy_set_macaddr_list", { phy: phy, macaddr: macaddr_list });
-}
-
-function __iface_pending_next(pending, state, ret, data)
-{
-	let config = pending.config;
-	let phydev = pending.phydev;
-	let phy = pending.phy;
-	let bss = config.bss[0];
-
-	if (pending.defer)
-		pending.defer.abort();
-	delete pending.defer;
-	switch (state) {
-	case "init":
-		let macaddr_list = [];
-		for (let i = 0; i < length(config.bss); i++)
-			push(macaddr_list, config.bss[i].bssid);
-		pending.call("wpa_supplicant", "phy_set_macaddr_list", { phy: phy, macaddr: macaddr_list });
-		return "create_bss";
-	case "create_bss":
-		if (!bss.mld_ap || bss.mld_primary == 1) {
-			let err = wdev_create(config.single_hw == 1 ? "phy0" : phy, bss.ifname, { mode: "ap" });
-			if (err) {
-				hostapd.printf(`Failed to create ${bss.ifname} on phy ${phy}: ${err}`);
-				return null;
-			}
-		}
-
-		pending.call("wpa_supplicant", "phy_status", { phy: bss.mld_ap ? "phy0" : phy });
-		return "check_phy";
-	case "check_phy":
-		let phy_status = data;
-		if (phy_status && phy_status.state == "COMPLETED") {
-			if (iface_add(phy, config, phy_status))
-				return "done";
-
-			hostapd.printf(`Failed to bring up phy ${phy} ifname=${bss.ifname} with supplicant provided frequency`);
-		}
-		pending.call("wpa_supplicant", "phy_set_state", { phy: bss.mld_ap ? "phy0" : phy, stop: true });
-		return "wpas_stopped";
-	case "wpas_stopped":
-		if (!iface_add(phy, config))
-			hostapd.printf(`hostapd.add_iface failed for phy ${phy} ifname=${bss.ifname}`);
-		let iface = hostapd.interfaces[phy];
-		if (!bss.mld_ap)
-			pending.call("wpa_supplicant", "phy_set_state", { phy: phy, stop: false });
-		else if (iface.is_mld_finished())
-			pending.call("wpa_supplicant", "phy_set_state", { phy: "phy0", stop: false });
-		return null;
-	case "done":
-	default:
-		delete hostapd.data.pending_config[phy];
-		break;
-	}
-}
-
-function iface_pending_next(ret, data)
-{
-	let pending = true;
-	let cfg = this;
-
-	while (pending) {
-		this.next_state = __iface_pending_next(cfg, this.next_state, ret, data);
-		if (!this.next_state) {
-			__iface_pending_next(cfg, "done");
-			return;
-		}
-		pending = !this.defer;
-	}
-}
-
-function iface_pending_abort()
-{
-	this.next_state = "done";
-	this.next();
-}
-
-function iface_pending_ubus_call(obj, method, arg)
-{
-	let ubus = hostapd.data.ubus;
-	let pending = this;
-	this.defer = ubus.defer(obj, method, arg, (ret, data) => { delete pending.defer; pending.next(ret, data) });
-}
-
-const iface_pending_proto = {
-	next: iface_pending_next,
-	call: iface_pending_ubus_call,
-	abort: iface_pending_abort,
-};
-
-function iface_pending_init(phydev, config)
-{
-	let phy = phydev.name;
-
-	let pending = proto({
-		next_state: "init",
-		phydev: phydev,
-		phy: phy,
-		config: config,
-		next: iface_pending_next,
-	}, iface_pending_proto);
-
-	hostapd.data.pending_config[phy] = pending;
-	pending.next();
-}
-
-function iface_restart(phydev, config, old_config)
-{
-	let phy = phydev.name;
-	let pending = hostapd.data.pending_config[phy];
-
-	if (pending)
-		pending.abort();
-
-	hostapd.remove_iface(phy);
-	iface_remove(old_config);
-	iface_remove(config);
-
-	if (!config.bss || !config.bss[0]) {
-		hostapd.printf(`No bss for phy ${phy}`);
-		return;
-	}
-
-	phydev.macaddr_init(iface_config_macaddr_list(config));
-	for (let i = 0; i < length(config.bss); i++) {
-		let bss = config.bss[i];
-		if (bss.default_macaddr)
-			bss.bssid = phydev.macaddr_next();
-	}
-
-	iface_pending_init(phydev, config);
-}
-
-function array_to_obj(arr, key, start)
-{
-	let obj = {};
-
-	start ??= 0;
-	for (let i = start; i < length(arr); i++) {
-		let cur = arr[i];
-		obj[cur[key]] = cur;
-	}
-
-	return obj;
-}
-
-function find_array_idx(arr, key, val)
-{
-	for (let i = 0; i < length(arr); i++)
-		if (arr[i][key] == val)
-			return i;
-
-	return -1;
-}
-
-function bss_reload_psk(bss, config, old_config)
-{
-	if (is_equal(old_config.hash.wpa_psk_file, config.hash.wpa_psk_file))
-		return;
-
-	old_config.hash.wpa_psk_file = config.hash.wpa_psk_file;
-	if (!is_equal(old_config, config))
-		return;
-
-	let ret = bss.ctrl("RELOAD_WPA_PSK");
-	ret ??= "failed";
-
-	hostapd.printf(`Reload WPA PSK file for bss ${config.ifname}: ${ret}`);
-}
-
-function remove_file_fields(config)
-{
-	return filter(config, (line) => !hostapd.data.file_fields[split(line, "=")[0]]);
-}
-
-function bss_remove_file_fields(config)
-{
-	let new_cfg = {};
-
-	for (let key in config)
-		new_cfg[key] = config[key];
-	new_cfg.data = remove_file_fields(new_cfg.data);
-	new_cfg.hash = {};
-	for (let key in config.hash)
-		new_cfg.hash[key] = config.hash[key];
-	delete new_cfg.hash.wpa_psk_file;
-	delete new_cfg.hash.vlan_file;
-
-	return new_cfg;
-}
-
-function bss_config_hash(config)
-{
-	return hostapd.sha1(remove_file_fields(config) + "");
-}
-
-function bss_find_existing(config, prev_config, prev_hash)
-{
-	let hash = bss_config_hash(config.data);
-
-	for (let i = 0; i < length(prev_config.bss); i++) {
-		if (!prev_hash[i] || hash != prev_hash[i])
-			continue;
-
-		prev_hash[i] = null;
-		return i;
-	}
-
-	return -1;
-}
-
-function get_config_bss(config, idx)
-{
-	if (!config.bss[idx]) {
-		hostapd.printf(`Invalid bss index ${idx}`);
-		return null;
-	}
-
-	let ifname = config.bss[idx].ifname;
-	if (!ifname)
-		hostapd.printf(`Could not find bss ${config.bss[idx].ifname}`);
-
-	return hostapd.bss[ifname];
-}
-
-function iface_reload_config(phydev, config, old_config)
-{
-	let phy = phydev.name;
-
-	if (!old_config || !is_equal(old_config.radio, config.radio))
-		return false;
-
-	if (is_equal(old_config.bss, config.bss))
-		return true;
-
-	if (hostapd.data.pending_config[phy])
-		return false;
-
-	if (!old_config.bss || !old_config.bss[0])
-		return false;
-
-	let iface = hostapd.interfaces[phy];
-	let iface_name = old_config.bss[0].ifname;
-	if (!iface) {
-		hostapd.printf(`Could not find previous interface ${iface_name}`);
-		return false;
-	}
-
-	let first_bss = hostapd.bss[iface_name];
-	if (!first_bss) {
-		hostapd.printf(`Could not find bss of previous interface ${iface_name}`);
-		return false;
-	}
-
-	let macaddr_list = iface_config_macaddr_list(config);
-	let bss_list = [];
-	let bss_list_cfg = [];
-	let prev_bss_hash = [];
-
-	for (let bss in old_config.bss) {
-		let hash = bss_config_hash(bss.data);
-		push(prev_bss_hash, bss_config_hash(bss.data));
-	}
-
-	// Step 1: find (possibly renamed) interfaces with the same config
-	// and store them in the new order (with gaps)
-	for (let i = 0; i < length(config.bss); i++) {
-		let prev;
-
-		// For fullmac devices, the first interface needs to be preserved,
-		// since it's treated as the master
-		if (!i && phy_is_fullmac(phy)) {
-			prev = 0;
-			prev_bss_hash[0] = null;
-		} else {
-			prev = bss_find_existing(config.bss[i], old_config, prev_bss_hash);
-		}
-		if (prev < 0)
-			continue;
-
-		let cur_config = config.bss[i];
-		let prev_config = old_config.bss[prev];
-
-		let prev_bss = get_config_bss(old_config, prev);
-		if (!prev_bss)
-			return false;
-
-		// try to preserve MAC address of this BSS by reassigning another
-		// BSS if necessary
-		if (cur_config.default_macaddr &&
-		    !macaddr_list[prev_config.bssid]) {
-			macaddr_list[prev_config.bssid] = i;
-			cur_config.bssid = prev_config.bssid;
-		}
-
-		bss_list[i] = prev_bss;
-		bss_list_cfg[i] = old_config.bss[prev];
-	}
-
-	if (config.mbssid && !bss_list_cfg[0]) {
-		hostapd.printf("First BSS changed with MBSSID enabled");
-		return false;
-	}
-
-	// Step 2: if none were found, rename and preserve the first one
-	if (length(bss_list) == 0) {
-		// can't change the bssid of the first bss
-		if (config.bss[0].bssid != old_config.bss[0].bssid) {
-			if (!config.bss[0].default_macaddr) {
-				hostapd.printf(`BSSID of first interface changed: ${lc(old_config.bss[0].bssid)} -> ${lc(config.bss[0].bssid)}`);
-				return false;
-			}
-
-			config.bss[0].bssid = old_config.bss[0].bssid;
-		}
-
-		let prev_bss = get_config_bss(old_config, 0);
-		if (!prev_bss)
-			return false;
-
-		macaddr_list[config.bss[0].bssid] = 0;
-		bss_list[0] = prev_bss;
-		bss_list_cfg[0] = old_config.bss[0];
-		prev_bss_hash[0] = null;
-	}
-
-	// Step 3: delete all unused old interfaces
-	for (let i = 0; i < length(prev_bss_hash); i++) {
-		if (!prev_bss_hash[i])
-			continue;
-
-		let prev_bss = get_config_bss(old_config, i);
-		if (!prev_bss)
-			return false;
-
-		let ifname = old_config.bss[i].ifname;
-		hostapd.printf(`Remove bss '${ifname}' on phy '${phy}'`);
-		prev_bss.delete();
-		wdev_remove(ifname);
-	}
-
-	// Step 4: rename preserved interfaces, use temporary name on duplicates
-	let rename_list = [];
-	for (let i = 0; i < length(bss_list); i++) {
-		if (!bss_list[i])
-			continue;
-
-		let old_ifname = bss_list_cfg[i].ifname;
-		let new_ifname = config.bss[i].ifname;
-		if (old_ifname == new_ifname)
-			continue;
-
-		if (hostapd.bss[new_ifname]) {
-			new_ifname = "tmp_" + substr(hostapd.sha1(new_ifname), 0, 8);
-			push(rename_list, i);
-		}
-
-		hostapd.printf(`Rename bss ${old_ifname} to ${new_ifname}`);
-		if (!bss_list[i].rename(new_ifname)) {
-			hostapd.printf(`Failed to rename bss ${old_ifname} to ${new_ifname}`);
-			return false;
-		}
-
-		bss_list_cfg[i].ifname = new_ifname;
-	}
-
-	// Step 5: rename interfaces with temporary names
-	for (let i in rename_list) {
-		let new_ifname = config.bss[i].ifname;
-		if (!bss_list[i].rename(new_ifname)) {
-			hostapd.printf(`Failed to rename bss to ${new_ifname}`);
-			return false;
-		}
-		bss_list_cfg[i].ifname = new_ifname;
-	}
-
-	// Step 6: assign BSSID for newly created interfaces
-	let macaddr_data = {
-		num_global: config.num_global_macaddr ?? 1,
-		mbssid: config.mbssid ?? 0,
-	};
-	macaddr_list = phydev.macaddr_init(macaddr_list, macaddr_data);
-	for (let i = 0; i < length(config.bss); i++) {
-		if (bss_list[i])
-			continue;
-		let bsscfg = config.bss[i];
-
-		let mac_idx = macaddr_list[bsscfg.bssid];
-		if (mac_idx < 0)
-			macaddr_list[bsscfg.bssid] = i;
-		if (mac_idx == i)
-			continue;
-
-		// statically assigned bssid of the new interface is in conflict
-		// with the bssid of a reused interface. reassign the reused interface
-		if (!bsscfg.default_macaddr) {
-			// can't update bssid of the first BSS, need to restart
-			if (!mac_idx < 0)
-				return false;
-
-			bsscfg = config.bss[mac_idx];
-		}
-
-		let addr = phydev.macaddr_next(i);
-		if (!addr) {
-			hostapd.printf(`Failed to generate mac address for phy ${phy}`);
-			return false;
-		}
-		bsscfg.bssid = addr;
-	}
-
-	let config_inline = iface_gen_config(phy, config);
-
-	// Step 7: fill in the gaps with new interfaces
-	for (let i = 0; i < length(config.bss); i++) {
-		let ifname = config.bss[i].ifname;
-		let bss = bss_list[i];
-
-		if (bss)
-			continue;
-
-		hostapd.printf(`Add bss ${ifname} on phy ${phy}`);
-		bss_list[i] = iface.add_bss(config_inline, i);
-		if (!bss_list[i]) {
-			hostapd.printf(`Failed to add new bss ${ifname} on phy ${phy}`);
-			return false;
-		}
-	}
-
-	// Step 8: update interface bss order
-	if (!iface.set_bss_order(bss_list)) {
-		hostapd.printf(`Failed to update BSS order on phy '${phy}'`);
-		return false;
-	}
-
-	// Step 9: update config
-	for (let i = 0; i < length(config.bss); i++) {
-		if (!bss_list_cfg[i])
-			continue;
-
-		let ifname = config.bss[i].ifname;
-		let bss = bss_list[i];
-
-		if (is_equal(config.bss[i], bss_list_cfg[i]))
-			continue;
-
-		if (is_equal(bss_remove_file_fields(config.bss[i]),
-		             bss_remove_file_fields(bss_list_cfg[i]))) {
-			hostapd.printf(`Update config data files for bss ${ifname}`);
-			if (bss.set_config(config_inline, i, true) < 0) {
-				hostapd.printf(`Could not update config data files for bss ${ifname}`);
-				return false;
-			} else {
-				bss.ctrl("RELOAD_WPA_PSK");
-				continue;
-			}
-		}
-
-		bss_reload_psk(bss, config.bss[i], bss_list_cfg[i]);
-		if (is_equal(config.bss[i], bss_list_cfg[i]))
-			continue;
-
-		hostapd.printf(`Reload config for bss '${config.bss[0].ifname}' on phy '${phy}'`);
-		if (bss.set_config(config_inline, i) < 0) {
-			hostapd.printf(`Failed to set config for bss ${ifname}`);
-			return false;
-		}
-	}
-
-	return true;
-}
-
-function iface_set_config(phy, config)
-{
-	let old_config = hostapd.data.config[phy];
-
-	hostapd.data.config[phy] = config;
-
-	if (!config) {
-		hostapd.remove_iface(phy);
-		return iface_remove(old_config);
-	}
-
-	let phydev = phy_open(phy);
-	if (!phydev) {
-		hostapd.printf(`Failed to open phy ${phy}`);
-		return false;
-	}
-
-	try {
-		let ret = iface_reload_config(phydev, config, old_config);
-		if (ret) {
-			iface_update_supplicant_macaddr(phy, config);
-			hostapd.printf(`Reloaded settings for phy ${phy}`);
-			return 0;
-		}
-	} catch (e) {
-			hostapd.printf(`Error reloading config: ${e}\n${e.stacktrace[0].context}`);
-	}
-
-	hostapd.printf(`Restart interface for phy ${phy}`);
-	let ret = iface_restart(phydev, config, old_config);
-
-	return ret;
-}
-
-function config_add_bss(config, name)
-{
-	let bss = {
-		ifname: name,
-		data: [],
-		hash: {}
-	};
-
-	push(config.bss, bss);
-
-	return bss;
-}
-
-function iface_load_config(filename)
-{
-	let f = open(filename, "r");
-	if (!f)
-		return null;
-
-	let config = {
-		radio: {
-			data: []
-		},
-		bss: [],
-		orig_file: filename,
-	};
-
-	let bss;
-	let line;
-	while ((line = rtrim(f.read("line"), "\n")) != null) {
-		let val = split(line, "=", 2);
-		if (!val[0])
-			continue;
-
-		if (val[0] == "interface") {
-			bss = config_add_bss(config, val[1]);
-			break;
-		}
-
-		if (val[0] == "channel") {
-			config.radio.channel = val[1];
-			continue;
-		}
-
-		if (val[0] == "#num_global_macaddr" ||
-		    val[0] == "mbssid")
-			config[val[0]] = int(val[1]);
-
-		if (val[0] == "#single_hw")
-			config["single_hw"] = int(val[1]);
-
-		push(config.radio.data, line);
-	}
-
-	while ((line = rtrim(f.read("line"), "\n")) != null) {
-		if (line == "#default_macaddr")
-			bss.default_macaddr = true;
-
-		let val = split(line, "=", 2);
-		if (!val[0])
-			continue;
-
-		if (val[0] == "bssid") {
-			bss.bssid = lc(val[1]);
-			continue;
-		}
-
-		if (val[0] == "mld_ap" && int(val[1]) == 1)
-			bss.mld_ap = 1;
-
-		if (val[0] == "mld_primary" && int(val[1]) == 1)
-			bss.mld_primary = 1;
-
-		if (val[0] == "nas_identifier")
-			bss.nasid = val[1];
-
-		if (val[0] == "bss") {
-			bss = config_add_bss(config, val[1]);
-			continue;
-		}
-
-		if (hostapd.data.file_fields[val[0]])
-			bss.hash[val[0]] = hostapd.sha1(readfile(val[1]));
-
-		push(bss.data, line);
-	}
-	f.close();
-
-	return config;
-}
-
-function ex_wrap(func) {
-	return (req) => {
-		try {
-			let ret = func(req);
-			return ret;
-		} catch(e) {
-			hostapd.printf(`Exception in ubus function: ${e}\n${e.stacktrace[0].context}`);
-		}
-		return libubus.STATUS_UNKNOWN_ERROR;
-	};
-}
-
-let main_obj = {
-	reload: {
-		args: {
-			phy: "",
-		},
-		call: ex_wrap(function(req) {
-			let phy_list = req.args.phy ? [ req.args.phy ] : keys(hostapd.data.config);
-			for (let phy_name in phy_list) {
-				let phy = hostapd.data.config[phy_name];
-				let config = iface_load_config(phy.orig_file);
-				iface_set_config(phy_name, config);
-			}
-
-			return 0;
-		})
-	},
-	apsta_state: {
-		args: {
-			phy: "",
-			up: true,
-			frequency: 0,
-			sec_chan_offset: 0,
-			ch_width: -1,
-			bw320_offset: 1,
-			band_idx: 0,
-			csa: true,
-			csa_count: 0,
-		},
-		call: ex_wrap(function(req) {
-			if (req.args.up == null || !req.args.phy)
-				return libubus.STATUS_INVALID_ARGUMENT;
-
-			hostapd.printf(`ucode: mtk: apsta state update`);
-			hostapd.printf(`    * phy: ${req.args.phy}`);
-			hostapd.printf(`    * up: ${req.args.up}`);
-			hostapd.printf(`    * freqeuncy: ${req.args.frequency}`);
-			hostapd.printf(`    * sec_chan_offset: ${req.args.sec_chan_offset}`);
-			hostapd.printf(`    * ch_width: ${req.args.ch_width}`);
-			hostapd.printf(`    * bw320_offset: ${req.args.bw320_offset}`);
-			hostapd.printf(`    * band_idx: ${req.args.band_idx}`);
-			hostapd.printf(`    * csa: ${req.args.csa}`);
-
-			let phy = req.args.phy;
-			let config = hostapd.data.config[phy];
-			if (!config || !config.bss || !config.bss[0] || !config.bss[0].ifname)
-				return 0;
-
-			let iface = hostapd.interfaces[phy];
-			if (!iface)
-				return 0;
-
-			if (!req.args.up) {
-				iface.stop();
-				return 0;
-			}
-
-			if (!req.args.frequency)
-				return libubus.STATUS_INVALID_ARGUMENT;
-
-			let freq_info = iface_freq_info(iface, config, req.args);
-			if (!freq_info)
-				return libubus.STATUS_UNKNOWN_ERROR;
-
-			let ret;
-			if (req.args.csa) {
-				freq_info.csa_count = req.args.csa_count ?? 10;
-				ret = iface.switch_channel(freq_info);
-			} else {
-				ret = iface.start(freq_info);
-			}
-			if (!ret)
-				return libubus.STATUS_UNKNOWN_ERROR;
-
-			return 0;
-		})
-	},
-	config_get_macaddr_list: {
-		args: {
-			phy: ""
-		},
-		call: ex_wrap(function(req) {
-			let phy = req.args.phy;
-			if (!phy)
-				return libubus.STATUS_INVALID_ARGUMENT;
-
-			let ret = {
-				macaddr: [],
-			};
-
-			let config = hostapd.data.config[phy];
-			if (!config)
-				return ret;
-
-			ret.macaddr = map(config.bss, (bss) => bss.bssid);
-			return ret;
-		})
-	},
-	config_set: {
-		args: {
-			phy: "",
-			config: "",
-			prev_config: "",
-		},
-		call: ex_wrap(function(req) {
-			let phy = req.args.phy;
-			let file = req.args.config;
-			let prev_file = req.args.prev_config;
-
-			if (!phy)
-				return libubus.STATUS_INVALID_ARGUMENT;
-
-			if (prev_file && !hostapd.data.config[phy]) {
-				let config = iface_load_config(prev_file);
-				if (config)
-					config.radio.data = [];
-				hostapd.data.config[phy] = config;
-			}
-
-			let config = iface_load_config(file);
-
-			hostapd.printf(`Set new config for phy ${phy}: ${file}`);
-			iface_set_config(phy, config);
-
-			return {
-				pid: hostapd.getpid()
-			};
-		})
-	},
-	config_add: {
-		args: {
-			iface: "",
-			config: "",
-		},
-		call: ex_wrap(function(req) {
-			if (!req.args.iface || !req.args.config)
-				return libubus.STATUS_INVALID_ARGUMENT;
-
-			if (hostapd.add_iface(`bss_config=${req.args.iface}:${req.args.config}`) < 0)
-				return libubus.STATUS_INVALID_ARGUMENT;
-
-			return {
-				pid: hostapd.getpid()
-			};
-		})
-	},
-	config_remove: {
-		args: {
-			iface: ""
-		},
-		call: ex_wrap(function(req) {
-			if (!req.args.iface)
-				return libubus.STATUS_INVALID_ARGUMENT;
-
-			hostapd.remove_iface(req.args.iface);
-			return 0;
-		})
-	},
-};
-
-hostapd.data.ubus = ubus;
-hostapd.data.obj = ubus.publish("hostapd", main_obj);
-hostapd.udebug_set("hostapd", hostapd.data.ubus);
-
-function bss_event(type, name, data) {
-	let ubus = hostapd.data.ubus;
-
-	data ??= {};
-	data.name = name;
-	hostapd.data.obj.notify(`bss.${type}`, data, null, null, null, -1);
-	ubus.call("service", "event", { type: `hostapd.${name}.${type}`, data: {} });
-}
-
-return {
-	shutdown: function() {
-		for (let phy in hostapd.data.config)
-			iface_set_config(phy, null);
-		hostapd.udebug_set(null);
-		hostapd.ubus.disconnect();
-	},
-	bss_add: function(name, obj) {
-		bss_event("add", name);
-	},
-	bss_reload: function(name, obj, reconf) {
-		bss_event("reload", name, { reconf: reconf != 0 });
-	},
-	bss_remove: function(name, obj) {
-		bss_event("remove", name);
-	}
-};
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/services/hostapd/files/wpa_supplicant.uc b/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/services/hostapd/files/wpa_supplicant.uc
deleted file mode 100644
index e19a4e1..0000000
--- a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/package/network/services/hostapd/files/wpa_supplicant.uc
+++ /dev/null
@@ -1,368 +0,0 @@
-let libubus = require("ubus");
-import { open, readfile } from "fs";
-import { wdev_create, wdev_set_mesh_params, wdev_remove, is_equal, wdev_set_up, vlist_new, phy_open } from "common";
-
-let ubus = libubus.connect();
-
-wpas.data.config = {};
-wpas.data.iface_phy = {};
-wpas.data.macaddr_list = {};
-
-function iface_stop(iface)
-{
-	let ifname = iface.config.iface;
-
-	if (!iface.running)
-		return;
-
-	delete wpas.data.iface_phy[ifname];
-	wpas.remove_iface(ifname);
-	wdev_remove(ifname);
-	iface.running = false;
-}
-
-function iface_start(phydev, iface, macaddr_list)
-{
-	let phy = phydev.name;
-
-	if (iface.running)
-		return;
-
-	let ifname = iface.config.iface;
-	let wdev_config = {};
-	for (let field in iface.config)
-		wdev_config[field] = iface.config[field];
-	if (!wdev_config.macaddr)
-		wdev_config.macaddr = phydev.macaddr_next();
-
-	wpas.data.iface_phy[ifname] = phy;
-	wdev_remove(ifname);
-	let ret = wdev_create("phy0", ifname, wdev_config);
-	if (ret)
-		wpas.printf(`Failed to create device ${ifname}: ${ret}`);
-	wdev_set_up(ifname, true);
-	wpas.add_iface(iface.config);
-	iface.running = true;
-}
-
-function iface_cb(new_if, old_if)
-{
-	if (old_if && new_if && is_equal(old_if.config, new_if.config)) {
-		new_if.running = old_if.running;
-		return;
-	}
-
-	if (new_if && old_if)
-		wpas.printf(`Update configuration for interface ${old_if.config.iface}`);
-	else if (old_if)
-		wpas.printf(`Remove interface ${old_if.config.iface}`);
-
-	if (old_if)
-		iface_stop(old_if);
-}
-
-function prepare_config(config)
-{
-	config.config_data = readfile(config.config);
-
-	return { config: config };
-}
-
-function set_config(phy_name, config_list)
-{
-	let phy = wpas.data.config[phy_name];
-
-	if (!phy) {
-		phy = vlist_new(iface_cb, false);
-		wpas.data.config[phy_name] = phy;
-	}
-
-	let values = [];
-	for (let config in config_list)
-		push(values, [ config.iface, prepare_config(config) ]);
-
-	phy.update(values);
-}
-
-function start_pending(phy_name)
-{
-	let phy = wpas.data.config[phy_name];
-	let ubus = wpas.data.ubus;
-
-	if (!phy || !phy.data)
-		return;
-
-	let phydev = phy_open(phy_name);
-	if (!phydev) {
-		wpas.printf(`Could not open phy ${phy_name}`);
-		return;
-	}
-
-	let macaddr_list = wpas.data.macaddr_list[phy_name];
-	phydev.macaddr_init(macaddr_list);
-
-	for (let ifname in phy.data)
-		iface_start(phydev, phy.data[ifname]);
-}
-
-let main_obj = {
-	phy_set_state: {
-		args: {
-			phy: "",
-			stop: true,
-		},
-		call: function(req) {
-			if (!req.args.phy || req.args.stop == null)
-				return libubus.STATUS_INVALID_ARGUMENT;
-
-			let phy = wpas.data.config[req.args.phy];
-			if (!phy)
-				return libubus.STATUS_NOT_FOUND;
-
-			try {
-				if (req.args.stop) {
-					for (let ifname in phy.data)
-						iface_stop(phy.data[ifname]);
-				} else {
-					start_pending(req.args.phy);
-				}
-			} catch (e) {
-				wpas.printf(`Error chaging state: ${e}\n${e.stacktrace[0].context}`);
-				return libubus.STATUS_INVALID_ARGUMENT;
-			}
-			return 0;
-		}
-	},
-	phy_set_macaddr_list: {
-		args: {
-			phy: "",
-			macaddr: [],
-		},
-		call: function(req) {
-			let phy = req.args.phy;
-			if (!phy)
-				return libubus.STATUS_INVALID_ARGUMENT;
-
-			wpas.data.macaddr_list[phy] = req.args.macaddr;
-			return 0;
-		}
-	},
-	phy_status: {
-		args: {
-			phy: ""
-		},
-		call: function(req) {
-			if (!req.args.phy)
-				return libubus.STATUS_INVALID_ARGUMENT;
-
-			let phy = wpas.data.config[req.args.phy];
-			if (!phy)
-				return libubus.STATUS_NOT_FOUND;
-
-			for (let ifname in phy.data) {
-				try {
-					let iface = wpas.interfaces[ifname];
-					if (!iface)
-						continue;
-
-					let status = iface.status();
-					if (!status)
-						continue;
-
-					if (status.state == "INTERFACE_DISABLED")
-						continue;
-
-					status.ifname = ifname;
-					return status;
-				} catch (e) {
-					continue;
-				}
-			}
-
-			return libubus.STATUS_NOT_FOUND;
-		}
-	},
-	config_set: {
-		args: {
-			phy: "",
-			config: [],
-			defer: true,
-		},
-		call: function(req) {
-			if (!req.args.phy)
-				return libubus.STATUS_INVALID_ARGUMENT;
-
-			wpas.printf(`Set new config for phy ${req.args.phy}`);
-			try {
-				if (req.args.config)
-					set_config(req.args.phy, req.args.config);
-
-				if (!req.args.defer)
-					start_pending(req.args.phy);
-			} catch (e) {
-				wpas.printf(`Error loading config: ${e}\n${e.stacktrace[0].context}`);
-				return libubus.STATUS_INVALID_ARGUMENT;
-			}
-
-			return {
-				pid: wpas.getpid()
-			};
-		}
-	},
-	config_add: {
-		args: {
-			driver: "",
-			iface: "",
-			bridge: "",
-			hostapd_ctrl: "",
-			ctrl: "",
-			config: "",
-		},
-		call: function(req) {
-			if (!req.args.iface || !req.args.config)
-				return libubus.STATUS_INVALID_ARGUMENT;
-
-			if (wpas.add_iface(req.args) < 0)
-				return libubus.STATUS_INVALID_ARGUMENT;
-
-			return {
-				pid: wpas.getpid()
-			};
-		}
-	},
-	config_remove: {
-		args: {
-			iface: ""
-		},
-		call: function(req) {
-			if (!req.args.iface)
-				return libubus.STATUS_INVALID_ARGUMENT;
-
-			wpas.remove_iface(req.args.iface);
-			return 0;
-		}
-	},
-};
-
-wpas.data.ubus = ubus;
-wpas.data.obj = ubus.publish("wpa_supplicant", main_obj);
-wpas.udebug_set("wpa_supplicant", wpas.data.ubus);
-
-function iface_event(type, name, data) {
-	let ubus = wpas.data.ubus;
-
-	data ??= {};
-	data.name = name;
-	wpas.data.obj.notify(`iface.${type}`, data, null, null, null, -1);
-	ubus.call("service", "event", { type: `wpa_supplicant.${name}.${type}`, data: {} });
-}
-
-function iface_hostapd_notify(phy, ifname, iface, state, link_id)
-{
-	let ubus = wpas.data.ubus;
-	let msg = { phy: phy };
-
-	wpas.printf(`ucode: mtk: wpa_s in state ${state} notifies hostapd`);
-	switch (state) {
-	case "DISCONNECTED":
-	case "AUTHENTICATING":
-	case "SCANNING":
-		msg.up = false;
-		break;
-	case "INTERFACE_DISABLED":
-	case "INACTIVE":
-		msg.up = true;
-		break;
-	case "COMPLETED":
-		let status = iface.status(link_id);
-		msg.up = true;
-		msg.frequency = status.frequency;
-		msg.sec_chan_offset = status.sec_chan_offset;
-		msg.ch_width = status.ch_width;
-		msg.bw320_offset = status.bw320_offset;
-		msg.band_idx = status.band_idx;
-		break;
-	default:
-		return;
-	}
-
-	ubus.call("hostapd", "apsta_state", msg);
-}
-
-function iface_channel_switch(phy, ifname, iface, info)
-{
-	let msg = {
-		phy: phy,
-		up: true,
-		csa: true,
-		csa_count: info.csa_count ? info.csa_count - 1 : 0,
-		frequency: info.frequency,
-		ch_width: info.ch_width,
-		bw320_offset: info.bw320_offset,
-		sec_chan_offset: info.sec_chan_offset,
-	};
-	ubus.call("hostapd", "apsta_state", msg);
-}
-
-return {
-	shutdown: function() {
-		for (let phy in wpas.data.config)
-			set_config(phy, []);
-		wpas.ubus.disconnect();
-	},
-	iface_add: function(name, obj) {
-		iface_event("add", name);
-	},
-	iface_remove: function(name, obj) {
-		iface_event("remove", name);
-	},
-	state: function(ifname, iface, state) {
-		let phy = wpas.data.iface_phy[ifname];
-		let ret = iface.get_valid_links();
-		let link_id = 0, valid_links = ret.valid_links;
-
-		if (!phy) {
-			wpas.printf(`no PHY for ifname ${ifname}`);
-			return;
-		}
-
-		if (valid_links) {
-			while (valid_links) {
-				if (valid_links & 1)
-					iface_hostapd_notify(phy, ifname, iface, state, link_id);
-
-				link_id++;
-				valid_links >>= 1;
-			}
-		} else {
-			iface_hostapd_notify(phy, ifname, iface, state, -1);
-		}
-
-		if (state != "COMPLETED")
-			return;
-
-		let phy_data = wpas.data.config[phy];
-		if (!phy_data)
-			return;
-
-		let iface_data = phy_data.data[ifname];
-		if (!iface_data)
-			return;
-
-		let wdev_config = iface_data.config;
-		if (!wdev_config || wdev_config.mode != "mesh")
-			return;
-
-		wdev_set_mesh_params(ifname, wdev_config);
-	},
-	event: function(ifname, iface, ev, info) {
-		let phy = wpas.data.iface_phy[ifname];
-		if (!phy) {
-			wpas.printf(`no PHY for ifname ${ifname}`);
-			return;
-		}
-
-		if (ev == "CH_SWITCH_STARTED")
-			iface_channel_switch(phy, ifname, iface, info);
-	}
-};
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/0002-add-EHT-config-for-hostapd.patch b/autobuild_mac80211_release/openwrt_patches-21.02/hostapd/0003-hostapd-add-EHT-config.patch
similarity index 100%
rename from autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/0002-add-EHT-config-for-hostapd.patch
rename to autobuild_mac80211_release/openwrt_patches-21.02/hostapd/0003-hostapd-add-EHT-config.patch
diff --git a/autobuild_mac80211_release/openwrt_patches-21.02/wifi7_mlo/0001-wifi-scripts-add-mlo-config.patch b/autobuild_mac80211_release/openwrt_patches-21.02/wifi7_mlo/0001-wifi-scripts-add-mlo-config.patch
new file mode 100644
index 0000000..d8ae424
--- /dev/null
+++ b/autobuild_mac80211_release/openwrt_patches-21.02/wifi7_mlo/0001-wifi-scripts-add-mlo-config.patch
@@ -0,0 +1,481 @@
+diff --git a/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh b/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh
+index 3537e3a..3664297 100644
+--- a/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh
++++ b/package/network/config/wifi-scripts/files/lib/netifd/hostapd.sh
+@@ -412,6 +412,10 @@ hostapd_common_add_bss_config() {
+ 	config_add_string group_cipher
+ 	config_add_string group_mgmt_cipher
+ 
++	config_add_int assoc_phy
++	config_add_int mld_id mld_assoc_phy mld_allowed_phy_bitmap mld_allowed_links
++	config_add_boolean mld_primary mld_single_link
++	config_add_string mld_addr
+ }
+ 
+ hostapd_set_vlan_file() {
+@@ -599,7 +603,8 @@ hostapd_set_bss_options() {
+ 		multicast_to_unicast_all proxy_arp per_sta_vif \
+ 		eap_server eap_user_file ca_cert server_cert private_key private_key_passwd server_id \
+ 		vendor_elements fils ocv unsol_bcast_probe_resp_interval fils_discovery_min_interval \
+-		fils_discovery_max_interval rnr group_cipher group_mgmt_cipher
++		fils_discovery_max_interval rnr group_cipher group_mgmt_cipher \
++		mld_id mld_primary mld_addr mld_allowed_links
+ 
+ 	set_default fils 0
+ 	set_default isolate 0
+@@ -626,7 +631,10 @@ hostapd_set_bss_options() {
+ 
+ 	/usr/sbin/hostapd -vfils || fils=0
+ 
+-	append bss_conf "ctrl_interface=/var/run/hostapd"
++	if [ -z $mld_id ] || [ "$mld_primary" = "1" ]; then
++		append bss_conf "ctrl_interface=/var/run/hostapd"
++	fi
++
+ 	if [ "$isolate" -gt 0 ]; then
+ 		append bss_conf "ap_isolate=$isolate" "$N"
+ 	fi
+@@ -1282,6 +1290,25 @@ hostapd_set_bss_options() {
+ 		append bss_conf "rnr=$rnr" "$N"
+ 	fi
+ 
++	if [ -n "$mld_id" ]; then
++		if !([ "$mld_id" -ge 0 ] && [ "$mld_id" -le 255 ]); then
++			echo "Invalid mld_id: ${mld_id}"
++			return 1
++		fi
++		append bss_conf "mld_ap=1" "$N"
++		if [ -n "$mld_addr" ]; then
++			append bss_conf "mld_addr=$mld_addr" "$N"
++		fi
++	fi
++
++	if [ "$mld_primary" -gt 0 ]; then
++		append bss_conf "mld_primary=${mld_primary}" "$N"
++	fi
++
++	if [ "$mld_allowed_links" -gt 0 ]; then
++		append bss_conf "mld_allowed_links=${mld_allowed_links}" "$N"
++	fi
++
+ 	append "$var" "$bss_conf" "$N"
+ 	return 0
+ }
+@@ -1337,7 +1364,8 @@ wpa_supplicant_prepare_interface() {
+ 
+ 	_wpa_supplicant_common "$1"
+ 
+-	json_get_vars mode wds multi_ap
++	json_get_vars mode wds multi_ap assoc_phy mld_single_link mld_assoc_phy mld_allowed_phy_bitmap
++	set_default mld_allowed_phy_bitmap 0
+ 
+ 	[ -n "$network_bridge" ] && {
+ 		fail=
+@@ -1369,6 +1397,55 @@ wpa_supplicant_prepare_interface() {
+ 		country_str="country=$country"
+ 	}
+ 
++	local mld_force_single_link=
++	[ -n "$mld_single_link" ] && {
++		mld_force_single_link=$mld_single_link
++	}
++
++	if !([ "$mld_allowed_phy_bitmap" -ge 0 ] && [ "$mld_allowed_phy_bitmap" -le 7 ]); then
++		echo "Error: Invalid MLD allowed phy: ${mld_allowed_phy_bitmap}"
++		return 1
++	fi
++
++	local phy0_scan_list="2412 2417 2422 2427 2432 2437 2442 2447 2452 2457 2462 2467 2472"
++	local phy1_scan_list="5180 5200 5220 5240 5260 5280 5300 5320 5500 5520 5540 5560 5580 5600 5620 5640 5660 5680 5700 5720 5745 5765 5785 5805 5825 5845 5865 5885"
++	local phy2_scan_list="5955 5975 5995 6015 6035 6055 6075 6095 6115 6135 6155 6175 6195 6215 6235 6255 6275 6295 6315 6335 6355 6375 6395 6415 6435 6455 6475 6495 6515 6535 6555 6575 6595 6615 6635 6655 6675 6695 6715 6735 6755 6775 6795 6815 6835 6855 6875 6895"
++	local scan_list=
++	if [ $mld_allowed_phy_bitmap -gt 0 ] && [ $mld_allowed_phy_bitmap -lt 7 ]; then
++		[ $(($mld_allowed_phy_bitmap & 1)) -ne 0 ] && {
++			scan_list="$scan_list $phy0_scan_list"
++		}
++
++		[ $(($mld_allowed_phy_bitmap & 2)) -ne 0 ] && {
++			scan_list="$scan_list $phy1_scan_list"
++		}
++
++		[ $(($mld_allowed_phy_bitmap & 4)) -ne 0 ] && {
++			scan_list="$scan_list $phy2_scan_list"
++		}
++	elif [ "$mld_allowed_phy_bitmap" -eq 0 ]; then
++		# For Legacy STA
++		if [ "$phy" = "phy0" ]; then
++			scan_list="$phy0_scan_list"
++		elif [ "$phy" = "phy1" ]; then
++			scan_list="$phy1_scan_list"
++		elif [ "$phy" = "phy2" ]; then
++			scan_list="$phy2_scan_list"
++		fi
++	fi
++
++	[ -n "$assoc_phy" ] && mld_assoc_phy=$assoc_phy
++
++	local mld_connect_band_pref=
++	if [ -n "$mld_assoc_phy" ]; then
++		if [ $(($mld_allowed_phy_bitmap & $((1<<$mld_assoc_phy)))) -eq 0 ]; then
++			echo "Error: Conflict between preferred association phy and allowed phy"
++			return 1
++		fi
++
++		mld_connect_band_pref=$(($mld_assoc_phy+1))
++	fi
++
+ 	local tx_queue_data2_burst="tx_queue_data2_burst=0"
+ 	multiap_flag_file="${_config}.is_multiap"
+ 	if [ "$multi_ap" = "1" ]; then
+@@ -1382,6 +1459,9 @@ ${scan_list:+freq_list=$scan_list}
+ $ap_scan
+ $country_str
+ $tx_queue_data2_burst
++${mld_connect_band_pref:+mld_connect_band_pref=$mld_connect_band_pref}
++${mld_force_single_link:+mld_force_single_link=$mld_force_single_link}
++${mld_allowed_phy_bitmap:+mld_allowed_phy=$mld_allowed_phy_bitmap}
+ EOF
+ 	return 0
+ }
+diff --git a/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh b/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
+index 66bdf5c..35d317f 100755
+--- a/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
++++ b/package/network/config/wifi-scripts/files/lib/netifd/wireless/mac80211.sh
+@@ -29,7 +29,7 @@ drv_mac80211_init_device_config() {
+ 	config_add_string path phy 'macaddr:macaddr'
+ 	config_add_string tx_burst
+ 	config_add_string distance
+-	config_add_int mbssid mu_onoff sr_enable sr_enhanced rnr obss_interval
++	config_add_int mbssid mu_onoff sr_enable sr_enhanced rnr obss_interval band_idx
+ 	config_add_int beacon_int chanbw frag rts
+ 	config_add_int rxantenna txantenna txpower min_tx_power
+ 	config_add_int num_global_macaddr multiple_bssid
+@@ -71,7 +71,9 @@ drv_mac80211_init_device_config() {
+ 		rx_stbc \
+ 		tx_stbc \
+ 		he_bss_color \
+-		he_spr_non_srg_obss_pd_max_offset
++		he_spr_non_srg_obss_pd_max_offset \
++		pp_bitmap \
++		pp_mode
+ 	config_add_boolean \
+ 		ldpc \
+ 		greenfield \
+@@ -92,6 +94,7 @@ drv_mac80211_init_iface_config() {
+ 	config_add_int max_listen_int
+ 	config_add_int dtim_period
+ 	config_add_int start_disabled
++	config_add_int vif_txpower
+ 
+ 	# mesh
+ 	config_add_string mesh_id
+@@ -147,7 +150,7 @@ mac80211_hostapd_setup_base() {
+ 	[ -n "$acs_exclude_dfs" ] && [ "$acs_exclude_dfs" -gt 0 ] &&
+ 		append base_cfg "acs_exclude_dfs=1" "$N"
+ 
+-	json_get_vars noscan ht_coex min_tx_power:0 tx_burst mbssid mu_onoff rnr obss_interval
++	json_get_vars noscan ht_coex min_tx_power:0 tx_burst mbssid mu_onoff rnr obss_interval band_idx
+ 	json_get_vars etxbfen:1 itxbfen:0
+ 	json_get_values ht_capab_list ht_capab
+ 	json_get_values channel_list channels
+@@ -376,7 +379,7 @@ mac80211_hostapd_setup_base() {
+ 			mu_beamformee:1 \
+ 			vht_txop_ps:1 \
+ 			htc_vht:1 \
+-			beamformee_antennas:4 \
++			beamformee_antennas:5 \
+ 			beamformer_antennas:4 \
+ 			rx_antenna_pattern:1 \
+ 			tx_antenna_pattern:1 \
+@@ -435,7 +438,7 @@ mac80211_hostapd_setup_base() {
+ 		}
+ 
+ 		[ "$(($vht_cap & 0x1000))" -gt 0 -a "$su_beamformee" -gt 0 ] && {
+-			cap_ant="$(( ( ($vht_cap >> 13) & 3 ) + 1 ))"
++			cap_ant="$(( ( ($vht_cap >> 13) & 7 ) + 1 ))"
+ 			[ "$cap_ant" -gt "$beamformee_antennas" ] && cap_ant="$beamformee_antennas"
+ 			[ "$cap_ant" -gt 1 ] && vht_capab="$vht_capab[BF-ANTENNA-$cap_ant]"
+ 		}
+@@ -535,7 +538,7 @@ mac80211_hostapd_setup_base() {
+ 		fi
+ 		if [ "$he_bss_color_enabled" -gt 0 ]; then
+ 			if !([ "$he_bss_color" -gt 0 ] && [ "$he_bss_color" -le 64 ]); then
+-				rand=$(head -n 1 /dev/urandom | tr -dc 0-9 | head -c 2)
++				rand=$(head -n 1 /dev/urandom | tr -dc 0-9 | head -c 2 | sed 's/^0*//')
+ 				he_bss_color=$((rand % 63 + 1))
+ 			fi
+ 			append base_cfg "he_bss_color=$he_bss_color" "$N"
+@@ -587,6 +590,11 @@ mac80211_hostapd_setup_base() {
+ 	esac
+ 
+ 	if [ "$enable_be" != "0" ]; then
++
++		json_get_vars \
++			pp_bitmap \
++			pp_mode
++
+ 		append base_cfg "ieee80211be=1" "$N"
+ 		if [ "$etxbfen" -eq 0 ]; then
+ 			append base_cfg "eht_su_beamformee=1" "$N"
+@@ -608,6 +616,14 @@ mac80211_hostapd_setup_base() {
+ 				;;
+ 			esac
+ 		}
++
++		if [ -n "$pp_bitmap" ]; then
++			append base_cfg "punct_bitmap=$pp_bitmap" "$N"
++		fi
++
++		if [ -n "$pp_mode" ]; then
++			append base_cfg "pp_mode=$pp_mode" "$N"
++		fi
+ 	fi
+ 
+ 	hostapd_prepare_device_config "$hostapd_conf_file" nl80211
+@@ -621,7 +637,9 @@ ${mu_onoff:+mu_onoff=$mu_onoff}
+ ${itxbfen:+ibf_enable=$itxbfen}
+ ${rnr:+rnr=$rnr}
+ ${multiple_bssid:+mbssid=$multiple_bssid}
++${band_idx:+band_idx=$band_idx}
+ #num_global_macaddr=$num_global_macaddr
++#single_hw=1
+ $base_cfg
+ 
+ EOF
+@@ -652,7 +670,6 @@ mac80211_hostapd_setup_bss() {
+ 	cat >> /var/run/hostapd-$phy.conf <<EOF
+ $hostapd_cfg
+ bssid=$macaddr
+-${default_macaddr:+#default_macaddr}
+ ${dtim_period:+dtim_period=$dtim_period}
+ ${max_listen_int:+max_listen_interval=$max_listen_int}
+ EOF
+@@ -783,8 +800,62 @@ mac80211_set_ifname() {
+ 	eval "ifname=\"$phy-$prefix\${idx_$prefix:-0}\"; idx_$prefix=\$((\${idx_$prefix:-0 } + 1))"
+ }
+ 
++fill_mld_params() {
++	local target_mld_id=$1
++	local phy_idx=$(echo $2 | tr -d "phy")
++	local found_mld=0
++	local is_primary=1
++	local mld_allowed_links=0
++
++	iface_list="$(cat /etc/config/wireless | grep wifi-iface | cut -d ' ' -f3 | tr -s "'\n" ' ')"
++	for iface in $iface_list
++	do
++		local mld_id="$(uci show wireless.$iface | grep "mld_id" | cut -d '=' -f2 | tr -d "'")"
++		local radio_id="$(uci show wireless.$iface | grep "device" | cut -d '=' -f2 | tr -d "radio'")"
++		local iface_disabled="$(uci show wireless.$iface | grep "disabled" | cut -d '=' -f2 | tr -d "'")"
++
++		if [ "$iface_disabled" != "1" ] && [ $mld_id = $target_mld_id ]; then
++			mld_allowed_links=$(($mld_allowed_links * 2 + 1))
++			[ $radio_id -lt $phy_idx ] && is_primary=0
++		fi
++	done
++	json_add_string "mld_primary" $is_primary
++	json_add_string "mld_allowed_links" $mld_allowed_links
++
++        mld_list="$(cat /etc/config/wireless | grep wifi-mld | cut -d ' ' -f3 | tr -s "'\n" ' ')"
++        for m in $mld_list
++        do
++		local mld_id="$(uci show wireless.$m | grep "mld_id" | cut -d '=' -f2 | tr -d "'")"
++		[ $mld_id = $target_mld_id ] || continue
++		found_mld=1
++
++                option_list="$(uci show wireless.$m | tr -s "\n" ' ')"
++                for option in $option_list
++                do
++                        local key="$(echo $option | cut -d '.' -f3 | cut -d '=' -f1)"
++                        local val="$(echo $option | cut -d '.' -f3 | cut -d '=' -f2 | tr -d "'")"
++			[ -n "$key" ] && json_add_string $key $val
++                done
++        done
++
++	if [ $found_mld -eq 0 ]; then
++		echo "mld_id $target_mld_id is not found"
++		return 1
++	fi
++	return 0
++}
++
+ mac80211_prepare_vif() {
+ 	json_select config
++	json_get_vars mld_id
++	if [ -n "$mld_id" ]; then
++		fill_mld_params $mld_id $phy || return
++
++		json_get_vars mld_addr
++		if [ -z "$mld_addr" ]; then
++			json_add_string mld_addr "$(mac80211_generate_mac phy0)"
++		fi
++	fi
+ 
+ 	json_get_vars ifname mode ssid wds powersave macaddr enable wpa_psk_file vlan_file
+ 
+@@ -805,7 +876,6 @@ mac80211_prepare_vif() {
+ 	set_default powersave 0
+ 	json_add_string _ifname "$ifname"
+ 
+-	default_macaddr=
+ 	if [ "$mbssid" -gt 0 ] && [ "$mode" == "ap" ]; then
+ 		[ "$mbssidx" -eq 0 ] && {
+ 			if [ -z $macaddr ]; then
+@@ -821,12 +891,10 @@ mac80211_prepare_vif() {
+ 	elif [ -z "$macaddr" ]; then
+ 		macaddr="$(mac80211_generate_mac $phy)"
+ 		macidx="$(($macidx + 1))"
+-		default_macaddr=1
+ 	elif [ "$macaddr" = 'random' ]; then
+ 		macaddr="$(macaddr_random)"
+ 	fi
+ 	json_add_string _macaddr "$macaddr"
+-	json_add_string _default_macaddr "$default_macaddr"
+ 	json_select ..
+ 
+ 
+@@ -950,7 +1018,7 @@ mac80211_setup_adhoc() {
+ 
+ 	json_add_object "$ifname"
+ 	json_add_string mode adhoc
+-	[ -n "$default_macaddr" ] || json_add_string macaddr "$macaddr"
++	json_add_string macaddr "$macaddr"
+ 	json_add_string ssid "$ssid"
+ 	json_add_string freq "$freq"
+ 	json_add_string htmode "$iw_htmode"
+@@ -976,7 +1044,7 @@ mac80211_setup_mesh() {
+ 
+ 	json_add_object "$ifname"
+ 	json_add_string mode mesh
+-	[ -n "$default_macaddr" ] || json_add_string macaddr "$macaddr"
++	json_add_string macaddr "$macaddr"
+ 	json_add_string ssid "$ssid"
+ 	json_add_string freq "$freq"
+ 	json_add_string htmode "$iw_htmode"
+@@ -1036,7 +1104,7 @@ wpa_supplicant_add_interface() {
+ 	json_add_string iface "$ifname"
+ 	json_add_string mode "$mode"
+ 	json_add_string config "$_config"
+-	[ -n "$default_macaddr" ] || json_add_string macaddr "$macaddr"
++	json_add_string macaddr "$macaddr"
+ 	[ -n "$network_bridge" ] && json_add_string bridge "$network_bridge"
+ 	[ -n "$wds" ] && json_add_boolean 4addr "$wds"
+ 	json_add_boolean powersave "$powersave"
+@@ -1140,7 +1208,6 @@ mac80211_setup_vif() {
+ 	json_select config
+ 	json_get_var ifname _ifname
+ 	json_get_var macaddr _macaddr
+-	json_get_var default_macaddr _default_macaddr
+ 	json_get_vars mode wds powersave
+ 
+ 	set_default powersave 0
+@@ -1294,6 +1361,12 @@ drv_mac80211_setup() {
+ 	staidx=0
+ 	mbssidx=0
+ 
++	if [ "$phy" = "phy1" ]; then
++		macidx=20;
++	elif [ "$phy" = "phy2" ]; then
++		macidx=40;
++	fi
++
+ 	[ -n "$chanbw" ] && {
+ 		for file in /sys/kernel/debug/ieee80211/$phy/ath9k*/chanbw /sys/kernel/debug/ieee80211/$phy/ath5k/bwmode; do
+ 			[ -f "$file" ] && echo "$chanbw" > "$file"
+@@ -1372,6 +1445,8 @@ drv_mac80211_setup() {
+ 
+ 	for_each_interface "ap sta adhoc mesh monitor" mac80211_set_vif_txpower
+ 	wireless_set_up
++
++	echo /tmp/%e.core > /proc/sys/kernel/core_pattern
+ }
+ 
+ _list_phy_interfaces() {
+@@ -1401,8 +1476,21 @@ drv_mac80211_teardown() {
+ 		return 1
+ 	}
+ 
++	# each phy sleeps different times to prevent for ubus race condition.
++	if [ "$phy" = "phy1" ]; then
++		sleep 3;
++	elif [ "$phy" = "phy0" ]; then
++		sleep 6;
++	fi
++
+ 	mac80211_reset_config "$phy"
+ 
++	if [ "$phy" = "phy1" ]; then
++		sleep 3;
++	elif [ "$phy" = "phy2" ]; then
++		sleep 6;
++	fi
++
+ 	for wdev in $(list_phy_interfaces "$phy"); do
+ 		ip link set dev "$wdev" down
+ 		iw dev "$wdev" del
+diff --git a/package/network/config/wifi-scripts/files/lib/wifi/mac80211.sh b/package/network/config/wifi-scripts/files/lib/wifi/mac80211.sh
+index 3c78e1a..d8a1756 100644
+--- a/package/network/config/wifi-scripts/files/lib/wifi/mac80211.sh
++++ b/package/network/config/wifi-scripts/files/lib/wifi/mac80211.sh
+@@ -133,6 +133,11 @@ get_band_defaults() {
+ 		[ -n "$band" ] || continue
+ 		[ -n "$mode_band" -a "$band" = "6g" ] && return
+ 
++		# hardcode for default band selection in MLO codebase
++		[ "$phy" = "phy0" -a "$band" != "2g" ] && continue
++		[ "$phy" = "phy1" -a "$band" != "5g" ] && continue
++		[ "$phy" = "phy2" -a "$band" != "6g" ] && continue
++
+ 		mode_band="$band"
+ 		channel="$chan"
+ 		htmode="$mode"
+@@ -145,16 +150,21 @@ get_band_defaults() {
+ 			channel=37
+ 			mbssid=1
+ 			mbo=1
++			band_idx=2
+ 		elif [ "$band" = "5g" ]
+ 		then
+ 			noscan=1
+ 			encryption=none
+ 			rnr=1
+ 			background_radar=1
++			mbo=0
++			band_idx=1
+ 		else
+ 			noscan=1
+ 			encryption=none
+ 			rnr=1
++			mbo=0
++			band_idx=0
+ 		fi
+ 	done
+ }
+@@ -215,6 +225,7 @@ detect_mac80211() {
+ 		mbssid=""
+ 		rnr=""
+ 		background_radar=""
++		band_idx=""
+ 
+ 		get_band_defaults "$dev"
+ 
+@@ -254,7 +265,7 @@ detect_mac80211() {
+ 			for i in $(seq 2 3); do
+ 				macaddr=${macaddr}:$(echo $rand | cut -d ' ' -f $i)
+ 			done
+-			macaddr="00:0$(($devidx - 1)):55:66${macaddr}"
++			macaddr="00:0$(($devidx + 1)):55:66${macaddr}"
+ 		fi
+ 
+ 		tx_burst=""
+@@ -285,6 +296,9 @@ EOF
+ 		[ -n "$tx_burst" ] && {
+ 			uci -q set wireless.${name}.tx_burst=${tx_burst}
+ 		}
++		[ -n "$band_idx" ] && {
++			uci -q set wireless.${name}.band_idx=${band_idx}
++		}
+ 
+ 		uci -q batch <<-EOF
+ 			set wireless.default_${name}=wifi-iface
+
diff --git a/autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/0003-sync-mlo-commit-for-hostapd.patch b/autobuild_mac80211_release/openwrt_patches-21.02/wifi7_mlo/0002-hostapd-sync-mlo-commit.patch
similarity index 100%
rename from autobuild_mac80211_release/mt7988_mt7996_mac80211_mlo/0003-sync-mlo-commit-for-hostapd.patch
rename to autobuild_mac80211_release/openwrt_patches-21.02/wifi7_mlo/0002-hostapd-sync-mlo-commit.patch
diff --git a/autobuild_mac80211_release/0007-add-afcd-build-configuration.patch b/autobuild_mac80211_release/openwrt_patches-21.02/wifi7_mlo/0003-hostapd-add-afcd-build-configuration.sh
similarity index 100%
rename from autobuild_mac80211_release/0007-add-afcd-build-configuration.patch
rename to autobuild_mac80211_release/openwrt_patches-21.02/wifi7_mlo/0003-hostapd-add-afcd-build-configuration.sh
diff --git a/autobuild_mac80211_release/openwrt_patches-21.02/wifi7_mlo/0004-hostapd-ucode-add-mlo-support.patch b/autobuild_mac80211_release/openwrt_patches-21.02/wifi7_mlo/0004-hostapd-ucode-add-mlo-support.patch
new file mode 100644
index 0000000..77cedf3
--- /dev/null
+++ b/autobuild_mac80211_release/openwrt_patches-21.02/wifi7_mlo/0004-hostapd-ucode-add-mlo-support.patch
@@ -0,0 +1,176 @@
+diff --git a/package/network/services/hostapd/files/hostapd.uc b/package/network/services/hostapd/files/hostapd.uc
+index 72209ea..7e9fde4 100644
+--- a/package/network/services/hostapd/files/hostapd.uc
++++ b/package/network/services/hostapd/files/hostapd.uc
+@@ -28,7 +28,8 @@ function iface_remove(cfg)
+ 		return;
+ 
+ 	for (let bss in cfg.bss)
+-		wdev_remove(bss.ifname);
++		if (!bss.mld_ap || bss.mld_primary == 1)
++			wdev_remove(bss.ifname);
+ }
+ 
+ function iface_gen_config(phy, config, start_disabled)
+@@ -62,6 +63,7 @@ function iface_freq_info(iface, config, params)
+ {
+ 	let freq = params.frequency;
+ 	let bw320_offset = params.bw320_offset;
++	let band_idx = params.band_idx;
+ 	if (!freq)
+ 		return null;
+ 
+@@ -92,7 +94,7 @@ function iface_freq_info(iface, config, params)
+ 	if (freq < 4000)
+ 		width = 0;
+ 
+-	return hostapd.freq_info(freq, sec_offset, width, bw320_offset);
++	return hostapd.freq_info(freq, sec_offset, width, bw320_offset, band_idx);
+ }
+ 
+ function iface_add(phy, config, phy_status)
+@@ -154,13 +156,15 @@ function __iface_pending_next(pending, state, ret, data)
+ 		pending.call("wpa_supplicant", "phy_set_macaddr_list", { phy: phy, macaddr: macaddr_list });
+ 		return "create_bss";
+ 	case "create_bss":
+-		let err = wdev_create(phy, bss.ifname, { mode: "ap" });
+-		if (err) {
+-			hostapd.printf(`Failed to create ${bss.ifname} on phy ${phy}: ${err}`);
+-			return null;
++		if (!bss.mld_ap || bss.mld_primary == 1) {
++			let err = wdev_create(config.single_hw == 1 ? "phy0" : phy, bss.ifname, { mode: "ap" });
++			if (err) {
++				hostapd.printf(`Failed to create ${bss.ifname} on phy ${phy}: ${err}`);
++				return null;
++			}
+ 		}
+ 
+-		pending.call("wpa_supplicant", "phy_status", { phy: phy });
++		pending.call("wpa_supplicant", "phy_status", { phy: bss.mld_ap ? "phy0" : phy });
+ 		return "check_phy";
+ 	case "check_phy":
+ 		let phy_status = data;
+@@ -170,12 +174,16 @@ function __iface_pending_next(pending, state, ret, data)
+ 
+ 			hostapd.printf(`Failed to bring up phy ${phy} ifname=${bss.ifname} with supplicant provided frequency`);
+ 		}
+-		pending.call("wpa_supplicant", "phy_set_state", { phy: phy, stop: true });
++		pending.call("wpa_supplicant", "phy_set_state", { phy: bss.mld_ap ? "phy0" : phy, stop: true });
+ 		return "wpas_stopped";
+ 	case "wpas_stopped":
+ 		if (!iface_add(phy, config))
+ 			hostapd.printf(`hostapd.add_iface failed for phy ${phy} ifname=${bss.ifname}`);
+-		pending.call("wpa_supplicant", "phy_set_state", { phy: phy, stop: false });
++		let iface = hostapd.interfaces[phy];
++		if (!bss.mld_ap)
++			pending.call("wpa_supplicant", "phy_set_state", { phy: phy, stop: false });
++		else if (iface.is_mld_finished())
++			pending.call("wpa_supplicant", "phy_set_state", { phy: "phy0", stop: false });
+ 		return null;
+ 	case "done":
+ 	default:
+@@ -682,6 +690,9 @@ function iface_load_config(filename)
+ 		    val[0] == "mbssid")
+ 			config[val[0]] = int(val[1]);
+ 
++		if (val[0] == "#single_hw")
++			config["single_hw"] = int(val[1]);
++
+ 		push(config.radio.data, line);
+ 	}
+ 
+@@ -698,6 +709,12 @@ function iface_load_config(filename)
+ 			continue;
+ 		}
+ 
++		if (val[0] == "mld_ap" && int(val[1]) == 1)
++			bss.mld_ap = 1;
++
++		if (val[0] == "mld_primary" && int(val[1]) == 1)
++			bss.mld_primary = 1;
++
+ 		if (val[0] == "nas_identifier")
+ 			bss.nasid = val[1];
+ 
+@@ -752,6 +769,7 @@ let main_obj = {
+ 			sec_chan_offset: 0,
+ 			ch_width: -1,
+ 			bw320_offset: 1,
++			band_idx: 0,
+ 			csa: true,
+ 			csa_count: 0,
+ 		},
+@@ -766,6 +784,7 @@ let main_obj = {
+ 			hostapd.printf(`    * sec_chan_offset: ${req.args.sec_chan_offset}`);
+ 			hostapd.printf(`    * ch_width: ${req.args.ch_width}`);
+ 			hostapd.printf(`    * bw320_offset: ${req.args.bw320_offset}`);
++			hostapd.printf(`    * band_idx: ${req.args.band_idx}`);
+ 			hostapd.printf(`    * csa: ${req.args.csa}`);
+ 
+ 			let phy = req.args.phy;
+diff --git a/package/network/services/hostapd/files/wpa_supplicant.uc b/package/network/services/hostapd/files/wpa_supplicant.uc
+index e320330..21eefca 100644
+--- a/package/network/services/hostapd/files/wpa_supplicant.uc
++++ b/package/network/services/hostapd/files/wpa_supplicant.uc
+@@ -37,7 +37,7 @@ function iface_start(phydev, iface, macaddr_list)
+ 
+ 	wpas.data.iface_phy[ifname] = phy;
+ 	wdev_remove(ifname);
+-	let ret = wdev_create(phy, ifname, wdev_config);
++	let ret = wdev_create("phy0", ifname, wdev_config);
+ 	if (ret)
+ 		wpas.printf(`Failed to create device ${ifname}: ${ret}`);
+ 	wdev_set_up(ifname, true);
+@@ -257,10 +257,9 @@ function iface_event(type, name, data) {
+ 	ubus.call("service", "event", { type: `wpa_supplicant.${name}.${type}`, data: {} });
+ }
+ 
+-function iface_hostapd_notify(phy, ifname, iface, state)
++function iface_hostapd_notify(phy, ifname, iface, state, link_id)
+ {
+ 	let ubus = wpas.data.ubus;
+-	let status = iface.status();
+ 	let msg = { phy: phy };
+ 
+ 	wpas.printf(`ucode: mtk: wpa_s in state ${state} notifies hostapd`);
+@@ -275,11 +274,13 @@ function iface_hostapd_notify(phy, ifname, iface, state)
+ 		msg.up = true;
+ 		break;
+ 	case "COMPLETED":
++		let status = iface.status(link_id);
+ 		msg.up = true;
+ 		msg.frequency = status.frequency;
+ 		msg.sec_chan_offset = status.sec_chan_offset;
+ 		msg.ch_width = status.ch_width;
+ 		msg.bw320_offset = status.bw320_offset;
++		msg.band_idx = status.band_idx;
+ 		break;
+ 	default:
+ 		return;
+@@ -317,12 +318,24 @@ return {
+ 	},
+ 	state: function(ifname, iface, state) {
+ 		let phy = wpas.data.iface_phy[ifname];
++		let ret = iface.get_valid_links();
++		let link_id = 0, valid_links = ret.valid_links;
+ 		if (!phy) {
+ 			wpas.printf(`no PHY for ifname ${ifname}`);
+ 			return;
+ 		}
+ 
+-		iface_hostapd_notify(phy, ifname, iface, state);
++		if (valid_links) {
++			while (valid_links) {
++				if (valid_links & 1)
++					iface_hostapd_notify(phy, ifname, iface, state, link_id);
++
++				link_id++;
++				valid_links >>= 1;
++			}
++		} else {
++			iface_hostapd_notify(phy, ifname, iface, state, -1);
++		}
+ 
+ 		if (state != "COMPLETED")
+ 			return;
+
