[][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
+