[][MAC80211][WiFi6][misc][fix build fail due to netifd]

[Description]
Fix build fail due to netifd upgradation.
Using the netifd-2023-07-17 version for WiFi6 Build.

[Release-log]
N/A

Change-Id: I641d5f55e44a8c84f89f4d1bd53c2b754d24c83c
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/8024872
diff --git a/autobuild_mac80211_release/0002-wifi6-hostapd-makefile-for-utils.patch b/autobuild_mac80211_release/0002-wifi6-hostapd-makefile-for-utils.patch
index a00e143..4ddd8b1 100644
--- a/autobuild_mac80211_release/0002-wifi6-hostapd-makefile-for-utils.patch
+++ b/autobuild_mac80211_release/0002-wifi6-hostapd-makefile-for-utils.patch
@@ -1,20 +1,3 @@
-diff --git a/package/network/config/netifd/Makefile b/package/network/config/netifd/Makefile
-index 8084327..8fd4c85 100644
---- a/package/network/config/netifd/Makefile
-+++ b/package/network/config/netifd/Makefile
-@@ -5,9 +5,9 @@ PKG_RELEASE:=3
- 
- PKG_SOURCE_PROTO:=git
- PKG_SOURCE_URL=$(PROJECT_GIT)/project/netifd.git
--PKG_SOURCE_DATE:=2023-08-31
--PKG_SOURCE_VERSION:=1a07f1dff32b3af49e39533e33e8964b59535662
--PKG_MIRROR_HASH:=dc621dd04c3c9631002f929cf10a4620f57af8b0baf614c590bda17957fa6201
-+PKG_SOURCE_DATE:=2023-07-17
-+PKG_SOURCE_VERSION:=0ff22a6a68ce942d4c9e7d58355d128dd3793b06
-+PKG_MIRROR_HASH:=4cc81829fa6eb571d67f6879c78d2f514b757a34cc963b7627d55a7a8deffb75
- PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
- 
- PKG_LICENSE:=GPL-2.0
 diff --git a/package/network/services/hostapd/Makefile b/package/network/services/hostapd/Makefile
 index f184830..3af18c6 100644
 --- a/package/network/services/hostapd/Makefile
diff --git a/autobuild_mac80211_release/0002-wifi7-hostapd-makefile-for-utils.patch b/autobuild_mac80211_release/0002-wifi7-hostapd-makefile-for-utils.patch
index 2cda6e4..b07a7e4 100644
--- a/autobuild_mac80211_release/0002-wifi7-hostapd-makefile-for-utils.patch
+++ b/autobuild_mac80211_release/0002-wifi7-hostapd-makefile-for-utils.patch
@@ -1,20 +1,3 @@
-diff --git a/package/network/config/netifd/Makefile b/package/network/config/netifd/Makefile
-index 8084327..8fd4c85 100644
---- a/package/network/config/netifd/Makefile
-+++ b/package/network/config/netifd/Makefile
-@@ -5,9 +5,9 @@ PKG_RELEASE:=3
- 
- PKG_SOURCE_PROTO:=git
- PKG_SOURCE_URL=$(PROJECT_GIT)/project/netifd.git
--PKG_SOURCE_DATE:=2023-08-31
--PKG_SOURCE_VERSION:=1a07f1dff32b3af49e39533e33e8964b59535662
--PKG_MIRROR_HASH:=dc621dd04c3c9631002f929cf10a4620f57af8b0baf614c590bda17957fa6201
-+PKG_SOURCE_DATE:=2023-07-17
-+PKG_SOURCE_VERSION:=0ff22a6a68ce942d4c9e7d58355d128dd3793b06
-+PKG_MIRROR_HASH:=4cc81829fa6eb571d67f6879c78d2f514b757a34cc963b7627d55a7a8deffb75
- PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
- 
- PKG_LICENSE:=GPL-2.0
 diff --git a/package/network/services/hostapd/Makefile b/package/network/services/hostapd/Makefile
 index 4bc1b94..348c94d 100644
 --- a/package/network/services/hostapd/Makefile
diff --git a/autobuild_mac80211_release/lede-build-sanity.sh b/autobuild_mac80211_release/lede-build-sanity.sh
index 76cf284..02f2292 100755
--- a/autobuild_mac80211_release/lede-build-sanity.sh
+++ b/autobuild_mac80211_release/lede-build-sanity.sh
@@ -211,6 +211,15 @@
 	cp -fpR ${BUILD_DIR}/./../mac80211_package/package/network/utils/iwinfo ${BUILD_DIR}/package/network/utils
 
 	rm -rf ${BUILD_DIR}/package/network/config/netifd
+	if [ $2 = "1" ]; then
+		echo "=========================Netifd NEW====================="
+		cp -fpR ${BUILD_DIR}/./../mac80211_package/package/network/config/netifd ${BUILD_DIR}/package/network/config
+		rm -rf  ${MTK_FEED_DIR}/autobuild_mac80211_release/package/network/config/netifd
+		cp -fpR ${MTK_FEED_DIR}/autobuild_mac80211_release/package/network/config/netifd_new ${MTK_FEED_DIR}/autobuild_mac80211_release/package/network/config/netifd
+	else
+		echo "=========================Netifd OLD====================="
+	fi
+
 	cp -fpR ${BUILD_DIR}/./../mac80211_package/package/network/config/netifd ${BUILD_DIR}/package/network/config
 
 	rm -rf ${BUILD_DIR}/package/kernel/mac80211
diff --git a/autobuild_mac80211_release/package/network/config/netifd/Makefile b/autobuild_mac80211_release/package/network/config/netifd/Makefile
new file mode 100644
index 0000000..8fd4c85
--- /dev/null
+++ b/autobuild_mac80211_release/package/network/config/netifd/Makefile
@@ -0,0 +1,49 @@
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=netifd
+PKG_RELEASE:=3
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL=$(PROJECT_GIT)/project/netifd.git
+PKG_SOURCE_DATE:=2023-07-17
+PKG_SOURCE_VERSION:=0ff22a6a68ce942d4c9e7d58355d128dd3793b06
+PKG_MIRROR_HASH:=4cc81829fa6eb571d67f6879c78d2f514b757a34cc963b7627d55a7a8deffb75
+PKG_MAINTAINER:=Felix Fietkau <nbd@nbd.name>
+
+PKG_LICENSE:=GPL-2.0
+PKG_LICENSE_FILES:=
+
+PKG_BUILD_FLAGS:=lto
+
+include $(INCLUDE_DIR)/package.mk
+include $(INCLUDE_DIR)/cmake.mk
+
+define Package/netifd
+  SECTION:=base
+  CATEGORY:=Base system
+  DEPENDS:=+libuci +libnl-tiny +libubus +ubus +ubusd +jshn +libubox
+  TITLE:=OpenWrt Network Interface Configuration Daemon
+endef
+
+define Package/netifd/conffiles
+/etc/udhcpc.user
+/etc/udhcpc.user.d/
+endef
+
+TARGET_CFLAGS += \
+	-I$(STAGING_DIR)/usr/include/libnl-tiny \
+	-I$(STAGING_DIR)/usr/include
+
+CMAKE_OPTIONS += \
+	-DLIBNL_LIBS=-lnl-tiny \
+	-DDEBUG=1
+
+define Package/netifd/install
+	$(INSTALL_DIR) $(1)/sbin
+	$(INSTALL_BIN) $(PKG_BUILD_DIR)/netifd $(1)/sbin/
+	$(CP) ./files/* $(1)/
+	$(INSTALL_DIR) $(1)/etc/udhcpc.user.d/
+	$(CP) $(PKG_BUILD_DIR)/scripts/* $(1)/lib/netifd/
+endef
+
+$(eval $(call BuildPackage,netifd))
diff --git a/autobuild_mac80211_release/package/network/config/netifd/files/etc/hotplug.d/iface/00-netstate b/autobuild_mac80211_release/package/network/config/netifd/files/etc/hotplug.d/iface/00-netstate
new file mode 100644
index 0000000..71ccb01
--- /dev/null
+++ b/autobuild_mac80211_release/package/network/config/netifd/files/etc/hotplug.d/iface/00-netstate
@@ -0,0 +1,6 @@
+[ ifup = "$ACTION" ] && {
+	uci_toggle_state network "$INTERFACE" up 1
+	[ -n "$DEVICE" ] && {
+		uci_toggle_state network "$INTERFACE" ifname "$DEVICE"
+	}
+}
diff --git a/autobuild_mac80211_release/package/network/config/netifd/files/etc/init.d/network b/autobuild_mac80211_release/package/network/config/netifd/files/etc/init.d/network
new file mode 100755
index 0000000..dc208c4
--- /dev/null
+++ b/autobuild_mac80211_release/package/network/config/netifd/files/etc/init.d/network
@@ -0,0 +1,144 @@
+#!/bin/sh /etc/rc.common
+
+START=20
+STOP=90
+
+USE_PROCD=1
+
+init_switch() {
+	setup_switch() { return 0; }
+
+	include /lib/network
+	setup_switch
+}
+
+start_service() {
+	init_switch
+
+	procd_open_instance
+	procd_set_param command /sbin/netifd
+	procd_set_param respawn
+	procd_set_param watch network.interface
+	[ -e /proc/sys/kernel/core_pattern ] && {
+		procd_set_param limits core="unlimited"
+	}
+	procd_close_instance
+}
+
+reload_service() {
+	local rv=0
+
+	init_switch
+	ubus call network reload || rv=1
+	/sbin/wifi reload_legacy
+	return $rv
+}
+
+stop_service() {
+	/sbin/wifi down
+	ifdown -a
+	sleep 1
+}
+
+validate_atm_bridge_section()
+{
+	uci_validate_section network "atm-bridge" "${1}" \
+		'unit:uinteger:0' \
+		'vci:range(32, 65535):35' \
+		'vpi:range(0, 255):8' \
+		'atmdev:uinteger:0' \
+		'encaps:or("llc", "vc"):llc' \
+		'payload:or("bridged", "routed"):bridged'
+}
+
+validate_route_section()
+{
+	uci_validate_section network route "${1}" \
+		'interface:string' \
+		'target:cidr4' \
+		'netmask:netmask4' \
+		'gateway:ip4addr' \
+		'metric:uinteger' \
+		'mtu:uinteger' \
+		'table:or(range(0,65535),string)'
+}
+
+validate_route6_section()
+{
+	uci_validate_section network route6 "${1}" \
+		'interface:string' \
+		'target:cidr6' \
+		'gateway:ip6addr' \
+		'metric:uinteger' \
+		'mtu:uinteger' \
+		'table:or(range(0,65535),string)'
+}
+
+validate_rule_section()
+{
+	uci_validate_section network rule "${1}" \
+		'in:string' \
+		'out:string' \
+		'src:cidr4' \
+		'dest:cidr4' \
+		'tos:range(0,31)' \
+		'mark:string' \
+		'invert:bool' \
+		'lookup:or(range(0,65535),string)' \
+		'goto:range(0,65535)' \
+		'action:or("prohibit", "unreachable", "blackhole", "throw")'
+}
+
+validate_rule6_section()
+{
+	uci_validate_section network rule6 "${1}" \
+		'in:string' \
+		'out:string' \
+		'src:cidr6' \
+		'dest:cidr6' \
+		'tos:range(0,31)' \
+		'mark:string' \
+		'invert:bool' \
+		'lookup:or(range(0,65535),string)' \
+		'goto:range(0,65535)' \
+		'action:or("prohibit", "unreachable", "blackhole", "throw")'
+}
+
+validate_switch_section()
+{
+	uci_validate_section network switch "${1}" \
+		'name:string' \
+		'enable:bool' \
+		'enable_vlan:bool' \
+		'reset:bool' \
+		'ar8xxx_mib_poll_interval:uinteger' \
+		'ar8xxx_mib_type:range(0,1)'
+}
+
+validate_switch_vlan()
+{
+	uci_validate_section network switch_vlan "${1}" \
+		'device:string' \
+		'vlan:uinteger' \
+		'ports:list(ports)'
+}
+
+service_triggers()
+{
+	procd_add_reload_trigger network wireless
+
+	procd_open_validate
+	validate_atm_bridge_section
+	validate_route_section
+	[ -e /proc/sys/net/ipv6 ] && validate_route6_section
+	validate_rule_section
+	[ -e /proc/sys/net/ipv6 ] && validate_rule6_section
+	validate_switch_section
+	validate_switch_vlan
+	procd_close_validate
+}
+
+shutdown() {
+	ifdown -a
+	sleep 1
+}
diff --git a/autobuild_mac80211_release/package/network/config/netifd/files/etc/init.d/packet_steering b/autobuild_mac80211_release/package/network/config/netifd/files/etc/init.d/packet_steering
new file mode 100755
index 0000000..9d8f791
--- /dev/null
+++ b/autobuild_mac80211_release/package/network/config/netifd/files/etc/init.d/packet_steering
@@ -0,0 +1,18 @@
+#!/bin/sh /etc/rc.common
+
+START=25
+USE_PROCD=1
+
+start_service() {
+	reload_service
+}
+
+service_triggers() {
+	procd_add_reload_trigger "network"
+	procd_add_reload_trigger "firewall"
+	procd_add_raw_trigger "interface.*" 1000 /etc/init.d/packet_steering reload
+}
+
+reload_service() {
+	/usr/libexec/network/packet-steering.sh
+}
diff --git a/autobuild_mac80211_release/package/network/config/netifd/files/etc/uci-defaults/14_migrate-dhcp-release b/autobuild_mac80211_release/package/network/config/netifd/files/etc/uci-defaults/14_migrate-dhcp-release
new file mode 100644
index 0000000..f1b384e
--- /dev/null
+++ b/autobuild_mac80211_release/package/network/config/netifd/files/etc/uci-defaults/14_migrate-dhcp-release
@@ -0,0 +1,23 @@
+. /lib/functions.sh
+
+migrate_release() {
+	local config="$1"
+	local proto
+	local release
+
+	config_get proto "$config" proto
+	config_get release "$config" release
+
+	[ "$proto" = "dhcp" ] && [ -n "$release" ] && {
+		norelease="$((!$release))"
+		uci_set network "$config" norelease "$norelease"
+		uci_remove network "$config" release
+	}
+
+}
+
+config_load network
+config_foreach migrate_release interface
+uci commit network
+
+exit 0
diff --git a/autobuild_mac80211_release/package/network/config/netifd/files/etc/udhcpc.user b/autobuild_mac80211_release/package/network/config/netifd/files/etc/udhcpc.user
new file mode 100644
index 0000000..78e2ba5
--- /dev/null
+++ b/autobuild_mac80211_release/package/network/config/netifd/files/etc/udhcpc.user
@@ -0,0 +1 @@
+# This script is sourced by udhcpc's dhcp.script at every DHCP event.
diff --git a/autobuild_mac80211_release/package/network/config/netifd/files/lib/netifd/dhcp.script b/autobuild_mac80211_release/package/network/config/netifd/files/lib/netifd/dhcp.script
new file mode 100755
index 0000000..6fcf139
--- /dev/null
+++ b/autobuild_mac80211_release/package/network/config/netifd/files/lib/netifd/dhcp.script
@@ -0,0 +1,120 @@
+#!/bin/sh
+[ -z "$1" ] && echo "Error: should be run by udhcpc" && exit 1
+
+. /lib/functions.sh
+. /lib/netifd/netifd-proto.sh
+
+set_classless_routes() {
+	local max=128
+	while [ -n "$1" -a -n "$2" -a $max -gt 0 ]; do
+		proto_add_ipv4_route "${1%%/*}" "${1##*/}" "$2" "$ip"
+		max=$(($max-1))
+		shift 2
+	done
+}
+
+setup_interface () {
+	proto_init_update "*" 1
+	proto_add_ipv4_address "$ip" "${subnet:-255.255.255.0}"
+	# TODO: apply $broadcast
+
+	local ip_net
+	eval "$(ipcalc.sh "$ip/$mask")";ip_net="$NETWORK"
+
+	local i
+	for i in $router; do
+		local gw_net
+		eval "$(ipcalc.sh "$i/$mask")";gw_net="$NETWORK"
+
+		[ "$ip_net" != "$gw_net" ] && proto_add_ipv4_route "$i" 32 "" "$ip"
+		proto_add_ipv4_route 0.0.0.0 0 "$i" "$ip"
+
+		local r
+		for r in $CUSTOMROUTES; do
+			proto_add_ipv4_route "${r%%/*}" "${r##*/}" "$i" "$ip"
+		done
+	done
+
+	# CIDR STATIC ROUTES (rfc3442)
+	[ -n "$staticroutes" ] && set_classless_routes $staticroutes
+	[ -n "$msstaticroutes" ] && set_classless_routes $msstaticroutes
+
+	for i in $dns; do
+		proto_add_dns_server "$i"
+	done
+	for i in $domain; do
+		proto_add_dns_search "$i"
+	done
+
+	# TODO: Deprecate timesvr in favor of timesrv
+	if [ -n "$timesvr" -a -z "$timesrv" ]; then
+		timesrv="$timesvr"
+		echo "Environment variable 'timesvr' will be deprecated; use 'timesrv' instead."
+	fi
+
+	proto_add_data
+	[ -n "$ZONE" ]     && json_add_string zone "$ZONE"
+	[ -n "$ntpsrv" ]   && json_add_string ntpserver "$ntpsrv"
+	[ -n "$timesrv" ]  && json_add_string timeserver "$timesrv"
+	[ -n "$hostname" ] && json_add_string hostname "$hostname"
+	[ -n "$message" ]  && json_add_string message "$message"
+	[ -n "$timezone" ] && json_add_int timezone "$timezone"
+	[ -n "$lease" ]    && json_add_int leasetime "$lease"
+	[ -n "$serverid" ] && json_add_string dhcpserver "$serverid"
+	proto_close_data
+
+	proto_send_update "$INTERFACE"
+
+
+	if [ "$IFACE6RD" != 0 -a -n "$ip6rd" ]; then
+		local v4mask="${ip6rd%% *}"
+		ip6rd="${ip6rd#* }"
+		local ip6rdprefixlen="${ip6rd%% *}"
+		ip6rd="${ip6rd#* }"
+		local ip6rdprefix="${ip6rd%% *}"
+		ip6rd="${ip6rd#* }"
+		local ip6rdbr="${ip6rd%% *}"
+
+		[ -n "$ZONE" ] || ZONE=$(fw3 -q network $INTERFACE 2>/dev/null)
+		[ -z "$IFACE6RD" -o "$IFACE6RD" = 1 ] && IFACE6RD=${INTERFACE}_6
+
+		json_init
+		json_add_string name "$IFACE6RD"
+		json_add_string ifname "@$INTERFACE"
+		json_add_string proto "6rd"
+		json_add_string peeraddr "$ip6rdbr"
+		json_add_int ip4prefixlen "$v4mask"
+		json_add_string ip6prefix "$ip6rdprefix"
+		json_add_int ip6prefixlen "$ip6rdprefixlen"
+		json_add_string tunlink "$INTERFACE"
+		[ -n "$IFACE6RD_DELEGATE" ] && json_add_boolean delegate "$IFACE6RD_DELEGATE"
+		[ -n "$ZONE6RD" ] || ZONE6RD=$ZONE
+		[ -n "$ZONE6RD" ] && json_add_string zone "$ZONE6RD"
+		[ -n "$MTU6RD" ] && json_add_string mtu "$MTU6RD"
+		json_close_object
+
+		ubus call network add_dynamic "$(json_dump)"
+	fi
+}
+
+deconfig_interface() {
+	proto_init_update "*" 0
+	proto_send_update "$INTERFACE"
+}
+
+case "$1" in
+	deconfig)
+		deconfig_interface
+	;;
+	renew|bound)
+		setup_interface
+	;;
+esac
+
+# user rules
+[ -f /etc/udhcpc.user ] && . /etc/udhcpc.user "$@"
+for f in /etc/udhcpc.user.d/*; do
+	[ -f "$f" ] && (. "$f" "$@")
+done
+
+exit 0
diff --git a/autobuild_mac80211_release/package/network/config/netifd/files/lib/netifd/proto/dhcp.sh b/autobuild_mac80211_release/package/network/config/netifd/files/lib/netifd/proto/dhcp.sh
new file mode 100755
index 0000000..636b465
--- /dev/null
+++ b/autobuild_mac80211_release/package/network/config/netifd/files/lib/netifd/proto/dhcp.sh
@@ -0,0 +1,88 @@
+#!/bin/sh
+
+[ -x /sbin/udhcpc ] || exit 0
+
+. /lib/functions.sh
+. ../netifd-proto.sh
+init_proto "$@"
+
+proto_dhcp_init_config() {
+	renew_handler=1
+
+	proto_config_add_string 'ipaddr:ipaddr'
+	proto_config_add_string 'hostname:hostname'
+	proto_config_add_string clientid
+	proto_config_add_string vendorid
+	proto_config_add_boolean 'broadcast:bool'
+	proto_config_add_boolean 'norelease:bool'
+	proto_config_add_string 'reqopts:list(string)'
+	proto_config_add_boolean 'defaultreqopts:bool'
+	proto_config_add_string iface6rd
+	proto_config_add_array 'sendopts:list(string)'
+	proto_config_add_boolean delegate
+	proto_config_add_string zone6rd
+	proto_config_add_string zone
+	proto_config_add_string mtu6rd
+	proto_config_add_string customroutes
+	proto_config_add_boolean classlessroute
+}
+
+proto_dhcp_add_sendopts() {
+	[ -n "$1" ] && append "$3" "-x $1"
+}
+
+proto_dhcp_setup() {
+	local config="$1"
+	local iface="$2"
+
+	local ipaddr hostname clientid vendorid broadcast norelease reqopts defaultreqopts iface6rd sendopts delegate zone6rd zone mtu6rd customroutes classlessroute
+	json_get_vars ipaddr hostname clientid vendorid broadcast norelease reqopts defaultreqopts iface6rd delegate zone6rd zone mtu6rd customroutes classlessroute
+
+	local opt dhcpopts
+	for opt in $reqopts; do
+		append dhcpopts "-O $opt"
+	done
+
+	json_for_each_item proto_dhcp_add_sendopts sendopts dhcpopts
+
+	[ -z "$hostname" ] && hostname="$(cat /proc/sys/kernel/hostname)"
+	[ "$hostname" = "*" ] && hostname=
+
+	[ "$defaultreqopts" = 0 ] && defaultreqopts="-o" || defaultreqopts=
+	[ "$broadcast" = 1 ] && broadcast="-B" || broadcast=
+	[ "$norelease" = 1 ] && norelease="" || norelease="-R"
+	[ -n "$clientid" ] && clientid="-x 0x3d:${clientid//:/}" || clientid="-C"
+	[ -n "$iface6rd" ] && proto_export "IFACE6RD=$iface6rd"
+	[ "$iface6rd" != 0 -a -f /lib/netifd/proto/6rd.sh ] && append dhcpopts "-O 212"
+	[ -n "$zone6rd" ] && proto_export "ZONE6RD=$zone6rd"
+	[ -n "$zone" ] && proto_export "ZONE=$zone"
+	[ -n "$mtu6rd" ] && proto_export "MTU6RD=$mtu6rd"
+	[ -n "$customroutes" ] && proto_export "CUSTOMROUTES=$customroutes"
+	[ "$delegate" = "0" ] && proto_export "IFACE6RD_DELEGATE=0"
+	# Request classless route option (see RFC 3442) by default
+	[ "$classlessroute" = "0" ] || append dhcpopts "-O 121"
+
+	proto_export "INTERFACE=$config"
+	proto_run_command "$config" udhcpc \
+		-p /var/run/udhcpc-$iface.pid \
+		-s /lib/netifd/dhcp.script \
+		-f -t 0 -i "$iface" \
+		${ipaddr:+-r ${ipaddr/\/*/}} \
+		${hostname:+-x "hostname:$hostname"} \
+		${vendorid:+-V "$vendorid"} \
+		$clientid $defaultreqopts $broadcast $norelease $dhcpopts
+}
+
+proto_dhcp_renew() {
+	local interface="$1"
+	# SIGUSR1 forces udhcpc to renew its lease
+	local sigusr1="$(kill -l SIGUSR1)"
+	[ -n "$sigusr1" ] && proto_kill_command "$interface" $sigusr1
+}
+
+proto_dhcp_teardown() {
+	local interface="$1"
+	proto_kill_command "$interface"
+}
+
+add_protocol dhcp
diff --git a/autobuild_mac80211_release/package/network/config/netifd/files/lib/network/config.sh b/autobuild_mac80211_release/package/network/config/netifd/files/lib/network/config.sh
new file mode 100755
index 0000000..4cd28e4
--- /dev/null
+++ b/autobuild_mac80211_release/package/network/config/netifd/files/lib/network/config.sh
@@ -0,0 +1,76 @@
+#!/bin/sh
+# Copyright (C) 2011 OpenWrt.org
+
+. /usr/share/libubox/jshn.sh
+
+find_config() {
+	local device="$1"
+	local ifdev ifl3dev ifobj
+	for ifobj in $(ubus list network.interface.\*); do
+		interface="${ifobj##network.interface.}"
+		(
+			json_load "$(ifstatus $interface)"
+			json_get_var ifdev device
+			json_get_var ifl3dev l3_device
+			if [ "$device" = "$ifdev" ] || [ "$device" = "$ifl3dev" ]; then
+				echo "$interface"
+				exit 0
+			else
+				exit 1
+			fi
+		) && return
+	done
+}
+
+unbridge() {
+	return
+}
+
+ubus_call() {
+	json_init
+	local _data="$(ubus -S call "$1" "$2")"
+	[ -z "$_data" ] && return 1
+	json_load "$_data"
+	return 0
+}
+
+
+fixup_interface() {
+	local config="$1"
+	local ifname type device l3dev
+
+	config_get type "$config" type
+	config_get ifname "$config" ifname
+	[ "bridge" = "$type" ] && ifname="br-$config"
+	ubus_call "network.interface.$config" status || return 0
+	json_get_var l3dev l3_device
+	[ -n "$l3dev" ] && ifname="$l3dev"
+	json_init
+	config_set "$config" ifname "$ifname"
+}
+
+scan_interfaces() {
+	config_load network
+	config_foreach fixup_interface interface
+}
+
+prepare_interface_bridge() {
+	local config="$1"
+
+	[ -n "$config" ] || return 0
+	ubus call network.interface."$config" prepare
+}
+
+setup_interface() {
+	local iface="$1"
+	local config="$2"
+
+	[ -n "$config" ] || return 0
+	ubus call network.interface."$config" add_device "{ \"name\": \"$iface\" }"
+}
+
+do_sysctl() {
+	[ -n "$2" ] && \
+		sysctl -n -e -w "$1=$2" >/dev/null || \
+		sysctl -n -e "$1"
+}
diff --git a/autobuild_mac80211_release/package/network/config/netifd/files/sbin/devstatus b/autobuild_mac80211_release/package/network/config/netifd/files/sbin/devstatus
new file mode 100755
index 0000000..3c35b26
--- /dev/null
+++ b/autobuild_mac80211_release/package/network/config/netifd/files/sbin/devstatus
@@ -0,0 +1,12 @@
+#!/bin/sh
+. /usr/share/libubox/jshn.sh
+DEVICE="$1"
+
+[ -n "$DEVICE" ] || {
+	echo "Usage: $0 <device>"
+	exit 1
+}
+
+json_init
+json_add_string name "$DEVICE"
+ubus call network.device status "$(json_dump)"
diff --git a/autobuild_mac80211_release/package/network/config/netifd/files/sbin/ifdown b/autobuild_mac80211_release/package/network/config/netifd/files/sbin/ifdown
new file mode 120000
index 0000000..a0e5c17
--- /dev/null
+++ b/autobuild_mac80211_release/package/network/config/netifd/files/sbin/ifdown
@@ -0,0 +1 @@
+ifup
\ No newline at end of file
diff --git a/autobuild_mac80211_release/package/network/config/netifd/files/sbin/ifstatus b/autobuild_mac80211_release/package/network/config/netifd/files/sbin/ifstatus
new file mode 100755
index 0000000..8a951e6
--- /dev/null
+++ b/autobuild_mac80211_release/package/network/config/netifd/files/sbin/ifstatus
@@ -0,0 +1,13 @@
+#!/bin/sh
+INTERFACE="$1"
+
+[ -n "$INTERFACE" ] || {
+	echo "Usage: $0 <interface>"
+	exit 1
+}
+
+ubus -S list "network.interface.$INTERFACE" >/dev/null || {
+	echo "Interface $INTERFACE not found"
+	exit 1
+}
+ubus call network.interface status "{ \"interface\" : \"$INTERFACE\" }"
diff --git a/autobuild_mac80211_release/package/network/config/netifd/files/sbin/ifup b/autobuild_mac80211_release/package/network/config/netifd/files/sbin/ifup
new file mode 100755
index 0000000..15be535
--- /dev/null
+++ b/autobuild_mac80211_release/package/network/config/netifd/files/sbin/ifup
@@ -0,0 +1,77 @@
+#!/bin/sh
+
+ifup_all=
+setup_wifi=
+
+if_call() {
+	local interface="$1"
+	for mode in $modes; do
+		ubus call network.interface $mode "{ \"interface\" : \"$interface\" }"
+	done
+}
+
+case "$0" in
+	*ifdown) modes=down;;
+	*ifup)
+		modes="down up"
+		setup_wifi=1
+	;;
+	*) echo "Invalid command: $0";;
+esac
+
+while :; do
+	case "$1" in
+		-a)
+			ifup_all=1
+			shift
+		;;
+		-w)
+			setup_wifi=
+			shift
+		;;
+		*)
+			break
+		;;
+	esac
+done
+
+[ "$modes" = "down up" ] && ubus call network reload
+if [ -n "$ifup_all" ]; then
+	for interface in $(ubus -S list 'network.interface.*'); do
+		if_call "${interface##network.interface.}"
+	done
+	[ -n "$setup_wifi" ] && /sbin/wifi up
+	exit
+else
+	ubus -S list "network.interface.$1" > /dev/null || {
+		echo "Interface $1 not found"
+		exit
+	}
+	if_call "$1"
+fi
+
+if [ -n "$setup_wifi" ] && grep -sq config /etc/config/wireless; then
+	. /lib/functions.sh
+
+	find_related_radios() {
+		local wdev wnet
+		config_get wdev "$1" device
+		config_get wnet "$1" network
+
+		if [ -n "$wdev" ]; then
+			for wnet in $wnet; do
+				if [ "$wnet" = "$network" ]; then
+					append radio_devs "$wdev" "$N"
+				fi
+			done
+		fi
+	}
+
+	network="$1"
+	config_load wireless
+	config_foreach find_related_radios wifi-iface
+
+	for dev in $(echo "$radio_devs" | sort -u); do
+		/sbin/wifi up "$dev"
+	done
+fi
diff --git a/autobuild_mac80211_release/package/network/config/netifd/files/usr/libexec/network/packet-steering.sh b/autobuild_mac80211_release/package/network/config/netifd/files/usr/libexec/network/packet-steering.sh
new file mode 100755
index 0000000..799c080
--- /dev/null
+++ b/autobuild_mac80211_release/package/network/config/netifd/files/usr/libexec/network/packet-steering.sh
@@ -0,0 +1,70 @@
+#!/bin/sh
+NPROCS="$(grep -c "^processor.*:" /proc/cpuinfo)"
+[ "$NPROCS" -gt 1 ] || exit
+
+PROC_MASK="$(( (1 << $NPROCS) - 1 ))"
+
+find_irq_cpu() {
+	local dev="$1"
+	local match="$(grep -m 1 "$dev\$" /proc/interrupts)"
+	local cpu=0
+
+	[ -n "$match" ] && {
+		set -- $match
+		shift
+		for cur in $(seq 1 $NPROCS); do
+			[ "$1" -gt 0 ] && {
+				cpu=$(($cur - 1))
+				break
+			}
+			shift
+		done
+	}
+
+	echo "$cpu"
+}
+
+set_hex_val() {
+	local file="$1"
+	local val="$2"
+	val="$(printf %x "$val")"
+	[ -n "$DEBUG" ] && echo "$file = $val"
+	echo "$val" > "$file"
+}
+
+packet_steering="$(uci get "network.@globals[0].packet_steering")"
+[ "$packet_steering" != 1 ] && exit 0
+
+exec 512>/var/lock/smp_tune.lock
+flock 512 || exit 1
+
+[ -e "/usr/libexec/platform/packet-steering.sh" ] && {
+	/usr/libexec/platform/packet-steering.sh
+	exit 0
+}
+
+for dev in /sys/class/net/*; do
+	[ -d "$dev" ] || continue
+
+	# ignore virtual interfaces
+	[ -n "$(ls "${dev}/" | grep '^lower_')" ] && continue
+	[ -d "${dev}/device" ] || continue
+
+	device="$(readlink "${dev}/device")"
+	device="$(basename "$device")"
+	irq_cpu="$(find_irq_cpu "$device")"
+	irq_cpu_mask="$((1 << $irq_cpu))"
+
+	for q in ${dev}/queues/tx-*; do
+		set_hex_val "$q/xps_cpus" "$PROC_MASK"
+	done
+
+	# ignore dsa slave ports for RPS
+	subsys="$(readlink "${dev}/device/subsystem")"
+	subsys="$(basename "$subsys")"
+	[ "$subsys" = "mdio_bus" ] && continue
+
+	for q in ${dev}/queues/rx-*; do
+		set_hex_val "$q/rps_cpus" "$PROC_MASK"
+	done
+done
diff --git a/autobuild_mac80211_release/package/network/config/netifd/files/usr/share/udhcpc/default.script b/autobuild_mac80211_release/package/network/config/netifd/files/usr/share/udhcpc/default.script
new file mode 100755
index 0000000..0a9eb01
--- /dev/null
+++ b/autobuild_mac80211_release/package/network/config/netifd/files/usr/share/udhcpc/default.script
@@ -0,0 +1,57 @@
+#!/bin/sh
+[ -z "$1" ] && echo "Error: should be run by udhcpc" && exit 1
+
+set_classless_routes() {
+	local max=128
+	local type
+	while [ -n "$1" -a -n "$2" -a $max -gt 0 ]; do
+		[ ${1##*/} -eq 32 ] && type=host || type=net
+		echo "udhcpc: adding route for $type $1 via $2"
+		route add -$type "$1" gw "$2" dev "$interface"
+		max=$(($max-1))
+		shift 2
+	done
+}
+
+setup_interface() {
+	echo "udhcpc: ip addr add $ip/${subnet:-255.255.255.0} broadcast ${broadcast:-+} dev $interface"
+	ip addr add $ip/${subnet:-255.255.255.0} broadcast ${broadcast:-+} dev $interface
+
+	[ -n "$router" ] && [ "$router" != "0.0.0.0" ] && [ "$router" != "255.255.255.255" ] && {
+		echo "udhcpc: setting default routers: $router"
+
+		local valid_gw=""
+		for i in $router ; do
+			route add default gw $i dev $interface
+			valid_gw="${valid_gw:+$valid_gw|}$i"
+		done
+		
+		eval $(route -n | awk '
+			/^0.0.0.0\W{9}('$valid_gw')\W/ {next}
+			/^0.0.0.0/ {print "route del -net "$1" gw "$2";"}
+		')
+	}
+
+	# CIDR STATIC ROUTES (rfc3442)
+	[ -n "$staticroutes" ] && set_classless_routes $staticroutes
+	[ -n "$msstaticroutes" ] && set_classless_routes $msstaticroutes
+}
+
+
+applied=
+case "$1" in
+	deconfig)
+		ip -4 addr flush dev "$interface"
+	;;
+	renew)
+		setup_interface update
+	;;
+	bound)
+		setup_interface ifup
+	;;
+esac
+
+# user rules
+[ -f /etc/udhcpc.user ] && . /etc/udhcpc.user
+
+exit 0
diff --git a/autobuild_mac80211_release/package/network/config/netifd_new/patches/0001-netifd-revert-commit-can-t-work-for-Kernel5.4.patch b/autobuild_mac80211_release/package/network/config/netifd_new/patches/0001-netifd-revert-commit-can-t-work-for-Kernel5.4.patch
new file mode 100644
index 0000000..591f7e7
--- /dev/null
+++ b/autobuild_mac80211_release/package/network/config/netifd_new/patches/0001-netifd-revert-commit-can-t-work-for-Kernel5.4.patch
@@ -0,0 +1,687 @@
+From f73e9179da805301affa628de794046ef8ef2ff0 Mon Sep 17 00:00:00 2001
+From: Evelyn Tsai <evelyn.tsai@mediatek.com>
+Date: Sun, 17 Sep 2023 12:28:35 +0800
+Subject: [PATCH 1/4] netifd: revert: commit can't work for Kernel5.4
+
+Revert "make_ethtool_modes_h.sh: apply anti-bashism"
+This reverts commit 1a07f1dff32b3af49e39533e33e8964b59535662.
+Revert "system-linux: switch to new ETHTOOL_xLINKSETTINGS API"
+This reverts commit f429bd94f99e55548bf4fa8156c165017ce3c41c.
+---
+ CMakeLists.txt          |   8 -
+ device.c                |  35 ----
+ device.h                |  15 --
+ make_ethtool_modes_h.sh |  66 -------
+ system-linux.c          | 404 +++++++++-------------------------------
+ 5 files changed, 87 insertions(+), 441 deletions(-)
+ delete mode 100755 make_ethtool_modes_h.sh
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 8064485..5ad8695 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -49,13 +49,6 @@ IF (NOT DEFINED LIBNL_LIBS)
+ 	ENDIF()
+ ENDIF()
+ 
+-ADD_CUSTOM_COMMAND(
+-	OUTPUT ethtool-modes.h
+-	COMMAND ./make_ethtool_modes_h.sh ${CMAKE_C_COMPILER} > ./ethtool-modes.h
+-	DEPENDS ./make_ethtool_modes_h.sh
+-)
+-ADD_CUSTOM_TARGET(ethtool-modes-h DEPENDS ethtool-modes.h)
+-
+ IF("${CMAKE_SYSTEM_NAME}" MATCHES "Linux" AND NOT DUMMY_MODE)
+ 	SET(SOURCES ${SOURCES} system-linux.c)
+ 	SET(LIBS ${LIBS} ${LIBNL_LIBS})
+@@ -79,4 +72,3 @@ TARGET_LINK_LIBRARIES(netifd ${LIBS})
+ INSTALL(TARGETS netifd
+ 	RUNTIME DESTINATION sbin
+ )
+-ADD_DEPENDENCIES(netifd ethtool-modes-h)
+diff --git a/device.c b/device.c
+index 2417556..92c814c 100644
+--- a/device.c
++++ b/device.c
+@@ -64,11 +64,6 @@ static const struct blobmsg_policy dev_attrs[__DEV_ATTR_MAX] = {
+ 	[DEV_ATTR_SPEED] = { .name = "speed", .type = BLOBMSG_TYPE_INT32 },
+ 	[DEV_ATTR_DUPLEX] = { .name = "duplex", .type = BLOBMSG_TYPE_BOOL },
+ 	[DEV_ATTR_VLAN] = { .name = "vlan", .type = BLOBMSG_TYPE_ARRAY },
+-	[DEV_ATTR_PAUSE] = { .name = "pause", .type = BLOBMSG_TYPE_BOOL },
+-	[DEV_ATTR_ASYM_PAUSE] = { .name = "asym_pause", .type = BLOBMSG_TYPE_BOOL },
+-	[DEV_ATTR_RXPAUSE] = { .name = "rxpause", .type = BLOBMSG_TYPE_BOOL },
+-	[DEV_ATTR_TXPAUSE] = { .name = "txpause", .type = BLOBMSG_TYPE_BOOL },
+-	[DEV_ATTR_AUTONEG] = { .name = "autoneg", .type = BLOBMSG_TYPE_BOOL },
+ };
+ 
+ const struct uci_blob_param_list device_attr_list = {
+@@ -286,11 +281,6 @@ device_merge_settings(struct device *dev, struct device_settings *n)
+ 	n->auth = s->flags & DEV_OPT_AUTH ? s->auth : os->auth;
+ 	n->speed = s->flags & DEV_OPT_SPEED ? s->speed : os->speed;
+ 	n->duplex = s->flags & DEV_OPT_DUPLEX ? s->duplex : os->duplex;
+-	n->pause = s->flags & DEV_OPT_PAUSE ? s->pause : os->pause;
+-	n->asym_pause = s->flags & DEV_OPT_ASYM_PAUSE ? s->asym_pause : os->asym_pause;
+-	n->rxpause = s->flags & DEV_OPT_RXPAUSE ? s->rxpause : os->rxpause;
+-	n->txpause = s->flags & DEV_OPT_TXPAUSE ? s->txpause : os->txpause;
+-	n->autoneg = s->flags & DEV_OPT_AUTONEG ? s->autoneg : os->autoneg;
+ 	n->flags = s->flags | os->flags | os->valid_flags;
+ }
+ 
+@@ -515,31 +505,6 @@ device_init_settings(struct device *dev, struct blob_attr **tb)
+ 		s->duplex = blobmsg_get_bool(cur);
+ 		s->flags |= DEV_OPT_DUPLEX;
+ 	}
+-
+-	if ((cur = tb[DEV_ATTR_PAUSE])) {
+-		s->pause = blobmsg_get_bool(cur);
+-		s->flags |= DEV_OPT_PAUSE;
+-	}
+-
+-	if ((cur = tb[DEV_ATTR_ASYM_PAUSE])) {
+-		s->asym_pause = blobmsg_get_bool(cur);
+-		s->flags |= DEV_OPT_ASYM_PAUSE;
+-	}
+-
+-	if ((cur = tb[DEV_ATTR_RXPAUSE])) {
+-		s->rxpause = blobmsg_get_bool(cur);
+-		s->flags |= DEV_OPT_RXPAUSE;
+-	}
+-
+-	if ((cur = tb[DEV_ATTR_TXPAUSE])) {
+-		s->txpause = blobmsg_get_bool(cur);
+-		s->flags |= DEV_OPT_TXPAUSE;
+-	}
+-
+-	if ((cur = tb[DEV_ATTR_AUTONEG])) {
+-		s->autoneg = blobmsg_get_bool(cur);
+-		s->flags |= DEV_OPT_AUTONEG;
+-	}
+ 	device_set_extra_vlans(dev, tb[DEV_ATTR_VLAN]);
+ 	device_set_disabled(dev, disabled);
+ }
+diff --git a/device.h b/device.h
+index 14d7486..aa4da18 100644
+--- a/device.h
++++ b/device.h
+@@ -63,11 +63,6 @@ enum {
+ 	DEV_ATTR_SPEED,
+ 	DEV_ATTR_DUPLEX,
+ 	DEV_ATTR_VLAN,
+-	DEV_ATTR_PAUSE,
+-	DEV_ATTR_ASYM_PAUSE,
+-	DEV_ATTR_RXPAUSE,
+-	DEV_ATTR_TXPAUSE,
+-	DEV_ATTR_AUTONEG,
+ 	__DEV_ATTR_MAX,
+ };
+ 
+@@ -132,11 +127,6 @@ enum {
+ 	DEV_OPT_ARP_ACCEPT		= (1ULL << 29),
+ 	DEV_OPT_SPEED			= (1ULL << 30),
+ 	DEV_OPT_DUPLEX			= (1ULL << 31),
+-	DEV_OPT_PAUSE			= (1ULL << 32),
+-	DEV_OPT_ASYM_PAUSE		= (1ULL << 33),
+-	DEV_OPT_RXPAUSE			= (1ULL << 34),
+-	DEV_OPT_TXPAUSE			= (1ULL << 35),
+-	DEV_OPT_AUTONEG			= (1ULL << 36),
+ };
+ 
+ /* events broadcasted to all users of a device */
+@@ -214,11 +204,6 @@ struct device_settings {
+ 	bool auth;
+ 	unsigned int speed;
+ 	bool duplex;
+-	bool pause;
+-	bool asym_pause;
+-	bool rxpause;
+-	bool txpause;
+-	bool autoneg;
+ };
+ 
+ struct device_vlan_range {
+diff --git a/make_ethtool_modes_h.sh b/make_ethtool_modes_h.sh
+deleted file mode 100755
+index 7f5ac7b..0000000
+--- a/make_ethtool_modes_h.sh
++++ /dev/null
+@@ -1,66 +0,0 @@
+-#!/bin/sh
+-
+-CC="$1"
+-[ -n "$TARGET_CC_NOCACHE" ] && CC="$TARGET_CC_NOCACHE"
+-
+-cat <<EOF
+-#include <linux/ethtool.h>
+-
+-#define ETHTOOL_MODE_FULL(_speed, _mode) {					\\
+-	.speed = (_speed),							\\
+-	.bit_half = -1,								\\
+-	.bit_full = ETHTOOL_LINK_MODE_ ## _speed ## base ## _mode ## _Full_BIT,	\\
+-	.name = #_speed "base" #_mode,						\\
+-}
+-
+-#define ETHTOOL_MODE_HALF(_speed, _mode) {					\\
+-	.speed = (_speed),							\\
+-	.bit_half = ETHTOOL_LINK_MODE_ ## _speed ## base ## _mode ## _Half_BIT,	\\
+-	.bit_full = -1,								\\
+-	.name = #_speed "base" #_mode,						\\
+-}
+-
+-#define ETHTOOL_MODE_BOTH(_speed, _mode) {					\\
+-	.speed = (_speed),							\\
+-	.bit_half = ETHTOOL_LINK_MODE_ ## _speed ## base ## _mode ## _Half_BIT,	\\
+-	.bit_full = ETHTOOL_LINK_MODE_ ## _speed ## base ## _mode ## _Full_BIT,	\\
+-	.name = #_speed "base" #_mode,						\\
+-}
+-
+-static const struct {
+-	unsigned int speed;
+-	int bit_half;
+-	int bit_full;
+-	const char *name;
+-} ethtool_modes[] = {
+-EOF
+-
+-echo "#include <linux/ethtool.h>" | "$CC" -E - | \
+-	grep "ETHTOOL_LINK_MODE_[0-9]*base[A-Za-z0-9]*_...._BIT.*" | \
+-	sed -r 's/.*ETHTOOL_LINK_MODE_([0-9]*)base([A-Za-z0-9]*)_(....)_BIT.*/\1 \2 \3/' | \
+-	sort -u | LC_ALL=C sort -r -g | ( gothalf=0 ; while read -r speed mode duplex; do
+-		if [ "$duplex" = "Half" ]; then
+-			if [ "$gothalf" = "1" ]; then
+-				printf "%s" "$speed \tETHTOOL_MODE_HALF($p_speed, $p_mode),\n"
+-			fi
+-			gothalf=1
+-		elif [ "$duplex" = "Full" ]; then
+-			if [ "$gothalf" = "1" ]; then
+-				if [ "$p_speed" = "$speed" ] && [ "$p_mode" = "$mode" ]; then
+-					printf "%d \t%s\n" "$speed" "ETHTOOL_MODE_BOTH($speed, $mode),"
+-				else
+-					printf "%d \t%s\n" "$p_speed" "ETHTOOL_MODE_HALF($p_speed, $p_mode),"
+-					printf "%d \t%s\n" "$speed" "ETHTOOL_MODE_FULL($speed, $mode),"
+-				fi
+-				gothalf=0
+-			else
+-				printf "%d \t%s\n" "$speed" "ETHTOOL_MODE_FULL($speed, $mode),"
+-			fi
+-		else
+-			continue
+-		fi
+-		p_speed="$speed"
+-		p_mode="$mode"
+-	done ; [ "$gothalf" = "1" ] && printf "%d \t%s\n" "$p_speed" "ETHTOOL_MODE_HALF($p_speed, $p_mode)," ) | \
+-	LC_ALL=C sort -g | sed -r 's/[0-9]* (.*)/\1/'
+-echo "};"
+diff --git a/system-linux.c b/system-linux.c
+index e437377..0760e73 100644
+--- a/system-linux.c
++++ b/system-linux.c
+@@ -48,8 +48,6 @@
+ 
+ #include <sched.h>
+ 
+-#include "ethtool-modes.h"
+-
+ #ifndef RTN_FAILED_POLICY
+ #define RTN_FAILED_POLICY 12
+ #endif
+@@ -1704,149 +1702,54 @@ int system_vlandev_del(struct device *vlandev)
+ 	return system_link_del(vlandev->ifname);
+ }
+ 
+-static void ethtool_link_mode_clear_bit(__s8 nwords, int nr, __u32 *mask)
+-{
+-	if (nr < 0)
+-		return;
+-
+-	if (nr >= (nwords * 32))
+-		return;
+-
+-	mask[nr / 32] &= ~(1U << (nr % 32));
+-}
+-
+-static bool ethtool_link_mode_test_bit(__s8 nwords, int nr, const __u32 *mask)
+-{
+-	if (nr < 0)
+-		return false;
+-
+-	if (nr >= (nwords * 32))
+-		return false;
+-
+-	return !!(mask[nr / 32] & (1U << (nr % 32)));
+-}
+-
+-static void
+-system_set_ethtool_pause(struct device *dev, struct device_settings *s)
+-{
+-	struct ethtool_pauseparam pp;
+-	struct ifreq ifr = {
+-		.ifr_data = (caddr_t)&pp,
+-	};
+-
+-	strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name) - 1);
+-	memset(&pp, 0, sizeof(pp));
+-	pp.cmd = ETHTOOL_GPAUSEPARAM;
+-	if (ioctl(sock_ioctl, SIOCETHTOOL, &ifr))
+-		return;
+-
+-	if (s->flags & DEV_OPT_RXPAUSE || s->flags & DEV_OPT_TXPAUSE) {
+-		pp.autoneg = AUTONEG_DISABLE;
+-
+-		if (s->flags & DEV_OPT_PAUSE) {
+-			if (s->flags & DEV_OPT_RXPAUSE)
+-				pp.rx_pause = s->rxpause && s->pause;
+-			else
+-				pp.rx_pause = s->pause;
+-
+-			if (s->flags & DEV_OPT_TXPAUSE)
+-				pp.tx_pause = s->txpause && s->pause;
+-			else
+-				pp.tx_pause = s->pause;
+-		} else {
+-			if (s->flags & DEV_OPT_RXPAUSE)
+-				pp.rx_pause = s->rxpause;
+-
+-			if (s->flags & DEV_OPT_TXPAUSE)
+-				pp.tx_pause = s->txpause;
+-		}
+-
+-		if (s->flags & DEV_OPT_ASYM_PAUSE &&
+-		    !s->asym_pause && (pp.rx_pause != pp.tx_pause))
+-			pp.rx_pause = pp.tx_pause = false;
+-	} else {
+-		pp.autoneg = AUTONEG_ENABLE;
+-		/* Pause and Asym_Pause advertising bits will be set via
+-		 * ETHTOOL_SLINKSETTINGS in system_set_ethtool_settings()
+-		 */
+-	}
+-
+-	pp.cmd = ETHTOOL_SPAUSEPARAM;
+-	ioctl(sock_ioctl, SIOCETHTOOL, &ifr);
+-}
+-
+ static void
+ system_set_ethtool_settings(struct device *dev, struct device_settings *s)
+ {
+-	struct {
+-		struct ethtool_link_settings req;
+-		__u32 link_mode_data[3 * 127];
+-	} ecmd;
++	struct ethtool_cmd ecmd = {
++		.cmd = ETHTOOL_GSET,
++	};
+ 	struct ifreq ifr = {
+ 		.ifr_data = (caddr_t)&ecmd,
+ 	};
++	static const struct {
++		unsigned int speed;
++		uint8_t bit_half;
++		uint8_t bit_full;
++	} speed_mask[] = {
++		{ 10, ETHTOOL_LINK_MODE_10baseT_Half_BIT, ETHTOOL_LINK_MODE_10baseT_Full_BIT },
++		{ 100, ETHTOOL_LINK_MODE_100baseT_Half_BIT, ETHTOOL_LINK_MODE_100baseT_Full_BIT },
++		{ 1000, ETHTOOL_LINK_MODE_1000baseT_Half_BIT, ETHTOOL_LINK_MODE_1000baseT_Full_BIT },
++	};
++	uint32_t adv;
+ 	size_t i;
+-	__s8 nwords;
+-	__u32 *supported, *advertising;
+ 
+-	system_set_ethtool_pause(dev, s);
+-
+-	memset(&ecmd, 0, sizeof(ecmd));
+-	ecmd.req.cmd = ETHTOOL_GLINKSETTINGS;
+ 	strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name) - 1);
+ 
+-	if (ioctl(sock_ioctl, SIOCETHTOOL, &ifr) < 0 ||
+-	    ecmd.req.link_mode_masks_nwords >= 0 ||
+-	    ecmd.req.cmd != ETHTOOL_GLINKSETTINGS)
+-		return;
+-
+-	ecmd.req.link_mode_masks_nwords = -ecmd.req.link_mode_masks_nwords;
+-
+-	if (ioctl(sock_ioctl, SIOCETHTOOL, &ifr) < 0 ||
+-	    ecmd.req.link_mode_masks_nwords <= 0 ||
+-	    ecmd.req.cmd != ETHTOOL_GLINKSETTINGS)
++	if (ioctl(sock_ioctl, SIOCETHTOOL, &ifr) != 0)
+ 		return;
+ 
+-	nwords = ecmd.req.link_mode_masks_nwords;
+-	supported = &ecmd.link_mode_data[0];
+-	advertising = &ecmd.link_mode_data[nwords];
+-	memcpy(advertising, supported, sizeof(__u32) * nwords);
+-
+-	for (i = 0; i < ARRAY_SIZE(ethtool_modes); i++) {
++	adv = ecmd.supported;
++	for (i = 0; i < ARRAY_SIZE(speed_mask); i++) {
+ 		if (s->flags & DEV_OPT_DUPLEX) {
+-			if (s->duplex)
+-				ethtool_link_mode_clear_bit(nwords, ethtool_modes[i].bit_half, advertising);
+-			else
+-				ethtool_link_mode_clear_bit(nwords, ethtool_modes[i].bit_full, advertising);
++			int bit = s->duplex ? speed_mask[i].bit_half : speed_mask[i].bit_full;
++			adv &= ~(1 << bit);
+ 		}
++
+ 		if (!(s->flags & DEV_OPT_SPEED) ||
+-		    s->speed == ethtool_modes[i].speed)
++		    s->speed == speed_mask[i].speed)
+ 			continue;
+ 
+-		ethtool_link_mode_clear_bit(nwords, ethtool_modes[i].bit_full, advertising);
+-		ethtool_link_mode_clear_bit(nwords, ethtool_modes[i].bit_half, advertising);
++		adv &= ~(1 << speed_mask[i].bit_full);
++		adv &= ~(1 << speed_mask[i].bit_half);
+ 	}
+ 
+-	if (s->flags & DEV_OPT_PAUSE)
+-		if (!s->pause)
+-			ethtool_link_mode_clear_bit(nwords, ETHTOOL_LINK_MODE_Pause_BIT, advertising);
+ 
+-	if (s->flags & DEV_OPT_ASYM_PAUSE)
+-		if (!s->asym_pause)
+-			ethtool_link_mode_clear_bit(nwords, ETHTOOL_LINK_MODE_Asym_Pause_BIT, advertising);
+-
+-	if (s->flags & DEV_OPT_AUTONEG) {
+-		ecmd.req.autoneg = s->autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE;
+-		if (!s->autoneg) {
+-			if (s->flags & DEV_OPT_SPEED)
+-				ecmd.req.speed = s->speed;
+-
+-			if (s->flags & DEV_OPT_DUPLEX)
+-				ecmd.req.duplex = s->duplex ? DUPLEX_FULL : DUPLEX_HALF;
+-		}
+-	}
++	if (ecmd.autoneg && ecmd.advertising == adv)
++		return;
+ 
+-	ecmd.req.cmd = ETHTOOL_SLINKSETTINGS;
++	ecmd.autoneg = 1;
++	ecmd.advertising = adv;
++	ecmd.cmd = ETHTOOL_SSET;
+ 	ioctl(sock_ioctl, SIOCETHTOOL, &ifr);
+ }
+ 
+@@ -2429,6 +2332,45 @@ read_uint64_file(int dir_fd, const char *file, uint64_t *val)
+ 	return ret;
+ }
+ 
++/* Assume advertised flags == supported flags */
++static const struct {
++	uint32_t mask;
++	const char *name;
++} ethtool_link_modes[] = {
++	{ ADVERTISED_10baseT_Half, "10baseT-H" },
++	{ ADVERTISED_10baseT_Full, "10baseT-F" },
++	{ ADVERTISED_100baseT_Half, "100baseT-H" },
++	{ ADVERTISED_100baseT_Full, "100baseT-F" },
++	{ ADVERTISED_1000baseT_Half, "1000baseT-H" },
++	{ ADVERTISED_1000baseT_Full, "1000baseT-F" },
++	{ ADVERTISED_1000baseKX_Full, "1000baseKX-F" },
++	{ ADVERTISED_2500baseX_Full, "2500baseX-F" },
++	{ ADVERTISED_10000baseT_Full, "10000baseT-F" },
++	{ ADVERTISED_10000baseKX4_Full, "10000baseKX4-F" },
++	{ ADVERTISED_10000baseKR_Full, "10000baseKR-F" },
++	{ ADVERTISED_20000baseMLD2_Full, "20000baseMLD2-F" },
++	{ ADVERTISED_20000baseKR2_Full, "20000baseKR2-F" },
++	{ ADVERTISED_40000baseKR4_Full, "40000baseKR4-F" },
++	{ ADVERTISED_40000baseCR4_Full, "40000baseCR4-F" },
++	{ ADVERTISED_40000baseSR4_Full, "40000baseSR4-F" },
++	{ ADVERTISED_40000baseLR4_Full, "40000baseLR4-F" },
++#ifdef ADVERTISED_56000baseKR4_Full
++	{ ADVERTISED_56000baseKR4_Full, "56000baseKR4-F" },
++	{ ADVERTISED_56000baseCR4_Full, "56000baseCR4-F" },
++	{ ADVERTISED_56000baseSR4_Full, "56000baseSR4-F" },
++	{ ADVERTISED_56000baseLR4_Full, "56000baseLR4-F" },
++#endif
++};
++
++static void system_add_link_modes(struct blob_buf *b, __u32 mask)
++{
++	size_t i;
++	for (i = 0; i < ARRAY_SIZE(ethtool_link_modes); i++) {
++		if (mask & ethtool_link_modes[i].mask)
++			blobmsg_add_string(b, NULL, ethtool_link_modes[i].name);
++	}
++}
++
+ bool
+ system_if_force_external(const char *ifname)
+ {
+@@ -2603,213 +2545,41 @@ ethtool_feature_value(const char *ifname, const char *keyname)
+ 	return active;
+ }
+ 
+-static void
+-system_add_link_mode_name(struct blob_buf *b, int i, bool half)
+-{
+-	char *buf;
+-
+-	/* allocate string buffer large enough for the mode name and a suffix
+-	 * "-F" or "-H" indicating full duplex or half duplex.
+-	 */
+-	buf = blobmsg_alloc_string_buffer(b, NULL, strlen(ethtool_modes[i].name) + 3);
+-	if (!buf)
+-		return;
+-
+-	strcpy(buf, ethtool_modes[i].name);
+-	if (half)
+-		strcat(buf, "-H");
+-	else
+-		strcat(buf, "-F");
+-
+-	blobmsg_add_string_buffer(b);
+-}
+-
+-static void
+-system_add_link_modes(__s8 nwords, struct blob_buf *b, __u32 *mask)
+-{
+-	size_t i;
+-
+-	for (i = 0; i < ARRAY_SIZE(ethtool_modes); i++) {
+-		if (ethtool_link_mode_test_bit(nwords, ethtool_modes[i].bit_half, mask))
+-			system_add_link_mode_name(b, i, true);
+-
+-		if (ethtool_link_mode_test_bit(nwords, ethtool_modes[i].bit_full, mask))
+-			system_add_link_mode_name(b, i, false);
+-	}
+-}
+-
+-static void
+-system_add_pause_modes(__s8 nwords, struct blob_buf *b, __u32 *mask)
+-{
+-	if (ethtool_link_mode_test_bit(nwords, ETHTOOL_LINK_MODE_Pause_BIT, mask))
+-		blobmsg_add_string(b, NULL, "pause");
+-
+-	if (ethtool_link_mode_test_bit(nwords, ETHTOOL_LINK_MODE_Asym_Pause_BIT, mask))
+-		blobmsg_add_string(b, NULL, "asym_pause");
+-}
+-
+-
+-static void
+-system_add_ethtool_pause_an(struct blob_buf *b, __s8 nwords,
+-			    __u32 *advertising, __u32 *lp_advertising)
+-{
+-	bool an_rx = false, an_tx = false;
+-	void *d;
+-
+-	d = blobmsg_open_array(b, "negotiated");
+-
+-	/* Work out negotiated pause frame usage per
+-	 * IEEE 802.3-2005 table 28B-3.
+-	 */
+-	if (ethtool_link_mode_test_bit(nwords,
+-				       ETHTOOL_LINK_MODE_Pause_BIT,
+-				       advertising) &&
+-	    ethtool_link_mode_test_bit(nwords,
+-				       ETHTOOL_LINK_MODE_Pause_BIT,
+-				       lp_advertising)) {
+-		an_tx = true;
+-		an_rx = true;
+-	} else if (ethtool_link_mode_test_bit(nwords,
+-					      ETHTOOL_LINK_MODE_Asym_Pause_BIT,
+-					      advertising) &&
+-		   ethtool_link_mode_test_bit(nwords,
+-					      ETHTOOL_LINK_MODE_Asym_Pause_BIT,
+-					      lp_advertising)) {
+-		if (ethtool_link_mode_test_bit(nwords,
+-					       ETHTOOL_LINK_MODE_Pause_BIT,
+-					       advertising))
+-			an_rx = true;
+-		else if (ethtool_link_mode_test_bit(nwords,
+-						    ETHTOOL_LINK_MODE_Pause_BIT,
+-						    lp_advertising))
+-			an_tx = true;
+-	}
+-	if (an_tx)
+-		blobmsg_add_string(b, NULL, "rx");
+-
+-	if (an_rx)
+-		blobmsg_add_string(b, NULL, "tx");
+-
+-	blobmsg_close_array(b, d);
+-}
+-
+-static void
+-system_get_ethtool_pause(struct device *dev, bool *rx_pause, bool *tx_pause, bool *pause_autoneg)
+-{
+-	struct ethtool_pauseparam pp;
+-	struct ifreq ifr = {
+-		.ifr_data = (caddr_t)&pp,
+-	};
+-
+-	strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name) - 1);
+-	memset(&pp, 0, sizeof(pp));
+-	pp.cmd = ETHTOOL_GPAUSEPARAM;
+-
+-	/* may fail */
+-	if (ioctl(sock_ioctl, SIOCETHTOOL, &ifr) == -1) {
+-		*pause_autoneg = true;
+-		return;
+-	}
+-
+-	*rx_pause = pp.rx_pause;
+-	*tx_pause = pp.tx_pause;
+-	*pause_autoneg = pp.autoneg;
+-}
+-
+ int
+ system_if_dump_info(struct device *dev, struct blob_buf *b)
+ {
+-	__u32 *supported, *advertising, *lp_advertising;
+-	bool rx_pause, tx_pause, pause_autoneg;
+-	struct {
+-		struct ethtool_link_settings req;
+-		__u32 link_mode_data[3 * 127];
+-	} ecmd;
+-	struct ifreq ifr = {
+-		.ifr_data = (caddr_t)&ecmd,
+-	};
+-	__s8 nwords;
+-	void *c, *d;
++	struct ethtool_cmd ecmd;
++	struct ifreq ifr;
+ 	char *s;
+-
+-	system_get_ethtool_pause(dev, &rx_pause, &tx_pause, &pause_autoneg);
++	void *c;
+ 
+ 	memset(&ecmd, 0, sizeof(ecmd));
+-	ecmd.req.cmd = ETHTOOL_GLINKSETTINGS;
++	memset(&ifr, 0, sizeof(ifr));
+ 	strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name) - 1);
++	ifr.ifr_data = (caddr_t) &ecmd;
++	ecmd.cmd = ETHTOOL_GSET;
+ 
+-	if (ioctl(sock_ioctl, SIOCETHTOOL, &ifr) < 0 ||
+-	    ecmd.req.link_mode_masks_nwords >= 0 ||
+-	    ecmd.req.cmd != ETHTOOL_GLINKSETTINGS)
+-		return -EOPNOTSUPP;
+-
+-	ecmd.req.link_mode_masks_nwords = -ecmd.req.link_mode_masks_nwords;
+-
+-	if (ioctl(sock_ioctl, SIOCETHTOOL, &ifr) < 0 ||
+-	    ecmd.req.link_mode_masks_nwords <= 0 ||
+-	    ecmd.req.cmd != ETHTOOL_GLINKSETTINGS)
+-		return -EIO;
+-
+-	nwords = ecmd.req.link_mode_masks_nwords;
+-	supported = &ecmd.link_mode_data[0];
+-	advertising = &ecmd.link_mode_data[nwords];
+-	lp_advertising = &ecmd.link_mode_data[2 * nwords];
+-
+-	c = blobmsg_open_array(b, "link-advertising");
+-	system_add_link_modes(nwords, b, advertising);
+-	blobmsg_close_array(b, c);
+-
+-	c = blobmsg_open_array(b, "link-partner-advertising");
+-	system_add_link_modes(nwords, b, lp_advertising);
+-	blobmsg_close_array(b, c);
+-
+-	c = blobmsg_open_array(b, "link-supported");
+-	system_add_link_modes(nwords, b, supported);
+-	blobmsg_close_array(b, c);
+-
+-	if (ethtool_validate_speed(ecmd.req.speed) &&
+-	    (ecmd.req.speed != (__u32)SPEED_UNKNOWN) &&
+-	    (ecmd.req.speed != 0)) {
+-		s = blobmsg_alloc_string_buffer(b, "speed", 10);
+-		snprintf(s, 8, "%d%c", ecmd.req.speed,
+-			ecmd.req.duplex == DUPLEX_HALF ? 'H' : 'F');
+-		blobmsg_add_string_buffer(b);
+-	}
+-	blobmsg_add_u8(b, "autoneg", !!ecmd.req.autoneg);
++	if (ioctl(sock_ioctl, SIOCETHTOOL, &ifr) == 0) {
++		c = blobmsg_open_array(b, "link-advertising");
++		system_add_link_modes(b, ecmd.advertising);
++		blobmsg_close_array(b, c);
+ 
+-	c = blobmsg_open_table(b, "flow-control");
+-	blobmsg_add_u8(b, "autoneg", pause_autoneg);
++		c = blobmsg_open_array(b, "link-partner-advertising");
++		system_add_link_modes(b, ecmd.lp_advertising);
++		blobmsg_close_array(b, c);
+ 
+-	d = blobmsg_open_array(b, "supported");
+-	system_add_pause_modes(nwords, b, supported);
+-	blobmsg_close_array(b, d);
++		c = blobmsg_open_array(b, "link-supported");
++		system_add_link_modes(b, ecmd.supported);
++		blobmsg_close_array(b, c);
+ 
+-	if (pause_autoneg) {
+-		d = blobmsg_open_array(b, "link-advertising");
+-		system_add_pause_modes(nwords, b, advertising);
+-		blobmsg_close_array(b, d);
+-	}
+-
+-	d = blobmsg_open_array(b, "link-partner-advertising");
+-	system_add_pause_modes(nwords, b, lp_advertising);
+-	blobmsg_close_array(b, d);
+-
+-	if (pause_autoneg) {
+-		system_add_ethtool_pause_an(b, nwords, advertising,
+-					    lp_advertising);
+-	} else {
+-		d = blobmsg_open_array(b, "selected");
+-		if (rx_pause)
+-			blobmsg_add_string(b, NULL, "rx");
+-
+-		if (tx_pause)
+-			blobmsg_add_string(b, NULL, "tx");
++		s = blobmsg_alloc_string_buffer(b, "speed", 8);
++		snprintf(s, 8, "%d%c", ethtool_cmd_speed(&ecmd),
++			ecmd.duplex == DUPLEX_HALF ? 'H' : 'F');
++		blobmsg_add_string_buffer(b);
+ 
+-		blobmsg_close_array(b, d);
++		blobmsg_add_u8(b, "autoneg", !!ecmd.autoneg);
+ 	}
+ 
+-	blobmsg_close_table(b, c);
+-
+ 	blobmsg_add_u8(b, "hw-tc-offload",
+ 		ethtool_feature_value(dev->ifname, "hw-tc-offload"));
+ 
+-- 
+2.18.0
+
diff --git a/autobuild_mac80211_release/package/network/config/netifd_new/patches/mtk-0001-netifd-mtk-Fix-the-AP-sequence-is-out-of-order-when-.patch b/autobuild_mac80211_release/package/network/config/netifd_new/patches/mtk-0001-netifd-mtk-Fix-the-AP-sequence-is-out-of-order-when-.patch
new file mode 100644
index 0000000..0bc420d
--- /dev/null
+++ b/autobuild_mac80211_release/package/network/config/netifd_new/patches/mtk-0001-netifd-mtk-Fix-the-AP-sequence-is-out-of-order-when-.patch
@@ -0,0 +1,26 @@
+From 89dd694e33b2b1c23ca8e0a5178075f9198abb83 Mon Sep 17 00:00:00 2001
+From: "Allen.Ye" <allen.ye@mediatek.com>
+Date: Thu, 23 Feb 2023 14:15:07 +0800
+Subject: [PATCH] netifd: mtk: Fix the AP sequence is out of order when set
+ over 10 Aps
+
+---
+ wireless.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/wireless.c b/wireless.c
+index 705d6dd..43c6e3c 100644
+--- a/wireless.c
++++ b/wireless.c
+@@ -1192,7 +1192,7 @@ struct wireless_interface* wireless_interface_create(struct wireless_device *wde
+ 	if (cur && blobmsg_get_bool(cur))
+ 		return NULL;
+ 
+-	sprintf(name, "%d", wdev->vif_idx++);
++	sprintf(name, "%02d", wdev->vif_idx++);
+ 
+ 	vif = calloc_a(sizeof(*vif),
+ 		       &name_buf, strlen(name) + 1);
+-- 
+2.18.0
+
diff --git a/autobuild_mac80211_release/package/network/config/netifd_new/patches/mtk-0002-Add-sleep-to-prevent-for-ubus-race-condition.patch b/autobuild_mac80211_release/package/network/config/netifd_new/patches/mtk-0002-Add-sleep-to-prevent-for-ubus-race-condition.patch
new file mode 100644
index 0000000..6922175
--- /dev/null
+++ b/autobuild_mac80211_release/package/network/config/netifd_new/patches/mtk-0002-Add-sleep-to-prevent-for-ubus-race-condition.patch
@@ -0,0 +1,26 @@
+From ef0b42d6421e56a49ac44d9b2ed727905e2a35fc Mon Sep 17 00:00:00 2001
+From: "Allen.Ye" <allen.ye@mediatek.com>
+Date: Tue, 2 May 2023 10:44:27 +0800
+Subject: [PATCH] Add sleep to prevent for ubus race condition
+
+---
+ wireless.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/wireless.c b/wireless.c
+index 027a57c..f0fc0a8 100644
+--- a/wireless.c
++++ b/wireless.c
+@@ -459,6 +459,9 @@ wireless_device_run_handler(struct wireless_device *wdev, bool up)
+ 
+ 	netifd_start_process(argv, NULL, &wdev->script_task);
+ 
++	// sleep to prevent ubus call hostapd race condition
++	sleep(1);
++
+ 	if (fds[1] >= 0)
+ 		close(fds[1]);
+ 
+-- 
+2.18.0
+