From 334012492f3fe5d1abb4c2710ab80e9abed64609 Mon Sep 17 00:00:00 2001 From: Pawel Dembicki Date: Fri, 7 Oct 2022 14:22:23 +0200 Subject: [PATCH 01/26] kernel: add missing symbol in generic config Found during work on qoriq target. Signed-off-by: Pawel Dembicki [improve commit message, remove from target configs] Signed-off-by: Stijn Tintel --- target/linux/generic/config-5.10 | 1 + target/linux/generic/config-5.15 | 1 + 2 files changed, 2 insertions(+) diff --git a/target/linux/generic/config-5.10 b/target/linux/generic/config-5.10 index dac9aad2fc4035..2479d8a7726592 100644 --- a/target/linux/generic/config-5.10 +++ b/target/linux/generic/config-5.10 @@ -2922,6 +2922,7 @@ CONFIG_LBDAF=y CONFIG_LDISC_AUTOLOAD=y # CONFIG_LDM_PARTITION is not set CONFIG_LD_DEAD_CODE_DATA_ELIMINATION=y +# CONFIG_LD_HEAD_STUB_CATCH is not set # CONFIG_LEDS_AN30259A is not set # CONFIG_LEDS_APU is not set # CONFIG_LEDS_AW2013 is not set diff --git a/target/linux/generic/config-5.15 b/target/linux/generic/config-5.15 index 146f6b33dce177..01cb0037cf62bc 100644 --- a/target/linux/generic/config-5.15 +++ b/target/linux/generic/config-5.15 @@ -3063,6 +3063,7 @@ CONFIG_LBDAF=y CONFIG_LDISC_AUTOLOAD=y # CONFIG_LDM_PARTITION is not set CONFIG_LD_DEAD_CODE_DATA_ELIMINATION=y +# CONFIG_LD_HEAD_STUB_CATCH is not set # CONFIG_LEDS_AN30259A is not set # CONFIG_LEDS_APU is not set # CONFIG_LEDS_AW2013 is not set From 75d2934a6f5f023fa820aff290a2adfa4bbc1876 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= Date: Sat, 12 Nov 2022 16:06:52 +0100 Subject: [PATCH 02/26] kernel: add kmod-hwmon-sht3x support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The driver supports the temperature and humidity sensors chips SHT3x and STS3x by Sensirion. Signed-off-by: Uwe Kleine-König --- package/kernel/linux/modules/hwmon.mk | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/package/kernel/linux/modules/hwmon.mk b/package/kernel/linux/modules/hwmon.mk index 9f752937641bb4..c1886806120f39 100644 --- a/package/kernel/linux/modules/hwmon.mk +++ b/package/kernel/linux/modules/hwmon.mk @@ -427,6 +427,21 @@ endef $(eval $(call KernelPackage,hwmon-sht21)) +define KernelPackage/hwmon-sht3x + TITLE:=Sensiron SHT3x and compat. monitoring support + KCONFIG:=CONFIG_SENSORS_SHT3x + FILES:=$(LINUX_DIR)/drivers/hwmon/sht3x.ko + AUTOLOAD:=$(call AutoProbe,sht3x) + $(call AddDepends/hwmon,+kmod-i2c-core +kmod-lib-crc8) +endef + +define KernelPackage/hwmon-sht3x/description + Kernel module for Sensirion SHT3x temperature and humidity sensors chip +endef + +$(eval $(call KernelPackage,hwmon-sht3x)) + + define KernelPackage/hwmon-tmp102 TITLE:=Texas Instruments TMP102 monitoring support KCONFIG:=CONFIG_SENSORS_TMP102 From e5bf907be5d57e63ef58faa890854b4d908415d5 Mon Sep 17 00:00:00 2001 From: Aleksander Jan Bajkowski Date: Mon, 7 Mar 2022 22:31:45 +0100 Subject: [PATCH 03/26] kernel: backport tso for asix driver Performance comparison (iperf3, mtu 1500): Before: 53.9 Mbps After: 87.9 Mbps The tests were performed on a BT Home Hub 5A router. The iperf3 server was running on the router, the client on the host. Signed-off-by: Aleksander Jan Bajkowski --- ...net-usb-ax88179_178a-add-TSO-feature.patch | 68 +++++++++++++++++++ ...net-usb-ax88179_178a-add-TSO-feature.patch | 68 +++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 target/linux/generic/backport-5.10/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch create mode 100644 target/linux/generic/backport-5.15/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch diff --git a/target/linux/generic/backport-5.10/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch b/target/linux/generic/backport-5.10/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch new file mode 100644 index 00000000000000..a2168aaba5f645 --- /dev/null +++ b/target/linux/generic/backport-5.10/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch @@ -0,0 +1,68 @@ +From 16b1c4e01c89ba07367461e0bc4cb84993c2d027 Mon Sep 17 00:00:00 2001 +From: Jacky Chou +Date: Mon, 15 Nov 2021 11:49:41 +0800 +Subject: [PATCH] net: usb: ax88179_178a: add TSO feature + +On low-effciency embedded platforms, transmission performance is poor +due to on Bulk-out with single packet. +Adding TSO feature improves the transmission performance and reduces +the number of interrupt caused by Bulk-out complete. + +Reference to module, net: usb: aqc111. + +Signed-off-by: Jacky Chou +Signed-off-by: David S. Miller +--- + drivers/net/usb/ax88179_178a.c | 17 +++++++++++------ + 1 file changed, 11 insertions(+), 6 deletions(-) + +--- a/drivers/net/usb/ax88179_178a.c ++++ b/drivers/net/usb/ax88179_178a.c +@@ -1377,11 +1377,12 @@ static int ax88179_bind(struct usbnet *d + dev->mii.phy_id = 0x03; + dev->mii.supports_gmii = 1; + +- dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | +- NETIF_F_RXCSUM; ++ dev->net->features |= NETIF_F_SG | NETIF_F_IP_CSUM | ++ NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM | NETIF_F_TSO; + +- dev->net->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | +- NETIF_F_RXCSUM; ++ dev->net->hw_features |= dev->net->features; ++ ++ netif_set_gso_max_size(dev->net, 16384); + + /* Enable checksum offload */ + *tmp = AX_RXCOE_IP | AX_RXCOE_TCP | AX_RXCOE_UDP | +@@ -1587,17 +1588,19 @@ ax88179_tx_fixup(struct usbnet *dev, str + { + u32 tx_hdr1, tx_hdr2; + int frame_size = dev->maxpacket; +- int mss = skb_shinfo(skb)->gso_size; + int headroom; + void *ptr; + + tx_hdr1 = skb->len; +- tx_hdr2 = mss; ++ tx_hdr2 = skb_shinfo(skb)->gso_size; /* Set TSO mss */ + if (((skb->len + 8) % frame_size) == 0) + tx_hdr2 |= 0x80008000; /* Enable padding */ + + headroom = skb_headroom(skb) - 8; + ++ if ((dev->net->features & NETIF_F_SG) && skb_linearize(skb)) ++ return NULL; ++ + if ((skb_header_cloned(skb) || headroom < 0) && + pskb_expand_head(skb, headroom < 0 ? 8 : 0, 0, GFP_ATOMIC)) { + dev_kfree_skb_any(skb); +@@ -1608,6 +1611,8 @@ ax88179_tx_fixup(struct usbnet *dev, str + put_unaligned_le32(tx_hdr1, ptr); + put_unaligned_le32(tx_hdr2, ptr + 4); + ++ usbnet_set_skb_tx_stats(skb, (skb_shinfo(skb)->gso_segs ?: 1), 0); ++ + return skb; + } + diff --git a/target/linux/generic/backport-5.15/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch b/target/linux/generic/backport-5.15/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch new file mode 100644 index 00000000000000..a2168aaba5f645 --- /dev/null +++ b/target/linux/generic/backport-5.15/797-v5.17-net-usb-ax88179_178a-add-TSO-feature.patch @@ -0,0 +1,68 @@ +From 16b1c4e01c89ba07367461e0bc4cb84993c2d027 Mon Sep 17 00:00:00 2001 +From: Jacky Chou +Date: Mon, 15 Nov 2021 11:49:41 +0800 +Subject: [PATCH] net: usb: ax88179_178a: add TSO feature + +On low-effciency embedded platforms, transmission performance is poor +due to on Bulk-out with single packet. +Adding TSO feature improves the transmission performance and reduces +the number of interrupt caused by Bulk-out complete. + +Reference to module, net: usb: aqc111. + +Signed-off-by: Jacky Chou +Signed-off-by: David S. Miller +--- + drivers/net/usb/ax88179_178a.c | 17 +++++++++++------ + 1 file changed, 11 insertions(+), 6 deletions(-) + +--- a/drivers/net/usb/ax88179_178a.c ++++ b/drivers/net/usb/ax88179_178a.c +@@ -1377,11 +1377,12 @@ static int ax88179_bind(struct usbnet *d + dev->mii.phy_id = 0x03; + dev->mii.supports_gmii = 1; + +- dev->net->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | +- NETIF_F_RXCSUM; ++ dev->net->features |= NETIF_F_SG | NETIF_F_IP_CSUM | ++ NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM | NETIF_F_TSO; + +- dev->net->hw_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | +- NETIF_F_RXCSUM; ++ dev->net->hw_features |= dev->net->features; ++ ++ netif_set_gso_max_size(dev->net, 16384); + + /* Enable checksum offload */ + *tmp = AX_RXCOE_IP | AX_RXCOE_TCP | AX_RXCOE_UDP | +@@ -1587,17 +1588,19 @@ ax88179_tx_fixup(struct usbnet *dev, str + { + u32 tx_hdr1, tx_hdr2; + int frame_size = dev->maxpacket; +- int mss = skb_shinfo(skb)->gso_size; + int headroom; + void *ptr; + + tx_hdr1 = skb->len; +- tx_hdr2 = mss; ++ tx_hdr2 = skb_shinfo(skb)->gso_size; /* Set TSO mss */ + if (((skb->len + 8) % frame_size) == 0) + tx_hdr2 |= 0x80008000; /* Enable padding */ + + headroom = skb_headroom(skb) - 8; + ++ if ((dev->net->features & NETIF_F_SG) && skb_linearize(skb)) ++ return NULL; ++ + if ((skb_header_cloned(skb) || headroom < 0) && + pskb_expand_head(skb, headroom < 0 ? 8 : 0, 0, GFP_ATOMIC)) { + dev_kfree_skb_any(skb); +@@ -1608,6 +1611,8 @@ ax88179_tx_fixup(struct usbnet *dev, str + put_unaligned_le32(tx_hdr1, ptr); + put_unaligned_le32(tx_hdr2, ptr + 4); + ++ usbnet_set_skb_tx_stats(skb, (skb_shinfo(skb)->gso_segs ?: 1), 0); ++ + return skb; + } + From 58692d5c98169249eae7b8cb27b45ce6ecac1d92 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Sun, 20 Nov 2022 22:14:41 +0800 Subject: [PATCH 04/26] kernel: sysctl: update nf_ct settings for fullcone nat --- package/kernel/linux/files/sysctl-nf-conntrack.conf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package/kernel/linux/files/sysctl-nf-conntrack.conf b/package/kernel/linux/files/sysctl-nf-conntrack.conf index c16167fb47886e..897cac86cb31f5 100644 --- a/package/kernel/linux/files/sysctl-nf-conntrack.conf +++ b/package/kernel/linux/files/sysctl-nf-conntrack.conf @@ -7,4 +7,6 @@ net.netfilter.nf_conntrack_max=65535 net.netfilter.nf_conntrack_tcp_timeout_established=7440 net.netfilter.nf_conntrack_udp_timeout=60 net.netfilter.nf_conntrack_udp_timeout_stream=180 -net.netfilter.nf_conntrack_helper=1 \ No newline at end of file +net.netfilter.nf_conntrack_helper=1 +net.netfilter.nf_conntrack_buckets=16384 +net.netfilter.nf_conntrack_expect_max=512 From 9cd6f162e936182ae3fa1bab54e2b3305437b73b Mon Sep 17 00:00:00 2001 From: Albert Xu <19632674+1582130940@users.noreply.github.com> Date: Mon, 21 Nov 2022 21:08:31 +0800 Subject: [PATCH 05/26] tools/patch: apply patch for EACCES on xattr copy (#10469) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When compiling OpenWRT on a compressed btrfs volume the build fails in libtool. The file `libltdl/config/ltmain.m4sh` from `libtool-2.4.2.tar.xz` is missing write permissions, therefore patch falls back to copying the file and patching that. During this patch tries to preserve all file attribute on the new copy. However the attribute `btrfs.compression` is privileged and btrfs return EACCES. While patch ignores multiple other error codes during the copy of xattr copy it is not prepared for EACCES and aborts. EACCES should be ignored the same way as the other errors. Build log: ``` ... Applying ./patches/000-relocatable.patch using plaintext: patching file libltdl/config/general.m4sh patching file libtoolize.in patching file libtoolize.m4sh patching file libltdl/m4/libtool.m4 Applying ./patches/100-libdir-fixes.patch using plaintext: patching file libltdl/config/ltmain.m4sh File libltdl/config/ltmain.sh is read-only; trying to patch anyway patching file libltdl/config/ltmain.sh patch: setting attribute btrfs.compression for btrfs.compression: Permission denied Patch failed! Please fix ./patches/100-libdir-fixes.patch! ``` Link: https://lists.gnu.org/archive/html/bug-patch/2022-11/msg00000.html Co-authored-by: Thomas Weißschuh Signed-off-by: Thomas Weißschuh --- tools/patch/Makefile | 2 +- ...l-hard-on-EACCES-when-copying-xattrs.patch | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 tools/patch/patches/070-don-t-fail-hard-on-EACCES-when-copying-xattrs.patch diff --git a/tools/patch/Makefile b/tools/patch/Makefile index bac7d5692c5d84..957fe6e309f85c 100644 --- a/tools/patch/Makefile +++ b/tools/patch/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=patch PKG_VERSION:=2.7.6 -PKG_RELEASE:=6 +PKG_RELEASE:=7 PKG_CPE_ID:=cpe:/a:gnu:patch PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz diff --git a/tools/patch/patches/070-don-t-fail-hard-on-EACCES-when-copying-xattrs.patch b/tools/patch/patches/070-don-t-fail-hard-on-EACCES-when-copying-xattrs.patch new file mode 100644 index 00000000000000..e19a9c0845b4fb --- /dev/null +++ b/tools/patch/patches/070-don-t-fail-hard-on-EACCES-when-copying-xattrs.patch @@ -0,0 +1,33 @@ +From f42cbe1a91a3a6f79d1eec594ce7c72aec79179b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= +Date: Wed, 9 Nov 2022 05:08:22 +0100 +Subject: [PATCH] don't fail hard on EACCES when copying xattrs + +On btrfs the xattr "btrfs.compressed" requires privileges to set, +otherwise EACCES is returned. +When patch tries to do copy this attribute it receives the error and +aborts. +--- + src/util.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- a/src/util.c ++++ b/src/util.c +@@ -182,7 +182,7 @@ copy_attr_error (struct error_context *c + int err = errno; + va_list ap; + +- if (err != ENOSYS && err != ENOTSUP && err != EPERM) ++ if (err != ENOSYS && err != ENOTSUP && err != EPERM && err != EACCES) + { + /* use verror module to print error message */ + va_start (ap, fmt); +@@ -284,7 +284,7 @@ set_file_attributes (char const *to, enu + } + if (attr & FA_XATTRS) + if (copy_attr (from, to) != 0 +- && errno != ENOSYS && errno != ENOTSUP && errno != EPERM) ++ && errno != ENOSYS && errno != ENOTSUP && errno != EPERM && errno != EACCES) + fatal_exit (0); + if (attr & FA_MODE) + { From 4badcf31c7da6fe0aef7078a4d8df5eed1c5ac80 Mon Sep 17 00:00:00 2001 From: sdf8057 <54014465+sdf8057@users.noreply.github.com> Date: Tue, 22 Nov 2022 20:45:25 +0800 Subject: [PATCH 06/26] fix ntpd path problem (#10478) --- package/utils/busybox/files/sysntpd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/utils/busybox/files/sysntpd b/package/utils/busybox/files/sysntpd index 03f3e506db0922..074f14b8f8a9f0 100755 --- a/package/utils/busybox/files/sysntpd +++ b/package/utils/busybox/files/sysntpd @@ -4,7 +4,7 @@ START=98 USE_PROCD=1 -PROG=ntpd +PROG=/usr/sbin/ntpd HOTPLUG_SCRIPT=/usr/sbin/ntpd-hotplug get_dhcp_ntp_servers() { From 1d0708842f9c09cba0b10e99f54639fef7ec3d4b Mon Sep 17 00:00:00 2001 From: lovehackintosh <92633080+lovehackintosh@users.noreply.github.com> Date: Tue, 22 Nov 2022 20:59:36 +0800 Subject: [PATCH 07/26] upx: fix hash (#10479) Signed-off-by: Linhui Liu Signed-off-by: Linhui Liu --- package/lean/upx/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/lean/upx/Makefile b/package/lean/upx/Makefile index b58bd8cd20d6a3..9310bcf81a6463 100644 --- a/package/lean/upx/Makefile +++ b/package/lean/upx/Makefile @@ -15,7 +15,7 @@ PKG_LICENSE_FILES:=COPYING LICENSE PKG_SOURCE_PROTO:=git PKG_SOURCE_DATE:=2022-01-15 -PKG_SOURCE_VERSION:=a46b63817a9c6ad5af7cf519332e859f11558592 +PKG_SOURCE_VERSION:=1050de5171f70fd4ba113016e4db994e898c7be3 PKG_SOURCE_URL:=https://github.com/upx/upx.git PKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_DATE).tar.gz From 8d2bd3273c4ef143c3fb8c884944904625dba952 Mon Sep 17 00:00:00 2001 From: coolsnowwolf <31687149+coolsnowwolf@users.noreply.github.com> Date: Wed, 23 Nov 2022 17:20:15 +0800 Subject: [PATCH 08/26] x86: add kmod-tg3 by default --- target/linux/x86/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/target/linux/x86/Makefile b/target/linux/x86/Makefile index 0409e5ac900376..716e6faa84ec6f 100644 --- a/target/linux/x86/Makefile +++ b/target/linux/x86/Makefile @@ -17,8 +17,8 @@ KERNELNAME:=bzImage include $(INCLUDE_DIR)/target.mk -DEFAULT_PACKAGES += partx-utils mkf2fs e2fsprogs kmod-button-hotplug kmod-usb-hid kmod-mmc kmod-sdhci usbutils pciutils \ -kmod-alx kmod-e1000e kmod-igb kmod-igc kmod-igbvf kmod-iavf kmod-bnx2x kmod-pcnet32 kmod-tulip kmod-via-velocity kmod-vmxnet3 kmod-i40e kmod-i40evf kmod-r8125 kmod-8139cp kmod-8139too kmod-fs-f2fs cfdisk \ +DEFAULT_PACKAGES += partx-utils mkf2fs e2fsprogs kmod-button-hotplug kmod-usb-hid kmod-mmc kmod-sdhci kmod-fs-f2fs cfdisk usbutils pciutils \ +kmod-alx kmod-e1000e kmod-igb kmod-igc kmod-igbvf kmod-iavf kmod-bnx2x kmod-pcnet32 kmod-tulip kmod-via-velocity kmod-vmxnet3 kmod-i40e kmod-i40evf kmod-r8125 kmod-8139cp kmod-8139too kmod-tg3 \ htop lm-sensors iperf3 autocore-x86 automount autosamba luci-app-adbyby-plus luci-app-ipsec-vpnd luci-proto-bonding luci-app-diskman \ luci-app-unblockmusic luci-app-zerotier luci-app-xlnetacc ddns-scripts_aliyun ddns-scripts_dnspod ca-bundle luci-app-wireguard luci-app-ttyd \ kmod-sound-hda-core kmod-sound-hda-codec-realtek kmod-sound-hda-codec-via kmod-sound-via82xx kmod-sound-hda-intel kmod-sound-hda-codec-hdmi kmod-sound-i8x0 kmod-usb-audio \ From 9e3f3a90e4eaeefdf158df16a971966be0bbf4ba Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Wed, 23 Nov 2022 18:28:26 +0800 Subject: [PATCH 09/26] Revert "dnsmasq: bump to v2.87" This reverts commit c5b0c71a92f48fa1e6f5920d91a24720b5c0fab8. --- package/network/services/dnsmasq/Makefile | 6 +- .../network/services/dnsmasq/files/dhcp.conf | 1 - .../services/dnsmasq/files/dnsmasq.init | 5 +- ...rite-after-free-error-in-DHCPv6-code.patch | 179 ++++++++++++++++++ ...00-remove-old-runtime-kernel-support.patch | 8 +- .../dnsmasq/patches/200-ubus_dns.patch | 6 +- ...igning-IPv6-address-based-on-MAC-add.patch | 166 ++++++++++++++++ .../dnsmasq/patches/910-mini-ttl.patch | 12 +- ...11-dnsmasq-filter-aaaa+https+unknown.patch | 143 ++++++++++++++ 9 files changed, 507 insertions(+), 19 deletions(-) create mode 100644 package/network/services/dnsmasq/patches/001-CVE-2022-0934-Fix-write-after-free-error-in-DHCPv6-code.patch create mode 100644 package/network/services/dnsmasq/patches/300-DHCPv6-Honor-assigning-IPv6-address-based-on-MAC-add.patch create mode 100644 package/network/services/dnsmasq/patches/911-dnsmasq-filter-aaaa+https+unknown.patch diff --git a/package/network/services/dnsmasq/Makefile b/package/network/services/dnsmasq/Makefile index 55de67e091930e..c399517202489a 100644 --- a/package/network/services/dnsmasq/Makefile +++ b/package/network/services/dnsmasq/Makefile @@ -8,13 +8,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=dnsmasq -PKG_UPSTREAM_VERSION:=2.87 +PKG_UPSTREAM_VERSION:=2.86 PKG_VERSION:=$(subst test,~~test,$(subst rc,~rc,$(PKG_UPSTREAM_VERSION))) PKG_RELEASE:=$(AUTORELEASE) PKG_SOURCE:=$(PKG_NAME)-$(PKG_UPSTREAM_VERSION).tar.xz -PKG_SOURCE_URL:=https://thekelleys.org.uk/dnsmasq/ -PKG_HASH:=0228c0364a7f2356fd7e7f1549937cbf3099a78d3b2eb1ba5bb0c31e2b89de7a +PKG_SOURCE_URL:=https://thekelleys.org.uk/dnsmasq +PKG_HASH:=28d52cfc9e2004ac4f85274f52b32e1647b4dbc9761b82e7de1e41c49907eb08 PKG_LICENSE:=GPL-2.0 PKG_LICENSE_FILES:=COPYING diff --git a/package/network/services/dnsmasq/files/dhcp.conf b/package/network/services/dnsmasq/files/dhcp.conf index 0225c9ebd2999b..29c9d705f6d11c 100644 --- a/package/network/services/dnsmasq/files/dhcp.conf +++ b/package/network/services/dnsmasq/files/dhcp.conf @@ -21,7 +21,6 @@ config dnsmasq #list bogusnxdomain '64.94.110.11' option localservice 1 # disable to allow DNS requests from non-local subnets option filter_aaaa 1 - option filter_a 0 option cachesize 8000 option mini_ttl 3600 option ednspacket_max 1232 diff --git a/package/network/services/dnsmasq/files/dnsmasq.init b/package/network/services/dnsmasq/files/dnsmasq.init index 632903dc0830f7..ebf5b5eab6aef1 100755 --- a/package/network/services/dnsmasq/files/dnsmasq.init +++ b/package/network/services/dnsmasq/files/dnsmasq.init @@ -930,8 +930,9 @@ dnsmasq_start() append_bool "$cfg" rapidcommit "--dhcp-rapid-commit" append_bool "$cfg" scriptarp "--script-arp" - append_bool "$cfg" filter_aaaa "--filter-AAAA" - append_bool "$cfg" filter_a "--filter-A" + append_bool "$cfg" filter_aaaa "--filter-aaaa" + append_bool "$cfg" filter_https "--filter-https" + append_bool "$cfg" filter_unknown "--filter-unknown" append_parm "$cfg" logfacility "--log-facility" diff --git a/package/network/services/dnsmasq/patches/001-CVE-2022-0934-Fix-write-after-free-error-in-DHCPv6-code.patch b/package/network/services/dnsmasq/patches/001-CVE-2022-0934-Fix-write-after-free-error-in-DHCPv6-code.patch new file mode 100644 index 00000000000000..4113be99aa8a1f --- /dev/null +++ b/package/network/services/dnsmasq/patches/001-CVE-2022-0934-Fix-write-after-free-error-in-DHCPv6-code.patch @@ -0,0 +1,179 @@ +From 03345ecefeb0d82e3c3a4c28f27c3554f0611b39 Mon Sep 17 00:00:00 2001 +From: Simon Kelley +Date: Thu, 31 Mar 2022 21:35:20 +0100 +Subject: Fix write-after-free error in DHCPv6 code. CVE-2022-0934 refers. + +--- + CHANGELOG | 3 +++ + src/rfc3315.c | 48 +++++++++++++++++++++++++++--------------------- + 2 files changed, 30 insertions(+), 21 deletions(-) + +--- a/CHANGELOG ++++ b/CHANGELOG +@@ -92,6 +92,9 @@ version 2.86 + of filename). Thanks to Ed Wildgoose for the initial patch + and motivation for this. + ++ Fix write-after-free error in DHCPv6 server code. ++ CVE-2022-0934 refers. ++ + + version 2.85 + Fix problem with DNS retries in 2.83/2.84. +--- a/src/rfc3315.c ++++ b/src/rfc3315.c +@@ -33,9 +33,9 @@ struct state { + unsigned int mac_len, mac_type; + }; + +-static int dhcp6_maybe_relay(struct state *state, void *inbuff, size_t sz, ++static int dhcp6_maybe_relay(struct state *state, unsigned char *inbuff, size_t sz, + struct in6_addr *client_addr, int is_unicast, time_t now); +-static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_t sz, int is_unicast, time_t now); ++static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbuff, size_t sz, int is_unicast, time_t now); + static void log6_opts(int nest, unsigned int xid, void *start_opts, void *end_opts); + static void log6_packet(struct state *state, char *type, struct in6_addr *addr, char *string); + static void log6_quiet(struct state *state, char *type, struct in6_addr *addr, char *string); +@@ -104,12 +104,12 @@ unsigned short dhcp6_reply(struct dhcp_c + } + + /* This cost me blood to write, it will probably cost you blood to understand - srk. */ +-static int dhcp6_maybe_relay(struct state *state, void *inbuff, size_t sz, ++static int dhcp6_maybe_relay(struct state *state, unsigned char *inbuff, size_t sz, + struct in6_addr *client_addr, int is_unicast, time_t now) + { + void *end = inbuff + sz; + void *opts = inbuff + 34; +- int msg_type = *((unsigned char *)inbuff); ++ int msg_type = *inbuff; + unsigned char *outmsgtypep; + void *opt; + struct dhcp_vendor *vendor; +@@ -259,15 +259,15 @@ static int dhcp6_maybe_relay(struct stat + return 1; + } + +-static int dhcp6_no_relay(struct state *state, int msg_type, void *inbuff, size_t sz, int is_unicast, time_t now) ++static int dhcp6_no_relay(struct state *state, int msg_type, unsigned char *inbuff, size_t sz, int is_unicast, time_t now) + { + void *opt; +- int i, o, o1, start_opts; ++ int i, o, o1, start_opts, start_msg; + struct dhcp_opt *opt_cfg; + struct dhcp_netid *tagif; + struct dhcp_config *config = NULL; + struct dhcp_netid known_id, iface_id, v6_id; +- unsigned char *outmsgtypep; ++ unsigned char outmsgtype; + struct dhcp_vendor *vendor; + struct dhcp_context *context_tmp; + struct dhcp_mac *mac_opt; +@@ -296,12 +296,13 @@ static int dhcp6_no_relay(struct state * + v6_id.next = state->tags; + state->tags = &v6_id; + +- /* copy over transaction-id, and save pointer to message type */ +- if (!(outmsgtypep = put_opt6(inbuff, 4))) ++ start_msg = save_counter(-1); ++ /* copy over transaction-id */ ++ if (!put_opt6(inbuff, 4)) + return 0; + start_opts = save_counter(-1); +- state->xid = outmsgtypep[3] | outmsgtypep[2] << 8 | outmsgtypep[1] << 16; +- ++ state->xid = inbuff[3] | inbuff[2] << 8 | inbuff[1] << 16; ++ + /* We're going to be linking tags from all context we use. + mark them as unused so we don't link one twice and break the list */ + for (context_tmp = state->context; context_tmp; context_tmp = context_tmp->current) +@@ -347,7 +348,7 @@ static int dhcp6_no_relay(struct state * + (msg_type == DHCP6REQUEST || msg_type == DHCP6RENEW || msg_type == DHCP6RELEASE || msg_type == DHCP6DECLINE)) + + { +- *outmsgtypep = DHCP6REPLY; ++ outmsgtype = DHCP6REPLY; + o1 = new_opt6(OPTION6_STATUS_CODE); + put_opt6_short(DHCP6USEMULTI); + put_opt6_string("Use multicast"); +@@ -619,11 +620,11 @@ static int dhcp6_no_relay(struct state * + struct dhcp_netid *solicit_tags; + struct dhcp_context *c; + +- *outmsgtypep = DHCP6ADVERTISE; ++ outmsgtype = DHCP6ADVERTISE; + + if (opt6_find(state->packet_options, state->end, OPTION6_RAPID_COMMIT, 0)) + { +- *outmsgtypep = DHCP6REPLY; ++ outmsgtype = DHCP6REPLY; + state->lease_allocate = 1; + o = new_opt6(OPTION6_RAPID_COMMIT); + end_opt6(o); +@@ -809,7 +810,7 @@ static int dhcp6_no_relay(struct state * + int start = save_counter(-1); + + /* set reply message type */ +- *outmsgtypep = DHCP6REPLY; ++ outmsgtype = DHCP6REPLY; + state->lease_allocate = 1; + + log6_quiet(state, "DHCPREQUEST", NULL, ignore ? _("ignored") : NULL); +@@ -924,7 +925,7 @@ static int dhcp6_no_relay(struct state * + int address_assigned = 0; + + /* set reply message type */ +- *outmsgtypep = DHCP6REPLY; ++ outmsgtype = DHCP6REPLY; + + log6_quiet(state, msg_type == DHCP6RENEW ? "DHCPRENEW" : "DHCPREBIND", NULL, NULL); + +@@ -1057,7 +1058,7 @@ static int dhcp6_no_relay(struct state * + int good_addr = 0; + + /* set reply message type */ +- *outmsgtypep = DHCP6REPLY; ++ outmsgtype = DHCP6REPLY; + + log6_quiet(state, "DHCPCONFIRM", NULL, NULL); + +@@ -1121,7 +1122,7 @@ static int dhcp6_no_relay(struct state * + log6_quiet(state, "DHCPINFORMATION-REQUEST", NULL, ignore ? _("ignored") : state->hostname); + if (ignore) + return 0; +- *outmsgtypep = DHCP6REPLY; ++ outmsgtype = DHCP6REPLY; + tagif = add_options(state, 1); + break; + } +@@ -1130,7 +1131,7 @@ static int dhcp6_no_relay(struct state * + case DHCP6RELEASE: + { + /* set reply message type */ +- *outmsgtypep = DHCP6REPLY; ++ outmsgtype = DHCP6REPLY; + + log6_quiet(state, "DHCPRELEASE", NULL, NULL); + +@@ -1195,7 +1196,7 @@ static int dhcp6_no_relay(struct state * + case DHCP6DECLINE: + { + /* set reply message type */ +- *outmsgtypep = DHCP6REPLY; ++ outmsgtype = DHCP6REPLY; + + log6_quiet(state, "DHCPDECLINE", NULL, NULL); + +@@ -1275,7 +1276,12 @@ static int dhcp6_no_relay(struct state * + } + + } +- ++ ++ /* Fill in the message type. Note that we store the offset, ++ not a direct pointer, since the packet memory may have been ++ reallocated. */ ++ ((unsigned char *)(daemon->outpacket.iov_base))[start_msg] = outmsgtype; ++ + log_tags(tagif, state->xid); + log6_opts(0, state->xid, daemon->outpacket.iov_base + start_opts, daemon->outpacket.iov_base + save_counter(-1)); + diff --git a/package/network/services/dnsmasq/patches/100-remove-old-runtime-kernel-support.patch b/package/network/services/dnsmasq/patches/100-remove-old-runtime-kernel-support.patch index b1b134a98c2440..4f8fe4ecbebacd 100644 --- a/package/network/services/dnsmasq/patches/100-remove-old-runtime-kernel-support.patch +++ b/package/network/services/dnsmasq/patches/100-remove-old-runtime-kernel-support.patch @@ -13,7 +13,7 @@ Signed-off-by: Kevin Darbyshire-Bryant --- a/src/dnsmasq.c +++ b/src/dnsmasq.c -@@ -103,10 +103,6 @@ int main (int argc, char **argv) +@@ -95,10 +95,6 @@ int main (int argc, char **argv) read_opts(argc, argv, compile_opts); @@ -26,7 +26,7 @@ Signed-off-by: Kevin Darbyshire-Bryant --- a/src/dnsmasq.h +++ b/src/dnsmasq.h -@@ -1229,7 +1229,7 @@ extern struct daemon { +@@ -1201,7 +1201,7 @@ extern struct daemon { int inotifyfd; #endif #if defined(HAVE_LINUX_NETWORK) @@ -35,7 +35,7 @@ Signed-off-by: Kevin Darbyshire-Bryant #elif defined(HAVE_BSD_NETWORK) int dhcp_raw_fd, dhcp_icmp_fd, routefd; #endif -@@ -1422,9 +1422,6 @@ int read_write(int fd, unsigned char *pa +@@ -1388,9 +1388,6 @@ int read_write(int fd, unsigned char *pa void close_fds(long max_fd, int spare1, int spare2, int spare3); int wildcard_match(const char* wildcard, const char* match); int wildcard_matchn(const char* wildcard, const char* match, int num); @@ -140,7 +140,7 @@ Signed-off-by: Kevin Darbyshire-Bryant my_syslog(LOG_ERR, _("failed to update ipset %s: %s"), setname, strerror(errno)); --- a/src/util.c +++ b/src/util.c -@@ -833,22 +833,3 @@ int wildcard_matchn(const char* wildcard +@@ -796,22 +796,3 @@ int wildcard_matchn(const char* wildcard return (!num) || (*wildcard == *match); } diff --git a/package/network/services/dnsmasq/patches/200-ubus_dns.patch b/package/network/services/dnsmasq/patches/200-ubus_dns.patch index c4cc1df207f96c..b8c4e449525b16 100644 --- a/package/network/services/dnsmasq/patches/200-ubus_dns.patch +++ b/package/network/services/dnsmasq/patches/200-ubus_dns.patch @@ -1,6 +1,6 @@ --- a/src/dnsmasq.h +++ b/src/dnsmasq.h -@@ -1598,14 +1598,26 @@ void emit_dbus_signal(int action, struct +@@ -1564,14 +1564,26 @@ void emit_dbus_signal(int action, struct /* ubus.c */ #ifdef HAVE_UBUS @@ -151,7 +151,7 @@ if (!ADD_RDLEN(header, p, qlen, rdlen)) return 0; /* bad packet */ } -@@ -568,7 +637,7 @@ int extract_addresses(struct dns_header +@@ -563,7 +632,7 @@ int extract_addresses(struct dns_header cache_start_insert(); /* find_soa is needed for dns_doctor side effects, so don't call it lazily if there are any. */ @@ -269,7 +269,7 @@ struct ubus_context *ubus = (struct ubus_context *)daemon->ubus; --- a/src/dnsmasq.c +++ b/src/dnsmasq.c -@@ -1998,6 +1998,10 @@ static void check_dns_listeners(time_t n +@@ -1972,6 +1972,10 @@ static void check_dns_listeners(time_t n daemon->pipe_to_parent = pipefd[1]; } diff --git a/package/network/services/dnsmasq/patches/300-DHCPv6-Honor-assigning-IPv6-address-based-on-MAC-add.patch b/package/network/services/dnsmasq/patches/300-DHCPv6-Honor-assigning-IPv6-address-based-on-MAC-add.patch new file mode 100644 index 00000000000000..4dd7e22b34a7c4 --- /dev/null +++ b/package/network/services/dnsmasq/patches/300-DHCPv6-Honor-assigning-IPv6-address-based-on-MAC-add.patch @@ -0,0 +1,166 @@ +From 93ac8f9d469ff08d41170eb6934842b3626d5fdd Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pali=20Roh=C3=A1r?= +Date: Wed, 23 Dec 2015 22:10:44 +0100 +Subject: [PATCH] DHCPv6: Honor assigning IPv6 address based on MAC address + +Currently IPv6 addresses are assigned to tuple (IAID, DUID). When system +changes IAID/DUID then old assigned IPv6 address cannot be reused, even +when in config file was DHCPv6 assignment based on MAC address (and not on +DUID). + +IAID/DUID is changed when rebooting from one operating system to another; +or after reinstalling system. In reality it is normal that DUID of some +machine is changed, so people rather assign also IPv6 addresses based on +MAC address. + +So assigning IPv6 based on MAC address in dnsmasq is currently semi-broken. + +This patch tries to fix it and honors IPv6 config rules with MAC address, +to always assign particular IPv6 address to specific MAC address (when +configured). And ignores the fact if IAID/DUID was changed. + +Normally IPv6 address should be assigned by IAID/DUID (which also state +DHCPv6 RFCs), but dnsmasq has already some support for assigning IPv6 +address based on MAC address, when users configured in config file. + +So this patch just tries to fix above problem for user configuration with +MAC addresses. It does not change assignment based on DUID. +--- + src/rfc3315.c | 55 +++++++++++++++++++++++++++++++++++++++++++-------- + 1 file changed, 47 insertions(+), 8 deletions(-) + +--- a/src/rfc3315.c ++++ b/src/rfc3315.c +@@ -48,7 +48,7 @@ static int build_ia(struct state *state, + static void end_ia(int t1cntr, unsigned int min_time, int do_fuzz); + static void mark_context_used(struct state *state, struct in6_addr *addr); + static void mark_config_used(struct dhcp_context *context, struct in6_addr *addr); +-static int check_address(struct state *state, struct in6_addr *addr); ++static int check_address(struct state *state, struct dhcp_config *config, struct in6_addr *addr); + static int config_valid(struct dhcp_config *config, struct dhcp_context *context, struct in6_addr *addr, struct state *state, time_t now); + static struct addrlist *config_implies(struct dhcp_config *config, struct dhcp_context *context, struct in6_addr *addr); + static void add_address(struct state *state, struct dhcp_context *context, unsigned int lease_time, void *ia_option, +@@ -688,8 +688,13 @@ static int dhcp6_no_relay(struct state * + } + else if (!(c = address6_available(state->context, &req_addr, solicit_tags, plain_range))) + continue; /* not an address we're allowed */ +- else if (!check_address(state, &req_addr)) ++ else if (!check_address(state, config, &req_addr)) + continue; /* address leased elsewhere */ ++ else if (state->mac_len && config && ++ config_has_mac(config, state->mac, state->mac_len, state->mac_type) && ++ match_netid(c->filter, solicit_tags, plain_range) && ++ !config_implies(config, c, &req_addr)) ++ continue; /* another static address is configured */ + + /* add address to output packet */ + add_address(state, c, lease_time, ia_option, &min_time, &req_addr, now); +@@ -701,7 +706,10 @@ static int dhcp6_no_relay(struct state * + + /* Suggest configured address(es) */ + for (c = state->context; c; c = c->current) +- if (!(c->flags & CONTEXT_CONF_USED) && ++ if ((!(c->flags & CONTEXT_CONF_USED) || ++ (state->mac_len && config && ++ config_has_mac(config, state->mac, state->mac_len, state->mac_type) ++ )) && + match_netid(c->filter, solicit_tags, plain_range) && + config_valid(config, c, &addr, state, now)) + { +@@ -725,6 +733,11 @@ static int dhcp6_no_relay(struct state * + req_addr = ltmp->addr6; + if ((c = address6_available(state->context, &req_addr, solicit_tags, plain_range))) + { ++ if (state->mac_len && config && ++ config_has_mac(config, state->mac, state->mac_len, state->mac_type) && ++ match_netid(c->filter, solicit_tags, plain_range) && ++ !config_implies(config, c, &req_addr)) ++ continue; /* skip this lease because another static address is configured */ + add_address(state, c, c->lease_time, NULL, &min_time, &req_addr, now); + mark_context_used(state, &req_addr); + get_context_tag(state, c); +@@ -859,7 +872,7 @@ static int dhcp6_no_relay(struct state * + put_opt6_string(_("address unavailable")); + end_opt6(o1); + } +- else if (!check_address(state, &req_addr)) ++ else if (!check_address(state, config, &req_addr)) + { + /* Address leased to another DUID/IAID */ + o1 = new_opt6(OPTION6_STATUS_CODE); +@@ -989,6 +1002,16 @@ static int dhcp6_no_relay(struct state * + { + unsigned int lease_time; + ++ /* check if another static address is preferred */ ++ if (state->mac_len && config && ++ config_has_mac(config, state->mac, state->mac_len, state->mac_type) && ++ !config_implies(config, this_context, &req_addr)) ++ { ++ preferred_time = valid_time = 0; ++ message = _("deprecated"); ++ } ++ else ++ { + get_context_tag(state, this_context); + + if (config_implies(config, this_context, &req_addr) && have_config(config, CONFIG_TIME)) +@@ -1014,6 +1037,7 @@ static int dhcp6_no_relay(struct state * + + if (preferred_time == 0) + message = _("deprecated"); ++ } + + address_assigned = 1; + } +@@ -1070,11 +1094,22 @@ static int dhcp6_no_relay(struct state * + ia_option = opt6_find(opt6_next(ia_option, ia_end), ia_end, OPTION6_IAADDR, 24)) + { + struct in6_addr req_addr; ++ struct dhcp_context *c; ++ int config_addr_ok = 1; + + /* alignment */ + memcpy(&req_addr, opt6_ptr(ia_option, 0), IN6ADDRSZ); ++ ++ c = address6_valid(state->context, &req_addr, tagif, 1); ++ ++ if (c && state->mac_len && config && ++ config_has_mac(config, state->mac, state->mac_len, state->mac_type) && ++ !config_implies(config, c, &req_addr)) ++ { ++ config_addr_ok = 0; ++ } + +- if (!address6_valid(state->context, &req_addr, tagif, 1)) ++ if (!c || !config_addr_ok) + { + o1 = new_opt6(OPTION6_STATUS_CODE); + put_opt6_short(DHCP6NOTONLINK); +@@ -1692,11 +1727,15 @@ static void mark_config_used(struct dhcp + context->flags |= CONTEXT_CONF_USED; + } + +-/* make sure address not leased to another CLID/IAID */ +-static int check_address(struct state *state, struct in6_addr *addr) ++/* check that ipv6 address belongs to config with same mac address as in state or ipv6 address is not leased to another CLID/IAID */ ++static int check_address(struct state *state, struct dhcp_config *config, struct in6_addr *addr) + { + struct dhcp_lease *lease; + ++ if (state->mac_len && config && ++ config_has_mac(config, state->mac, state->mac_len, state->mac_type)) ++ return 1; ++ + if (!(lease = lease6_find_by_addr(addr, 128, 0))) + return 1; + +@@ -1773,7 +1812,7 @@ static int config_valid(struct dhcp_conf + { + setaddr6part(addr, addrpart+i); + +- if (check_address(state, addr)) ++ if (check_address(state, config, addr)) + return 1; + } + } diff --git a/package/network/services/dnsmasq/patches/910-mini-ttl.patch b/package/network/services/dnsmasq/patches/910-mini-ttl.patch index 09808952fa545a..ac7d17ad064127 100644 --- a/package/network/services/dnsmasq/patches/910-mini-ttl.patch +++ b/package/network/services/dnsmasq/patches/910-mini-ttl.patch @@ -11,12 +11,12 @@ u32 umbrella_asset; --- a/src/option.c +++ b/src/option.c -@@ -181,6 +181,7 @@ - #define LOPT_STRIP_MAC 372 - #define LOPT_CONF_OPT 373 - #define LOPT_CONF_SCRIPT 374 -+#define LOPT_MINTTL 375 - +@@ -174,6 +174,7 @@ struct myoption { + #define LOPT_CMARK_ALST_EN 365 + #define LOPT_CMARK_ALST 366 + #define LOPT_QUIET_TFTP 367 ++#define LOPT_MINTTL 368 + #ifdef HAVE_GETOPT_LONG static const struct option opts[] = @@ -292,6 +293,7 @@ static const struct myoption opts[] = diff --git a/package/network/services/dnsmasq/patches/911-dnsmasq-filter-aaaa+https+unknown.patch b/package/network/services/dnsmasq/patches/911-dnsmasq-filter-aaaa+https+unknown.patch new file mode 100644 index 00000000000000..ec082ec0942295 --- /dev/null +++ b/package/network/services/dnsmasq/patches/911-dnsmasq-filter-aaaa+https+unknown.patch @@ -0,0 +1,143 @@ +diff --git a/src/cache.c b/src/cache.c +index 8add610..c94132e 100644 +--- a/src/cache.c ++++ b/src/cache.c +@@ -66,6 +66,7 @@ static const struct { + { 52, "TLSA" }, + { 53, "SMIMEA" }, + { 55, "HIP" }, ++ { 65, "HTTPS"}, + { 249, "TKEY" }, + { 250, "TSIG" }, + { 251, "IXFR" }, +@@ -1805,6 +1806,20 @@ char *record_source(unsigned int index) + return ""; + } + ++// patch: function returns integer 1 if query type is unknown. ++// known types are defined in cache.c:typestr:36. ++int is_query_type_unknown(unsigned short type) ++{ ++ unsigned int i; ++ for (i = 0; i < (sizeof(typestr)/sizeof(typestr[0])); i++) ++ if (typestr[i].type == type) ++ { ++ return 0; ++ } ++ return 1; ++} ++// end of patch ++ + char *querystr(char *desc, unsigned short type) + { + unsigned int i; +diff --git a/src/dns-protocol.h b/src/dns-protocol.h +index 496a4bb..ed0d64a 100644 +--- a/src/dns-protocol.h ++++ b/src/dns-protocol.h +@@ -71,6 +71,7 @@ + #define T_NSEC 47 + #define T_DNSKEY 48 + #define T_NSEC3 50 ++#define T_HTTPS 65 + #define T_TKEY 249 + #define T_TSIG 250 + #define T_AXFR 252 +diff --git a/src/dnsmasq.h b/src/dnsmasq.h +index 8674823..d067741 100644 +--- a/src/dnsmasq.h ++++ b/src/dnsmasq.h +@@ -275,7 +275,10 @@ struct event_desc { + #define OPT_UMBRELLA_DEVID 64 + #define OPT_CMARK_ALST_EN 65 + #define OPT_QUIET_TFTP 66 +-#define OPT_LAST 67 ++#define OPT_FILTER_AAAA 67 ++#define OPT_FILTER_HTTPS 68 ++#define OPT_FILTER_UNKNOWN 69 ++#define OPT_LAST 70 + + #define OPTION_BITS (sizeof(unsigned int)*8) + #define OPTION_SIZE ( (OPT_LAST/OPTION_BITS)+((OPT_LAST%OPTION_BITS)!=0) ) +@@ -1247,6 +1250,10 @@ void cache_init(void); + void next_uid(struct crec *crecp); + void log_query(unsigned int flags, char *name, union all_addr *addr, char *arg); + char *record_source(unsigned int index); ++// patch: function returns integer 1 if query type is unknown ++// known types are defined in cache.c:typestr:36. ++int is_query_type_unknown(unsigned short type); ++// end of patch + char *querystr(char *desc, unsigned short type); + int cache_find_non_terminal(char *name, time_t now); + struct crec *cache_find_by_addr(struct crec *crecp, +diff --git a/src/option.c b/src/option.c +index ffce9fc..3993c10 100644 +--- a/src/option.c ++++ b/src/option.c +@@ -174,6 +174,9 @@ struct myoption { + #define LOPT_CMARK_ALST 366 + #define LOPT_QUIET_TFTP 367 + #define LOPT_MINTTL 368 ++#define LOPT_FILTER_AAAA 369 ++#define LOPT_FILTER_HTTPS 370 ++#define LOPT_FILTER_UNKNOWN 371 + + #ifdef HAVE_GETOPT_LONG + static const struct option opts[] = +@@ -353,6 +356,9 @@ static const struct myoption opts[] = + { "log-debug", 0, 0, LOPT_LOG_DEBUG }, + { "umbrella", 2, 0, LOPT_UMBRELLA }, + { "quiet-tftp", 0, 0, LOPT_QUIET_TFTP }, ++ { "filter-aaaa", 0, 0, LOPT_FILTER_AAAA }, ++ { "filter-https", 0, 0, LOPT_FILTER_HTTPS }, ++ { "filter-unknown", 0, 0, LOPT_FILTER_UNKNOWN }, + { NULL, 0, 0, 0 } + }; + +@@ -539,6 +545,9 @@ static struct { + { LOPT_SCRIPT_TIME, OPT_LEASE_RENEW, NULL, gettext_noop("Call dhcp-script when lease expiry changes."), NULL }, + { LOPT_UMBRELLA, ARG_ONE, "[=]", gettext_noop("Send Cisco Umbrella identifiers including remote IP."), NULL }, + { LOPT_QUIET_TFTP, OPT_QUIET_TFTP, NULL, gettext_noop("Do not log routine TFTP."), NULL }, ++ { LOPT_FILTER_AAAA, OPT_FILTER_AAAA, NULL, gettext_noop("Filter all AAAA requests."), NULL }, ++ { LOPT_FILTER_HTTPS, OPT_FILTER_HTTPS, NULL, gettext_noop("Filter all HTTPS/query type 65 requests."), NULL }, ++ { LOPT_FILTER_UNKNOWN, OPT_FILTER_UNKNOWN, NULL, gettext_noop("Filter all unknown query types (known are defined in cache.c)."), NULL }, + { 0, 0, NULL, NULL, NULL } + }; + +diff --git a/src/rfc1035.c b/src/rfc1035.c +index 6fc4f26..395634b 100644 +--- a/src/rfc1035.c ++++ b/src/rfc1035.c +@@ -1987,6 +1987,32 @@ size_t answer_request(struct dns_header *header, char *limit, size_t qlen, + } + } + ++ //patch to filter aaaa forwards ++ if (qtype == T_AAAA && option_bool(OPT_FILTER_AAAA) ){ ++ //return a null reply ++ ans = 1; ++ if (!dryrun) log_query(F_CONFIG | F_IPV6 | F_NEG, name, &addr, NULL); ++ break; ++ } ++ //end of patch ++ //patch to filter https/query type 65 forwards ++ if (qtype == T_HTTPS && option_bool(OPT_FILTER_HTTPS) ){ ++ //return a null reply ++ ans = 1; ++ if (!dryrun) log_query(F_CONFIG | F_IPV4 | F_NEG, name, &addr, NULL); ++ break; ++ } ++ //end of patch ++ //patch to filter all unknown query types ++ //known types are defined in cache.c:typestr:36. ++ if (is_query_type_unknown(qtype) && option_bool(OPT_FILTER_UNKNOWN)) { ++ //return a null reply ++ ans = 1; ++ if (!dryrun) log_query(F_CONFIG | F_NEG, name, NULL, NULL); ++ break; ++ } ++ //end of patch ++ + if (!ans) + return 0; /* failed to answer a question */ + } From 8a0982186e06a7fb88d309152d766dea73d6f361 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Wed, 23 Nov 2022 18:34:51 +0800 Subject: [PATCH 10/26] kernel: sysctl: update nf_ct_expect settings for fullcone nat mode 2 --- package/kernel/linux/files/sysctl-nf-conntrack.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/kernel/linux/files/sysctl-nf-conntrack.conf b/package/kernel/linux/files/sysctl-nf-conntrack.conf index 897cac86cb31f5..6d6cd4edc35297 100644 --- a/package/kernel/linux/files/sysctl-nf-conntrack.conf +++ b/package/kernel/linux/files/sysctl-nf-conntrack.conf @@ -9,4 +9,4 @@ net.netfilter.nf_conntrack_udp_timeout=60 net.netfilter.nf_conntrack_udp_timeout_stream=180 net.netfilter.nf_conntrack_helper=1 net.netfilter.nf_conntrack_buckets=16384 -net.netfilter.nf_conntrack_expect_max=512 +net.netfilter.nf_conntrack_expect_max=16384 From 2612e362b6e84bf357593664020bfad9a6180f73 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Wed, 23 Nov 2022 22:07:11 +0800 Subject: [PATCH 11/26] ath11k-wifi: add board bdf files package --- package/firmware/ath11k-wifi/Makefile | 92 ++++++++++++++++ .../firmware/ath11k-wifi/board-2.bin.IPQ6018 | Bin 0 -> 787208 bytes .../ath11k-wifi/board-gl-ax1800.bin.IPQ6018 | Bin 0 -> 787208 bytes .../ath11k-wifi/board-gl-axt1800.bin.IPQ6018 | Bin 0 -> 787208 bytes .../ath11k-wifi/board-qihoo_360v6.bin.IPQ6018 | Bin 0 -> 787208 bytes .../ath11k-wifi/qdss_trace_config.bin | 99 ++++++++++++++++++ 6 files changed, 191 insertions(+) create mode 100644 package/firmware/ath11k-wifi/Makefile create mode 100644 package/firmware/ath11k-wifi/board-2.bin.IPQ6018 create mode 100644 package/firmware/ath11k-wifi/board-gl-ax1800.bin.IPQ6018 create mode 100644 package/firmware/ath11k-wifi/board-gl-axt1800.bin.IPQ6018 create mode 100644 package/firmware/ath11k-wifi/board-qihoo_360v6.bin.IPQ6018 create mode 100644 package/firmware/ath11k-wifi/qdss_trace_config.bin diff --git a/package/firmware/ath11k-wifi/Makefile b/package/firmware/ath11k-wifi/Makefile new file mode 100644 index 00000000000000..0ba6427a1ed448 --- /dev/null +++ b/package/firmware/ath11k-wifi/Makefile @@ -0,0 +1,92 @@ +include $(TOPDIR)/rules.mk +include $(INCLUDE_DIR)/version.mk + +PKG_NAME:=ath11k-wifi +PKG_RELEASE:=1 +PKG_FLAGS:=nonshared + +include $(INCLUDE_DIR)/package.mk + +define Build/Prepare + mkdir -p $(PKG_BUILD_DIR) +endef + +define Build/Compile +endef + +# Use ath10k-bdencoder from https://github.com/qca/qca-swiss-army-knife.git +# to generate the board-* files here. +# +# This is intended to be used on an interim basis until device-specific +# board data for new devices is available through the upstream compilation +# +# Please send a mail with your device-specific board files upstream. +# You can find instructions and examples on the linux-wireless wiki: +# + +ALLWIFIBOARDS:= \ + gl-ax1800 \ + gl-axt1800 \ + qihoo_v6 + +ALLWIFIPACKAGES:=$(foreach BOARD,$(ALLWIFIBOARDS),ath11k-wifi-$(BOARD)) + +define Package/ath11k-wifi-default + SUBMENU:=ath11k Board-Specific Overrides + SECTION:=firmware + CATEGORY:=Firmware + DEPENDS:=@TARGET_ipq60xx + TITLE:=Custom Board +endef + +define ath11k-wifi-install-one-to + $(INSTALL_DIR) $(2)/lib/firmware/ath11k/$(3)/ + $(INSTALL_DATA) $(1) $(2)/lib/firmware/ath11k/$(3)/board-2.bin +endef + +define ath11k-wifi-install-one + $(if $(filter $(suffix $(1)),.IPQ6018 .ipq6018),\ + $(call ath11k-wifi-install-one-to,$(1),$(2),IPQ6018/hw1.0),\ + $(error Unrecognized board-file suffix '$(suffix $(1))' for '$(1)')\ + ) + +endef +# Blank line required at end of above define due to foreach context + +define generate-ath11k-wifi-package + define Package/ath11k-wifi-$(1) + $(call Package/ath11k-wifi-default) + TITLE:=board-2.bin Overrides for $(2) + CONFLICTS:=$(PREV_BOARD) + endef + + define Package/ath11k-wifi-$(1)/description +The $(2) requires board-specific, reference ("cal") data +that is not yet present in the upstream wireless firmware distribution. + +This package supplies board-2.bin file(s) that, in the interim, +overwrite those supplied by the ath10k-firmware-* packages. + +This is package is only necessary for the $(2). + +Do not install it for any other device! + endef + + define Package/ath11k-wifi-$(1)/install-overlay + $$$$(foreach IPQ_WIFI_BOARD_FILE,$$$$(wildcard board-$(1).*),\ + $$$$(call ath11k-wifi-install-one,$$$$(IPQ_WIFI_BOARD_FILE),$$(1))) + endef + + PREV_BOARD+=ath11k-wifi-$(1) +endef + +# Add board name to ALLWIFIBOARDS +# Place files in this directory as board-. +# Add $(eval $(call generate-ath11k-wifi-package,,)) + +$(eval $(call generate-ath11k-wifi-package,gl-ax1800,Gl.iNET AX1800)) +$(eval $(call generate-ath11k-wifi-package,gl-axt1800,Gl.iNET AXT1800)) +$(eval $(call generate-ath11k-wifi-package,qihoo_v6,QIHOO 360V6)) + + +$(foreach PACKAGE,$(ALLWIFIPACKAGES),$(eval $(call BuildPackage,$(PACKAGE)))) diff --git a/package/firmware/ath11k-wifi/board-2.bin.IPQ6018 b/package/firmware/ath11k-wifi/board-2.bin.IPQ6018 new file mode 100644 index 0000000000000000000000000000000000000000..8c384dc89b367f1aab745d0e004bbd29c767432a GIT binary patch literal 787208 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�PGEB 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 literal 0 HcmV?d00001 diff --git a/package/firmware/ath11k-wifi/board-gl-ax1800.bin.IPQ6018 b/package/firmware/ath11k-wifi/board-gl-ax1800.bin.IPQ6018 new file mode 100644 index 0000000000000000000000000000000000000000..9ee8d0a756d70b33321ed5da30e7d43501d533fa GIT binary patch literal 787208 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�PGEB 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≪$jj3NLn_#-o#x3KO3P=T{0vEFaGw6A3cq<3a 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�PGEB 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 Mqykcb;S~7)0R(CGkpKVy literal 0 HcmV?d00001 diff --git a/package/firmware/ath11k-wifi/board-qihoo_360v6.bin.IPQ6018 b/package/firmware/ath11k-wifi/board-qihoo_360v6.bin.IPQ6018 new file mode 100644 index 0000000000000000000000000000000000000000..cf26728896d4d3929173f0e5ac467c420a07bf18 GIT binary patch literal 787208 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

Nz~87J~|iY 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

`m)m7oW`y{n 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 z Date: Wed, 23 Nov 2022 22:21:27 +0800 Subject: [PATCH 12/26] ipq60xx: add 360_v6 ath11k wifi BDF --- target/linux/ipq60xx/image/generic.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/target/linux/ipq60xx/image/generic.mk b/target/linux/ipq60xx/image/generic.mk index 198b3199554874..934c388586d1ca 100644 --- a/target/linux/ipq60xx/image/generic.mk +++ b/target/linux/ipq60xx/image/generic.mk @@ -75,6 +75,7 @@ define Device/360_v6 BLOCKSIZE := 128k PAGESIZE := 2048 DEVICE_DTS_CONFIG := config@cp03-c1 + DEVICE_PACKAGES := ath11k-wifi-qihoo_v6 SOC := ipq6018 endef TARGET_DEVICES += 360_v6 From 667b8a7613465ce531155382af6c98b956a43e44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Wed, 17 Aug 2022 22:40:30 +0200 Subject: [PATCH 13/26] kernel: add CONFIG_NVMEM_U_BOOT_ENV symbol to configs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This fixes: U-Boot environment variables support (NVMEM_U_BOOT_ENV) [N/m/y/?] (NEW) Fixes: 34cf310435044 ("kernel: backport U-Boot environment data NVMEM driver") Signed-off-by: Rafał Miłecki --- target/linux/generic/config-5.10 | 1 + target/linux/generic/config-5.15 | 1 + 2 files changed, 2 insertions(+) diff --git a/target/linux/generic/config-5.10 b/target/linux/generic/config-5.10 index 2479d8a7726592..809771d9146325 100644 --- a/target/linux/generic/config-5.10 +++ b/target/linux/generic/config-5.10 @@ -4175,6 +4175,7 @@ CONFIG_NMI_LOG_BUF_SHIFT=13 # CONFIG_NVMEM_IMX_OCOTP is not set # CONFIG_NVMEM_REBOOT_MODE is not set # CONFIG_NVMEM_SYSFS is not set +# CONFIG_NVMEM_U_BOOT_ENV is not set # CONFIG_NVME_FC is not set # CONFIG_NVME_TARGET is not set # CONFIG_NVME_TCP is not set diff --git a/target/linux/generic/config-5.15 b/target/linux/generic/config-5.15 index 01cb0037cf62bc..0ef74e8964a570 100644 --- a/target/linux/generic/config-5.15 +++ b/target/linux/generic/config-5.15 @@ -4385,6 +4385,7 @@ CONFIG_NR_LRU_GENS=7 # CONFIG_NVMEM_REBOOT_MODE is not set # CONFIG_NVMEM_RMEM is not set # CONFIG_NVMEM_SYSFS is not set +# CONFIG_NVMEM_U_BOOT_ENV is not set # CONFIG_NVME_FC is not set # CONFIG_NVME_TARGET is not set # CONFIG_NVME_TCP is not set From 2c83210409cafecd5ae10b45a080ca5eb1144edf Mon Sep 17 00:00:00 2001 From: Christian Marangi Date: Fri, 23 Sep 2022 02:04:36 +0200 Subject: [PATCH 14/26] generic: 5.15: add missing PAGE_POOL_STATS config Add new PAGE_POOL_STATS config backported for the mtk offload patches. Signed-off-by: Christian Marangi --- target/linux/generic/config-5.15 | 1 + 1 file changed, 1 insertion(+) diff --git a/target/linux/generic/config-5.15 b/target/linux/generic/config-5.15 index 0ef74e8964a570..ff75d293216ff6 100644 --- a/target/linux/generic/config-5.15 +++ b/target/linux/generic/config-5.15 @@ -4435,6 +4435,7 @@ CONFIG_PACKET=y # CONFIG_PAGE_EXTENSION is not set # CONFIG_PAGE_OWNER is not set # CONFIG_PAGE_POISONING is not set +# CONFIG_PAGE_POOL_STATS is not set # CONFIG_PAGE_REPORTING is not set # CONFIG_PAGE_SIZE_16KB is not set # CONFIG_PAGE_SIZE_32KB is not set From 1f9c2a3e1f4c79355fae15af5ca1799a09680264 Mon Sep 17 00:00:00 2001 From: AmadeusGhost <2789289348@qq.com> Date: Tue, 22 Nov 2022 23:01:50 +0800 Subject: [PATCH 15/26] rockchip: 5.15: add missing kernel config --- target/linux/generic/config-5.15 | 1 + target/linux/rockchip/armv8/config-5.15 | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/target/linux/generic/config-5.15 b/target/linux/generic/config-5.15 index ff75d293216ff6..f0320563386294 100644 --- a/target/linux/generic/config-5.15 +++ b/target/linux/generic/config-5.15 @@ -5646,6 +5646,7 @@ CONFIG_SERIAL_EARLYCON=y # CONFIG_SG_POOL is not set # CONFIG_SG_SPLIT is not set CONFIG_SHMEM=y +# CONFIG_SHORTCUT_FE is not set # CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set # CONFIG_SH_ETH is not set # CONFIG_SH_TIMER_CMT is not set diff --git a/target/linux/rockchip/armv8/config-5.15 b/target/linux/rockchip/armv8/config-5.15 index 85299456c9b426..956ff6469b9c9e 100644 --- a/target/linux/rockchip/armv8/config-5.15 +++ b/target/linux/rockchip/armv8/config-5.15 @@ -70,10 +70,14 @@ CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y CONFIG_ARM_PSCI_FW=y CONFIG_ARM_RK3328_DMC_DEVFREQ=y # CONFIG_ARM_RK3399_DMC_DEVFREQ is not set +# CONFIG_ARM_SCMI_CPUFREQ is not set +CONFIG_ARM_SCMI_POWER_DOMAIN=y CONFIG_ARM_SCMI_PROTOCOL=y CONFIG_ARM_SCPI_CPUFREQ=y CONFIG_ARM_SCPI_POWER_DOMAIN=y CONFIG_ARM_SCPI_PROTOCOL=y +CONFIG_ARM_SCMI_TRANSPORT_MAILBOX=y +CONFIG_ARM_SCMI_TRANSPORT_SMC=y CONFIG_ARM_SMMU=y CONFIG_ARM_SMMU_DISABLE_BYPASS_BY_DEFAULT=y # CONFIG_ARM_SMMU_LEGACY_DT_BINDINGS is not set @@ -536,6 +540,7 @@ CONFIG_REGMAP_I2C=y CONFIG_REGMAP_IRQ=y CONFIG_REGMAP_MMIO=y CONFIG_REGULATOR=y +# CONFIG_REGULATOR_ARM_SCMI is not set # CONFIG_REGULATOR_DA9121 is not set CONFIG_REGULATOR_FAN53555=y CONFIG_REGULATOR_FIXED_VOLTAGE=y @@ -546,6 +551,7 @@ CONFIG_REGULATOR_RK808=y # CONFIG_REGULATOR_RTQ6752 is not set CONFIG_RELOCATABLE=y CONFIG_RESET_CONTROLLER=y +CONFIG_RESET_SCMI=y CONFIG_RFS_ACCEL=y CONFIG_ROCKCHIP_EFUSE=y CONFIG_ROCKCHIP_GRF=y @@ -577,6 +583,7 @@ CONFIG_SCSI_SAS_LIBSAS=y # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SENSORS_AHT10 is not set # CONFIG_SENSORS_AQUACOMPUTER_D5NEXT is not set +# CONFIG_SENSORS_ARM_SCMI is not set CONFIG_SENSORS_ARM_SCPI=y # CONFIG_SENSORS_LTC2992 is not set # CONFIG_SENSORS_MAX127 is not set From 857a955f1ead4122e45f7f3fe53b46159e1eee37 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Fri, 25 Nov 2022 02:59:14 +0800 Subject: [PATCH 16/26] x86: fix Bintel's ZHITAI Ti Plus 5000 fw bug --- .../999-fix-nvme_ms_ids-bug.patch | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 target/linux/x86/patches-5.15/999-fix-nvme_ms_ids-bug.patch diff --git a/target/linux/x86/patches-5.15/999-fix-nvme_ms_ids-bug.patch b/target/linux/x86/patches-5.15/999-fix-nvme_ms_ids-bug.patch new file mode 100644 index 00000000000000..bfdc3c59f09846 --- /dev/null +++ b/target/linux/x86/patches-5.15/999-fix-nvme_ms_ids-bug.patch @@ -0,0 +1,27 @@ +From 2bef3874236ab96d517dd2525aa8260507de24d3 Mon Sep 17 00:00:00 2001 +From: kingtous +Date: Fri, 8 Apr 2022 10:34:46 +0800 +Subject: [PATCH] fix: nvme_update_ns_info method should be called even if + nvme_ms_ids_equal return false + +I've encountered the suspend issue which causes NVMe SSD cannot be detected after reboot from Linux or wake from suspend. I've tried almost all popular Linux distributions like Ubuntu, Debian, Arch, Manjaro. None of them works with my NVMe SSD. +I changed a brand new SSD but it doesn't work either. Originally, if nvme_ns_ids_equal method returns false, the nvme ns info will not try to update and namespace suddenly be removed. This is the issue I've found causing my laptop SSD not detected after suspend or reboot from Linux. After removing 'goto out_free_id', the suspend issue has gone, everything works. +When nvme namespaced ids are not equal, we should also try to update namespace info, not just skip it. + +Signed-off-by: kingtous +--- + drivers/nvme/host/core.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c +index efb85c6d8e2d5d..89c6a9598558a2 100644 +--- a/drivers/nvme/host/core.c ++++ b/drivers/nvme/host/core.c +@@ -4056,7 +4056,6 @@ static void nvme_validate_ns(struct nvme_ns *ns, struct nvme_ns_ids *ids) + if (!nvme_ns_ids_equal(&ns->head->ids, ids)) { + dev_err(ns->ctrl->device, + "identifiers changed for nsid %d\n", ns->head->ns_id); +- goto out_free_id; + } + + ret = nvme_update_ns_info(ns, id); From 1156d237508cd59185e73e24b12ced116470ab75 Mon Sep 17 00:00:00 2001 From: sdf8057 <54014465+sdf8057@users.noreply.github.com> Date: Fri, 25 Nov 2022 03:00:18 +0800 Subject: [PATCH 17/26] ipq807x: disable br-nf after qca-nss-ecm start (#10488) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit qca-nss-ecm启动之后会开启网桥ipv4/ipv6的包过滤导致NAT loopback不可用。再次关闭网桥包过滤,以解决NAT loopback不可用的问题。 --- .../ipq807x/base-files/etc/sysctl.d/99-bridge-nf-call.conf | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 target/linux/ipq807x/base-files/etc/sysctl.d/99-bridge-nf-call.conf diff --git a/target/linux/ipq807x/base-files/etc/sysctl.d/99-bridge-nf-call.conf b/target/linux/ipq807x/base-files/etc/sysctl.d/99-bridge-nf-call.conf new file mode 100644 index 00000000000000..af92caa644a8dd --- /dev/null +++ b/target/linux/ipq807x/base-files/etc/sysctl.d/99-bridge-nf-call.conf @@ -0,0 +1,6 @@ +# disable bridge netfilter module + +net.bridge.bridge-nf-call-arptables=0 +net.bridge.bridge-nf-call-iptables=0 +net.bridge.bridge-nf-call-ip6tables=0 + From 4d5470d13b00d28e2a35e9b2173ac96933b72f32 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Fri, 25 Nov 2022 15:18:41 +0800 Subject: [PATCH 18/26] Revert "x86: fix Bintel's ZHITAI Ti Plus 5000 fw bug" This reverts commit 857a955f1ead4122e45f7f3fe53b46159e1eee37. --- .../999-fix-nvme_ms_ids-bug.patch | 27 ------------------- 1 file changed, 27 deletions(-) delete mode 100644 target/linux/x86/patches-5.15/999-fix-nvme_ms_ids-bug.patch diff --git a/target/linux/x86/patches-5.15/999-fix-nvme_ms_ids-bug.patch b/target/linux/x86/patches-5.15/999-fix-nvme_ms_ids-bug.patch deleted file mode 100644 index bfdc3c59f09846..00000000000000 --- a/target/linux/x86/patches-5.15/999-fix-nvme_ms_ids-bug.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 2bef3874236ab96d517dd2525aa8260507de24d3 Mon Sep 17 00:00:00 2001 -From: kingtous -Date: Fri, 8 Apr 2022 10:34:46 +0800 -Subject: [PATCH] fix: nvme_update_ns_info method should be called even if - nvme_ms_ids_equal return false - -I've encountered the suspend issue which causes NVMe SSD cannot be detected after reboot from Linux or wake from suspend. I've tried almost all popular Linux distributions like Ubuntu, Debian, Arch, Manjaro. None of them works with my NVMe SSD. -I changed a brand new SSD but it doesn't work either. Originally, if nvme_ns_ids_equal method returns false, the nvme ns info will not try to update and namespace suddenly be removed. This is the issue I've found causing my laptop SSD not detected after suspend or reboot from Linux. After removing 'goto out_free_id', the suspend issue has gone, everything works. -When nvme namespaced ids are not equal, we should also try to update namespace info, not just skip it. - -Signed-off-by: kingtous ---- - drivers/nvme/host/core.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c -index efb85c6d8e2d5d..89c6a9598558a2 100644 ---- a/drivers/nvme/host/core.c -+++ b/drivers/nvme/host/core.c -@@ -4056,7 +4056,6 @@ static void nvme_validate_ns(struct nvme_ns *ns, struct nvme_ns_ids *ids) - if (!nvme_ns_ids_equal(&ns->head->ids, ids)) { - dev_err(ns->ctrl->device, - "identifiers changed for nsid %d\n", ns->head->ns_id); -- goto out_free_id; - } - - ret = nvme_update_ns_info(ns, id); From bf2528d9b50524b132a43f9548d3fc48346d5176 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Fri, 25 Nov 2022 15:26:02 +0800 Subject: [PATCH 19/26] iwinfo: add hardware id for MT7922 devices support --- package/network/utils/iwinfo/Makefile | 2 +- .../002-devices-add-MediaTek-MT7922-device-id.patch | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 package/network/utils/iwinfo/patches/002-devices-add-MediaTek-MT7922-device-id.patch diff --git a/package/network/utils/iwinfo/Makefile b/package/network/utils/iwinfo/Makefile index 881444252e5667..45a08321e27e98 100644 --- a/package/network/utils/iwinfo/Makefile +++ b/package/network/utils/iwinfo/Makefile @@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=libiwinfo -PKG_RELEASE:=3 +PKG_RELEASE:=5 PKG_SOURCE_PROTO:=git PKG_SOURCE_URL=$(PROJECT_GIT)/project/iwinfo.git diff --git a/package/network/utils/iwinfo/patches/002-devices-add-MediaTek-MT7922-device-id.patch b/package/network/utils/iwinfo/patches/002-devices-add-MediaTek-MT7922-device-id.patch new file mode 100644 index 00000000000000..77ffb1a7f6515b --- /dev/null +++ b/package/network/utils/iwinfo/patches/002-devices-add-MediaTek-MT7922-device-id.patch @@ -0,0 +1,9 @@ +--- a/hardware.txt ++++ b/hardware.txt +@@ -225,5 +225,6 @@ + 0x14c3 0x7650 0x14c3 0x7650 0 0 "MediaTek" "MT7610E" + 0x14c3 0x7662 0x14c3 0x7662 0 0 "MediaTek" "MT76x2E" + 0x14c3 0x7915 0x14c3 0x7915 0 0 "MediaTek" "MT7915E" ++0x14c3 0x7922 0x1A3B 0x5300 0 0 "MediaTek" "MT7922" + 0x14e4 0xaa52 0x14e4 0xaa52 0 0 "Broadcom" "BCM43602" + 0x1ae9 0x0310 0x1ae9 0x0000 0 0 "Wilocity" "Wil6210" From 3c220e5c59a7b2594acbaa1ff70791f09b3411cf Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Sat, 26 Nov 2022 12:42:37 +0800 Subject: [PATCH 20/26] Update feeds.conf.default --- feeds.conf.default | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/feeds.conf.default b/feeds.conf.default index 0f42f846e0dee3..14419ee399a9e4 100644 --- a/feeds.conf.default +++ b/feeds.conf.default @@ -2,7 +2,8 @@ src-git packages https://github.com/coolsnowwolf/packages src-git luci https://github.com/coolsnowwolf/luci src-git routing https://github.com/coolsnowwolf/routing src-git telephony https://git.openwrt.org/feed/telephony.git -src-git oui https://github.com/zhaojh329/oui.git +#src-git helloworld https://github.com/fw876/helloworld.git +#src-git oui https://github.com/zhaojh329/oui.git #src-git video https://github.com/openwrt/video.git #src-git targets https://github.com/openwrt/targets.git #src-git oldpackages http://git.openwrt.org/packages.git From fc33fa6e5f793cc71cf0c807e088adda26fb4c9a Mon Sep 17 00:00:00 2001 From: lovehackintosh <92633080+lovehackintosh@users.noreply.github.com> Date: Sat, 26 Nov 2022 18:05:47 +0800 Subject: [PATCH 21/26] tools/mpfr: update to 4.1.1 (#10502) Changes: - Bug fixes - Improved manual formatting Refresh patches: - 001-only_src.patch Signed-off-by: Nick Hainke Co-authored-by: Nick Hainke --- tools/mpfr/Makefile | 4 ++-- tools/mpfr/patches/001-only_src.patch | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/mpfr/Makefile b/tools/mpfr/Makefile index 4562c128d4341b..6a13be73981b06 100644 --- a/tools/mpfr/Makefile +++ b/tools/mpfr/Makefile @@ -7,12 +7,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mpfr -PKG_VERSION:=4.1.0 +PKG_VERSION:=4.1.1 PKG_CPE_ID:=cpe:/a:mpfr:gnu_mpfr PKG_SOURCE_URL:=@GNU/mpfr http://www.mpfr.org/mpfr-$(PKG_VERSION) PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz -PKG_HASH:=0c98a3f1732ff6ca4ea690552079da9c597872d30e96ec28414ee23c95558a7f +PKG_HASH:=ffd195bd567dbaffc3b98b23fd00aad0537680c9896171e44fe3ff79e28ac33d HOST_BUILD_PARALLEL:=1 HOST_FIXUP:=autoreconf diff --git a/tools/mpfr/patches/001-only_src.patch b/tools/mpfr/patches/001-only_src.patch index dbc7d32343f482..68312276c9db45 100644 --- a/tools/mpfr/patches/001-only_src.patch +++ b/tools/mpfr/patches/001-only_src.patch @@ -1,6 +1,6 @@ --- a/Makefile.am +++ b/Makefile.am -@@ -24,7 +24,7 @@ AUTOMAKE_OPTIONS = gnu +@@ -34,7 +34,7 @@ AUTOMAKE_OPTIONS = gnu # old Automake version. ACLOCAL_AMFLAGS = -I m4 @@ -11,7 +11,7 @@ pkgconfig_DATA = mpfr.pc --- a/Makefile.in +++ b/Makefile.in -@@ -384,7 +384,7 @@ AUTOMAKE_OPTIONS = gnu +@@ -397,7 +397,7 @@ AUTOMAKE_OPTIONS = gnu # libtoolize and in case some developer needs to switch back to an # old Automake version. ACLOCAL_AMFLAGS = -I m4 From 0b241584b56b2e17d040e35679edd03a8ca40058 Mon Sep 17 00:00:00 2001 From: Linhui Liu Date: Sat, 26 Nov 2022 13:50:27 +0800 Subject: [PATCH 22/26] kernel: bump 5.4 to 5.4.225 All patches automatically rebased. Signed-off-by: Linhui Liu --- include/kernel-5.4 | 4 ++-- ...of-net-pass-the-dst-buffer-to-of_get_mac_address.patch | 8 ++++---- target/linux/generic/hack-5.4/221-module_exports.patch | 4 ++-- .../pending-5.4/499-mtd-spi-nor-add-xmc-xm25qh128c.patch | 2 +- .../ipq806x/patches-5.4/999-03b-qca-nss-ecm-support.patch | 2 +- ...dwc3-Add-workaround-for-host-mode-VBUS-glitch-wh.patch | 8 ++++---- ...mmc-core-set-initial-signal-voltage-on-power-off.patch | 2 +- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/include/kernel-5.4 b/include/kernel-5.4 index 6c38d179313891..cd7de7b8fc8c66 100644 --- a/include/kernel-5.4 +++ b/include/kernel-5.4 @@ -1,2 +1,2 @@ -LINUX_VERSION-5.4 = .224 -LINUX_KERNEL_HASH-5.4.224 = 8b7df25b5560620eb2776d7b7c67569764b3916ff2f596767f72567b38d13d36 +LINUX_VERSION-5.4 = .225 +LINUX_KERNEL_HASH-5.4.225 = 59f596f6714317955cf481590babcf015aff2bc1900bd8e8dc8f7af73bc560aa diff --git a/target/linux/generic/backport-5.4/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch b/target/linux/generic/backport-5.4/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch index dbb479d8737e18..9363329e36d3d5 100644 --- a/target/linux/generic/backport-5.4/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch +++ b/target/linux/generic/backport-5.4/782-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch @@ -766,7 +766,7 @@ Signed-off-by: David S. Miller /* bring up the dma engine and IP core */ --- a/drivers/net/ethernet/marvell/mv643xx_eth.c +++ b/drivers/net/ethernet/marvell/mv643xx_eth.c -@@ -2705,7 +2705,6 @@ static int mv643xx_eth_shared_of_add_por +@@ -2706,7 +2706,6 @@ static int mv643xx_eth_shared_of_add_por struct platform_device *ppdev; struct mv643xx_eth_platform_data ppd; struct resource res; @@ -774,7 +774,7 @@ Signed-off-by: David S. Miller int ret; int dev_num = 0; -@@ -2736,9 +2735,7 @@ static int mv643xx_eth_shared_of_add_por +@@ -2737,9 +2736,7 @@ static int mv643xx_eth_shared_of_add_por return -EINVAL; } @@ -1362,7 +1362,7 @@ Signed-off-by: David S. Miller --- a/drivers/net/ethernet/ti/cpsw.c +++ b/drivers/net/ethernet/ti/cpsw.c -@@ -2555,7 +2555,6 @@ static int cpsw_probe_dt(struct cpsw_pla +@@ -2557,7 +2557,6 @@ static int cpsw_probe_dt(struct cpsw_pla for_each_available_child_of_node(node, slave_node) { struct cpsw_slave_data *slave_data = data->slave_data + i; @@ -1370,7 +1370,7 @@ Signed-off-by: David S. Miller int lenp; const __be32 *parp; -@@ -2628,10 +2627,8 @@ static int cpsw_probe_dt(struct cpsw_pla +@@ -2630,10 +2629,8 @@ static int cpsw_probe_dt(struct cpsw_pla } no_phy_slave: diff --git a/target/linux/generic/hack-5.4/221-module_exports.patch b/target/linux/generic/hack-5.4/221-module_exports.patch index 47f40ac5e194a6..446bf53008ce1b 100644 --- a/target/linux/generic/hack-5.4/221-module_exports.patch +++ b/target/linux/generic/hack-5.4/221-module_exports.patch @@ -30,7 +30,7 @@ Signed-off-by: Felix Fietkau /* Align . to a 8 byte boundary equals to maximum function alignment. */ #define ALIGN_FUNCTION() . = ALIGN(8) -@@ -407,14 +417,14 @@ +@@ -408,14 +418,14 @@ /* Kernel symbol table: Normal symbols */ \ __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ __start___ksymtab = .; \ @@ -47,7 +47,7 @@ Signed-off-by: Felix Fietkau __stop___ksymtab_gpl = .; \ } \ \ -@@ -476,7 +486,7 @@ +@@ -477,7 +487,7 @@ \ /* Kernel symbol table: strings */ \ __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ diff --git a/target/linux/generic/pending-5.4/499-mtd-spi-nor-add-xmc-xm25qh128c.patch b/target/linux/generic/pending-5.4/499-mtd-spi-nor-add-xmc-xm25qh128c.patch index 90c7287325d2d6..9d936d043920da 100644 --- a/target/linux/generic/pending-5.4/499-mtd-spi-nor-add-xmc-xm25qh128c.patch +++ b/target/linux/generic/pending-5.4/499-mtd-spi-nor-add-xmc-xm25qh128c.patch @@ -11,7 +11,7 @@ Submitted-by: Langhua Ye --- a/drivers/mtd/spi-nor/spi-nor.c +++ b/drivers/mtd/spi-nor/spi-nor.c -@@ -2565,6 +2565,7 @@ +@@ -2566,6 +2566,7 @@ static const struct flash_info spi_nor_i /* XMC (Wuhan Xinxin Semiconductor Manufacturing Corp.) */ { "XM25QH64A", INFO(0x207017, 0, 64 * 1024, 128, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, { "XM25QH128A", INFO(0x207018, 0, 64 * 1024, 256, SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) }, diff --git a/target/linux/ipq806x/patches-5.4/999-03b-qca-nss-ecm-support.patch b/target/linux/ipq806x/patches-5.4/999-03b-qca-nss-ecm-support.patch index fd5666a196e34c..53d2ed8a5ba456 100644 --- a/target/linux/ipq806x/patches-5.4/999-03b-qca-nss-ecm-support.patch +++ b/target/linux/ipq806x/patches-5.4/999-03b-qca-nss-ecm-support.patch @@ -90,7 +90,7 @@ #endif --- a/drivers/net/tun.c +++ b/drivers/net/tun.c -@@ -2873,6 +2873,8 @@ static int tun_set_iff(struct net *net, +@@ -2881,6 +2881,8 @@ static int tun_set_iff(struct net *net, ~(NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_HW_VLAN_STAG_TX); diff --git a/target/linux/layerscape/patches-5.4/820-usb-0009-usb-dwc3-Add-workaround-for-host-mode-VBUS-glitch-wh.patch b/target/linux/layerscape/patches-5.4/820-usb-0009-usb-dwc3-Add-workaround-for-host-mode-VBUS-glitch-wh.patch index a5b84f3db958d9..0e2942a3bceb12 100644 --- a/target/linux/layerscape/patches-5.4/820-usb-0009-usb-dwc3-Add-workaround-for-host-mode-VBUS-glitch-wh.patch +++ b/target/linux/layerscape/patches-5.4/820-usb-0009-usb-dwc3-Add-workaround-for-host-mode-VBUS-glitch-wh.patch @@ -64,9 +64,9 @@ Reviewed-by: Peter Chen --- a/drivers/usb/dwc3/host.c +++ b/drivers/usb/dwc3/host.c -@@ -16,6 +16,44 @@ static const struct xhci_plat_priv dwc3_ - .quirks = XHCI_SKIP_PHY_INIT, - }; +@@ -11,6 +11,44 @@ + + #include "core.h" +#define XHCI_HCSPARAMS1 0x4 +#define XHCI_PORTSC_BASE 0x400 @@ -109,7 +109,7 @@ Reviewed-by: Peter Chen static int dwc3_host_get_irq(struct dwc3 *dwc) { struct platform_device *dwc3_pdev = to_platform_device(dwc->dev); -@@ -55,6 +93,13 @@ int dwc3_host_init(struct dwc3 *dwc) +@@ -50,6 +88,13 @@ int dwc3_host_init(struct dwc3 *dwc) struct platform_device *dwc3_pdev = to_platform_device(dwc->dev); int prop_idx = 0; diff --git a/target/linux/rockchip/patches-5.4/105-mmc-core-set-initial-signal-voltage-on-power-off.patch b/target/linux/rockchip/patches-5.4/105-mmc-core-set-initial-signal-voltage-on-power-off.patch index d462899007ceb4..f70cbb9e23834e 100644 --- a/target/linux/rockchip/patches-5.4/105-mmc-core-set-initial-signal-voltage-on-power-off.patch +++ b/target/linux/rockchip/patches-5.4/105-mmc-core-set-initial-signal-voltage-on-power-off.patch @@ -24,7 +24,7 @@ Signed-off-by: Jonas Karlman --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c -@@ -1371,6 +1371,8 @@ void mmc_power_off(struct mmc_host *host +@@ -1377,6 +1377,8 @@ void mmc_power_off(struct mmc_host *host mmc_pwrseq_power_off(host); From e787ad1a4b540605fe8d130bf5b8bb9ccf17f625 Mon Sep 17 00:00:00 2001 From: lovehackintosh <92633080+lovehackintosh@users.noreply.github.com> Date: Sat, 26 Nov 2022 18:07:27 +0800 Subject: [PATCH 23/26] kernel: bump 5.10 to 5.10.156 (#10498) Manually rebased: ath79/patches-5.10/910-unaligned_access_hacks.patch All other patches automatically rebased. Co-authored-by: John Audia Signed-off-by: Linhui Liu --- include/kernel-5.10 | 4 +- .../910-unaligned_access_hacks.patch | 68 ++++++++++++++----- ...the-dst-buffer-to-of_get_mac_address.patch | 4 +- .../patches-5.10/410-bt-mtk-serial-fix.patch | 2 +- ...-initial-signal-voltage-on-power-off.patch | 2 +- 5 files changed, 57 insertions(+), 23 deletions(-) diff --git a/include/kernel-5.10 b/include/kernel-5.10 index dec15dddaa68ac..16040014ff125f 100644 --- a/include/kernel-5.10 +++ b/include/kernel-5.10 @@ -1,2 +1,2 @@ -LINUX_VERSION-5.10 = .155 -LINUX_KERNEL_HASH-5.10.155 = f1b027526c58e7bd127f35b17736e4a6c865866b9048898f05c5358d4d52d4f3 +LINUX_VERSION-5.10 = .156 +LINUX_KERNEL_HASH-5.10.156 = 679e9964ca720027967391b61db990ceb7868e93e203f87724f18310f4955923 diff --git a/target/linux/ath79/patches-5.10/910-unaligned_access_hacks.patch b/target/linux/ath79/patches-5.10/910-unaligned_access_hacks.patch index 974ada172309ae..d710d176fc31d2 100644 --- a/target/linux/ath79/patches-5.10/910-unaligned_access_hacks.patch +++ b/target/linux/ath79/patches-5.10/910-unaligned_access_hacks.patch @@ -1,3 +1,47 @@ +From: Felix Fietkau +Subject: [PATCH] ar71xx: fix unaligned access in a few more places + +SVN-Revision: 35130 +--- + arch/mips/include/asm/checksum.h | 83 +++--------------- + include/uapi/linux/ip.h | 2 +- + include/uapi/linux/ipv6.h | 2 +- + include/uapi/linux/tcp.h | 4 ++-- + include/uapi/linux/udp.h | 2 +- + net/netfilter/nf_conntrack_core.c | 4 ++-- + include/uapi/linux/icmp.h | 2 +- + include/uapi/linux/in6.h | 2 +- + net/ipv6/tcp_ipv6.c | 9 +++-- + net/ipv6/datagram.c | 6 ++-- + net/ipv6/exthdrs.c | 2 +- + include/linux/types.h | 5 +++ + net/ipv4/af_inet.c | 4 ++-- + net/ipv4/tcp_output.c | 69 +++++++++-------- + include/uapi/linux/igmp.h | 8 +++--- + net/core/flow_dissector.c | 2 +- + include/uapi/linux/icmpv6.h | 2 +- + include/net/ndisc.h | 10 ++++---- + net/sched/cls_u32.c | 6 +++--- + net/ipv6/ip6_offload.c | 2 +- + include/net/addrconf.h | 2 +- + include/net/inet_ecn.h | 4 ++-- + include/net/ipv6.h | 23 +++++---- + include/net/secure_seq.h | 1 + + include/uapi/linux/in.h | 2 +- + net/ipv6/ip6_fib.h | 2 +- + net/netfilter/nf_conntrack_proto_tcp.c | 2 +- + net/xfrm/xfrm_input.c | 4 ++-- + net/ipv4/tcp_input.c | 12 ++++--- + include/uapi/linux/if_pppox.h | 1 + + net/ipv6/netfilter/nf_log_ipv6.c | 4 ++-- + include/net/neighbour.h | 6 +++-- + include/uapi/linux/netfilter_arp/arp_tables.h | 2 +- + net/core/utils.c | 10 +++++-- + include/linux/etherdevice.h | 11 ++++--- + net/ipv4/tcp_offload.c | 6 +++--- + net/ipv6/netfilter/ip6table_mangle.c | 4 ++-- + 37 file changed, 171 insertions(+), 141 deletions(-) + --- a/arch/mips/include/asm/checksum.h +++ b/arch/mips/include/asm/checksum.h @@ -100,26 +100,30 @@ static inline __sum16 ip_fast_csum(const @@ -118,9 +162,9 @@ --- a/include/uapi/linux/ip.h +++ b/include/uapi/linux/ip.h -@@ -103,7 +103,7 @@ struct iphdr { - __be32 saddr; - __be32 daddr; +@@ -105,7 +105,7 @@ struct iphdr { + __be32 daddr; + ); /*The options start here. */ -}; +} __attribute__((packed, aligned(2))); @@ -129,10 +173,10 @@ struct ip_auth_hdr { --- a/include/uapi/linux/ipv6.h +++ b/include/uapi/linux/ipv6.h -@@ -132,7 +132,7 @@ struct ipv6hdr { - - struct in6_addr saddr; - struct in6_addr daddr; +@@ -134,7 +134,7 @@ struct ipv6hdr { + struct in6_addr saddr; + struct in6_addr daddr; + ); -}; +} __attribute__((packed, aligned(2))); @@ -229,16 +273,6 @@ } #ifdef CONFIG_TCP_MD5SIG ---- a/include/linux/ipv6.h -+++ b/include/linux/ipv6.h -@@ -6,6 +6,7 @@ - - #define ipv6_optlen(p) (((p)->hdrlen+1) << 3) - #define ipv6_authlen(p) (((p)->hdrlen+2) << 2) -+ - /* - * This structure contains configuration options per IPv6 link. - */ --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c @@ -492,7 +492,7 @@ int ipv6_recv_error(struct sock *sk, str diff --git a/target/linux/generic/backport-5.10/732-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch b/target/linux/generic/backport-5.10/732-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch index 3c559938fe3714..80ba4a69c1397d 100644 --- a/target/linux/generic/backport-5.10/732-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch +++ b/target/linux/generic/backport-5.10/732-net-next-1-of-net-pass-the-dst-buffer-to-of_get_mac_address.patch @@ -311,7 +311,7 @@ Signed-off-by: David S. Miller arc_emac_set_address_internal(ndev); --- a/drivers/net/ethernet/atheros/ag71xx.c +++ b/drivers/net/ethernet/atheros/ag71xx.c -@@ -1856,7 +1856,6 @@ static int ag71xx_probe(struct platform_ +@@ -1857,7 +1857,6 @@ static int ag71xx_probe(struct platform_ const struct ag71xx_dcfg *dcfg; struct net_device *ndev; struct resource *res; @@ -319,7 +319,7 @@ Signed-off-by: David S. Miller int tx_size, err, i; struct ag71xx *ag; -@@ -1952,10 +1951,8 @@ static int ag71xx_probe(struct platform_ +@@ -1953,10 +1952,8 @@ static int ag71xx_probe(struct platform_ ag->stop_desc->ctrl = 0; ag->stop_desc->next = (u32)ag->stop_desc_dma; diff --git a/target/linux/mediatek/patches-5.10/410-bt-mtk-serial-fix.patch b/target/linux/mediatek/patches-5.10/410-bt-mtk-serial-fix.patch index 11f4d6ca8b6c9e..7740963b8db2a8 100644 --- a/target/linux/mediatek/patches-5.10/410-bt-mtk-serial-fix.patch +++ b/target/linux/mediatek/patches-5.10/410-bt-mtk-serial-fix.patch @@ -19,7 +19,7 @@ }, [PORT_NPCM] = { .name = "Nuvoton 16550", -@@ -2724,6 +2724,11 @@ serial8250_do_set_termios(struct uart_po +@@ -2713,6 +2713,11 @@ serial8250_do_set_termios(struct uart_po unsigned long flags; unsigned int baud, quot, frac = 0; diff --git a/target/linux/rockchip/patches-5.10/107-mmc-core-set-initial-signal-voltage-on-power-off.patch b/target/linux/rockchip/patches-5.10/107-mmc-core-set-initial-signal-voltage-on-power-off.patch index ef301158598d82..454ce107f75aa2 100644 --- a/target/linux/rockchip/patches-5.10/107-mmc-core-set-initial-signal-voltage-on-power-off.patch +++ b/target/linux/rockchip/patches-5.10/107-mmc-core-set-initial-signal-voltage-on-power-off.patch @@ -24,7 +24,7 @@ Signed-off-by: Jonas Karlman --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c -@@ -1354,6 +1354,8 @@ void mmc_power_off(struct mmc_host *host +@@ -1360,6 +1360,8 @@ void mmc_power_off(struct mmc_host *host mmc_pwrseq_power_off(host); From 07df792ae7d36969351af8970f30770863703aa0 Mon Sep 17 00:00:00 2001 From: lovehackintosh <92633080+lovehackintosh@users.noreply.github.com> Date: Sat, 26 Nov 2022 22:41:11 +0800 Subject: [PATCH 24/26] kernel: bump 6.0 to 6.0.10 (#10505) Manually rebase: pending-6.0/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch All other patches automatically rebased Co-authored-by: John Audia Signed-off-by: Liu Linhui Signed-off-by: Liu Linhui Co-authored-by: John Audia --- include/kernel-6.0 | 4 ++-- .../780-usb-net-MeigLink_modem_support.patch | 6 +++--- .../hack-6.0/992-add-ndo-do-ioctl.patch | 2 +- ...pt-command-line-parameters-from-users.patch | 18 ++++++++---------- ...t-initial-signal-voltage-on-power-off.patch | 2 +- 5 files changed, 15 insertions(+), 17 deletions(-) diff --git a/include/kernel-6.0 b/include/kernel-6.0 index e6a567a9378d30..bcbf9c4fbd3e1a 100644 --- a/include/kernel-6.0 +++ b/include/kernel-6.0 @@ -1,2 +1,2 @@ -LINUX_VERSION-6.0 = .9 -LINUX_KERNEL_HASH-6.0.9 = 6114a208e82739b4a1ab059ace35262be2a83be34cd1ae23cb8a09337db831c7 +LINUX_VERSION-6.0 = .10 +LINUX_KERNEL_HASH-6.0.10 = 39e57fcd84cd70bfa3e1a4185d3aa0ed7f1432f24c6548d16326b0c3c9541dd0 diff --git a/target/linux/generic/hack-6.0/780-usb-net-MeigLink_modem_support.patch b/target/linux/generic/hack-6.0/780-usb-net-MeigLink_modem_support.patch index 54ae94d332a7ed..e10ffa844187c4 100644 --- a/target/linux/generic/hack-6.0/780-usb-net-MeigLink_modem_support.patch +++ b/target/linux/generic/hack-6.0/780-usb-net-MeigLink_modem_support.patch @@ -10,8 +10,8 @@ {QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */ --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c -@@ -243,6 +243,8 @@ static void option_instat_callback(struc - #define UBLOX_PRODUCT_R6XX 0x90fa +@@ -244,6 +244,8 @@ static void option_instat_callback(struc + #define UBLOX_PRODUCT_R410M 0x90b2 /* These Yuga products use Qualcomm's vendor ID */ #define YUGA_PRODUCT_CLM920_NC5 0x9625 +/* These MeigLink products use Qualcomm's vendor ID */ @@ -19,7 +19,7 @@ #define QUECTEL_VENDOR_ID 0x2c7c /* These Quectel products use Quectel's vendor ID */ -@@ -1143,6 +1145,11 @@ static const struct usb_device_id option +@@ -1155,6 +1157,11 @@ static const struct usb_device_id option .driver_info = ZLP }, { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96), .driver_info = RSVD(4) }, diff --git a/target/linux/generic/hack-6.0/992-add-ndo-do-ioctl.patch b/target/linux/generic/hack-6.0/992-add-ndo-do-ioctl.patch index da206e4b46120e..0df54ea22ea7ee 100644 --- a/target/linux/generic/hack-6.0/992-add-ndo-do-ioctl.patch +++ b/target/linux/generic/hack-6.0/992-add-ndo-do-ioctl.patch @@ -1,6 +1,6 @@ --- a/net/wireless/wext-core.c +++ b/net/wireless/wext-core.c -@@ -956,6 +956,9 @@ static int wireless_process_ioctl(struct +@@ -959,6 +959,9 @@ static int wireless_process_ioctl(struct else if (private) return private(dev, iwr, cmd, info, handler); } diff --git a/target/linux/generic/pending-6.0/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch b/target/linux/generic/pending-6.0/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch index 8d2a9b144b9239..1c75eff1ba4c2e 100644 --- a/target/linux/generic/pending-6.0/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch +++ b/target/linux/generic/pending-6.0/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch @@ -238,7 +238,7 @@ Signed-off-by: Yousong Zhou +#endif --- a/arch/mips/kernel/relocate_kernel.S +++ b/arch/mips/kernel/relocate_kernel.S -@@ -10,10 +10,12 @@ +@@ -10,10 +10,11 @@ #include #include #include @@ -248,11 +248,10 @@ Signed-off-by: Yousong Zhou -LEAF(relocate_new_kernel) +LEAF(kexec_relocate_new_kernel) -+ PTR_L a0, arg0 PTR_L a1, arg1 PTR_L a2, arg2 -@@ -98,7 +100,7 @@ done: +@@ -98,7 +99,7 @@ done: #endif /* jump to kexec_start_address */ j s1 @@ -261,23 +260,22 @@ Signed-off-by: Yousong Zhou #ifdef CONFIG_SMP /* -@@ -181,9 +183,15 @@ kexec_indirection_page: +@@ -177,8 +178,15 @@ EXPORT(kexec_indirection_page) PTR_WD 0 .size kexec_indirection_page, PTRSIZE -relocate_new_kernel_end: +kexec_argv_buf: + EXPORT(kexec_argv_buf) -+ .skip KEXEC_COMMAND_LINE_SIZE -+ .size kexec_argv_buf, KEXEC_COMMAND_LINE_SIZE ++ .skip KEXEC_COMMAND_LINE_SIZE ++ .size kexec_argv_buf, KEXEC_COMMAND_LINE_SIZE + +kexec_argv: + EXPORT(kexec_argv) -+ .skip KEXEC_ARGV_SIZE -+ .size kexec_argv, KEXEC_ARGV_SIZE ++ .skip KEXEC_ARGV_SIZE ++ .size kexec_argv, KEXEC_ARGV_SIZE --relocate_new_kernel_size: -- EXPORT(relocate_new_kernel_size) +-EXPORT(relocate_new_kernel_size) - PTR_WD relocate_new_kernel_end - relocate_new_kernel - .size relocate_new_kernel_size, PTRSIZE +kexec_relocate_new_kernel_end: diff --git a/target/linux/rockchip/patches-6.0/107-mmc-core-set-initial-signal-voltage-on-power-off.patch b/target/linux/rockchip/patches-6.0/107-mmc-core-set-initial-signal-voltage-on-power-off.patch index 454ce107f75aa2..9b1f0bb0aaba43 100644 --- a/target/linux/rockchip/patches-6.0/107-mmc-core-set-initial-signal-voltage-on-power-off.patch +++ b/target/linux/rockchip/patches-6.0/107-mmc-core-set-initial-signal-voltage-on-power-off.patch @@ -24,7 +24,7 @@ Signed-off-by: Jonas Karlman --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c -@@ -1360,6 +1360,8 @@ void mmc_power_off(struct mmc_host *host +@@ -1366,6 +1366,8 @@ void mmc_power_off(struct mmc_host *host mmc_pwrseq_power_off(host); From 21bab22afab1360775f38413482bbbb78ab0e1d8 Mon Sep 17 00:00:00 2001 From: lovehackintosh <92633080+lovehackintosh@users.noreply.github.com> Date: Sat, 26 Nov 2022 23:39:10 +0800 Subject: [PATCH 25/26] kernel: bump 5.15 to 5.15.80 (#10506) Manually rebase: pending-5.15/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch ath79/patches-5.15/910-unaligned_access_hacks.patch All other patches automatically rebased Co-authored-by: John Audia Signed-off-by: Liu Linhui Signed-off-by: Liu Linhui Co-authored-by: John Audia --- include/kernel-5.15 | 4 +- .../910-unaligned_access_hacks.patch | 58 ++++++++++++++++--- ...070-MMC-added-alternative-MMC-driver.patch | 2 +- ...-interface-in-mode6-for-18-bit-color.patch | 2 +- ...-Add-a-timing-for-the-Raspberry-Pi-7.patch | 4 +- ...nel-simple-add-Geekworm-MZP280-Panel.patch | 2 +- ...populate-supported_interfaces-member.patch | 2 +- ...net-dsa-consolidate-phylink-creation.patch | 8 +-- ...phylink_get_interfaces-with-phylink_.patch | 2 +- ...d-support-for-phylink-mac_select_pcs.patch | 4 +- ...-DSA-phylink-as-legacy_pre_march2020.patch | 2 +- ...-fix-DSA-mac_select_pcs-introduction.patch | 2 +- ...op-updating-master-MTU-from-master.c.patch | 6 +- ...l_mutex-when-calling-dsa_master_-set.patch | 2 +- ...switch-operations-for-tracking-the-m.patch | 2 +- ...icro-stmmac-move-queue-reset-to-dedi.patch | 4 +- ...icro-stmmac-move-dma-conf-to-dedicat.patch | 20 +++---- ...icro-stmmac-generate-stmmac-dma-conf.patch | 8 +-- .../780-usb-net-MeigLink_modem_support.patch | 6 +- .../hack-5.15/992-add-ndo-do-ioctl.patch | 2 +- ...t-command-line-parameters-from-users.patch | 13 ++--- .../patches-5.15/410-bt-mtk-serial-fix.patch | 2 +- ...fix-spi1-clock-dependency-for-mt7986.patch | 4 +- ...or-xiaomi-redmi-ax6000-spi-led-panel.patch | 4 +- .../951-add-mt7981-clock-support.patch | 33 +++-------- ...-initial-signal-voltage-on-power-off.patch | 2 +- 26 files changed, 112 insertions(+), 88 deletions(-) diff --git a/include/kernel-5.15 b/include/kernel-5.15 index a7d4d0ca72fd1c..a95ca029de1a72 100644 --- a/include/kernel-5.15 +++ b/include/kernel-5.15 @@ -1,2 +1,2 @@ -LINUX_VERSION-5.15 = .79 -LINUX_KERNEL_HASH-5.15.79 = cba39031dbc0eed0785b8afdc8c58cf23df83e47001b2354fa44486ae699c154 +LINUX_VERSION-5.15 = .80 +LINUX_KERNEL_HASH-5.15.80 = 3b321a6466d2021f60ed8d4e33bba21db2f23efc2ddd2d9fb775393d9afdfd4d diff --git a/target/linux/ath79/patches-5.15/910-unaligned_access_hacks.patch b/target/linux/ath79/patches-5.15/910-unaligned_access_hacks.patch index e398bca9b67e4b..d8f61de8ebe21d 100644 --- a/target/linux/ath79/patches-5.15/910-unaligned_access_hacks.patch +++ b/target/linux/ath79/patches-5.15/910-unaligned_access_hacks.patch @@ -1,3 +1,47 @@ +From: Felix Fietkau +Subject: [PATCH] ar71xx: fix unaligned access in a few more places + +SVN-Revision: 35130 +--- + arch/mips/include/asm/checksum.h | 83 +++--------------- + include/uapi/linux/ip.h | 2 +- + include/uapi/linux/ipv6.h | 2 +- + include/uapi/linux/tcp.h | 4 ++-- + include/uapi/linux/udp.h | 2 +- + net/netfilter/nf_conntrack_core.c | 4 ++-- + include/uapi/linux/icmp.h | 2 +- + include/uapi/linux/in6.h | 2 +- + net/ipv6/tcp_ipv6.c | 9 +++-- + net/ipv6/datagram.c | 6 ++-- + net/ipv6/exthdrs.c | 2 +- + include/linux/types.h | 5 +++ + net/ipv4/af_inet.c | 4 ++-- + net/ipv4/tcp_output.c | 69 +++++++++-------- + include/uapi/linux/igmp.h | 8 +++--- + net/core/flow_dissector.c | 2 +- + include/uapi/linux/icmpv6.h | 2 +- + include/net/ndisc.h | 10 ++++---- + net/sched/cls_u32.c | 6 +++--- + net/ipv6/ip6_offload.c | 2 +- + include/net/addrconf.h | 2 +- + include/net/inet_ecn.h | 4 ++-- + include/net/ipv6.h | 23 +++++---- + include/net/secure_seq.h | 1 + + include/uapi/linux/in.h | 2 +- + net/ipv6/ip6_fib.h | 2 +- + net/netfilter/nf_conntrack_proto_tcp.c | 2 +- + net/xfrm/xfrm_input.c | 4 ++-- + net/ipv4/tcp_input.c | 12 ++++--- + include/uapi/linux/if_pppox.h | 1 + + net/ipv6/netfilter/nf_log_ipv6.c | 4 ++-- + include/net/neighbour.h | 6 +++-- + include/uapi/linux/netfilter_arp/arp_tables.h | 2 +- + net/core/utils.c | 10 +++++-- + include/linux/etherdevice.h | 11 ++++--- + net/ipv4/tcp_offload.c | 6 +++--- + net/ipv6/netfilter/ip6table_mangle.c | 4 ++-- + 37 file changed, 171 insertions(+), 141 deletions(-) + --- a/arch/mips/include/asm/checksum.h +++ b/arch/mips/include/asm/checksum.h @@ -100,26 +100,30 @@ static inline __sum16 ip_fast_csum(const @@ -118,9 +162,9 @@ --- a/include/uapi/linux/ip.h +++ b/include/uapi/linux/ip.h -@@ -103,7 +103,7 @@ struct iphdr { - __be32 saddr; - __be32 daddr; +@@ -105,7 +105,7 @@ struct iphdr { + __be32 daddr; + ); /*The options start here. */ -}; +} __attribute__((packed, aligned(2))); @@ -129,10 +173,10 @@ struct ip_auth_hdr { --- a/include/uapi/linux/ipv6.h +++ b/include/uapi/linux/ipv6.h -@@ -132,7 +132,7 @@ struct ipv6hdr { - - struct in6_addr saddr; - struct in6_addr daddr; +@@ -134,7 +134,7 @@ struct ipv6hdr { + struct in6_addr saddr; + struct in6_addr daddr; + ); -}; +} __attribute__((packed, aligned(2))); diff --git a/target/linux/bcm27xx/patches-5.15/950-0070-MMC-added-alternative-MMC-driver.patch b/target/linux/bcm27xx/patches-5.15/950-0070-MMC-added-alternative-MMC-driver.patch index 4548083000f89d..3e2d3135c5c8cd 100644 --- a/target/linux/bcm27xx/patches-5.15/950-0070-MMC-added-alternative-MMC-driver.patch +++ b/target/linux/bcm27xx/patches-5.15/950-0070-MMC-added-alternative-MMC-driver.patch @@ -291,7 +291,7 @@ bcm2835-mmc: uninitialized_var is no more goto out; --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c -@@ -1801,7 +1801,8 @@ EXPORT_SYMBOL(mmc_erase); +@@ -1807,7 +1807,8 @@ EXPORT_SYMBOL(mmc_erase); int mmc_can_erase(struct mmc_card *card) { diff --git a/target/linux/bcm27xx/patches-5.15/950-0421-Support-RPi-DPI-interface-in-mode6-for-18-bit-color.patch b/target/linux/bcm27xx/patches-5.15/950-0421-Support-RPi-DPI-interface-in-mode6-for-18-bit-color.patch index 86b9a12c5920da..ef115fe2f5aaf9 100644 --- a/target/linux/bcm27xx/patches-5.15/950-0421-Support-RPi-DPI-interface-in-mode6-for-18-bit-color.patch +++ b/target/linux/bcm27xx/patches-5.15/950-0421-Support-RPi-DPI-interface-in-mode6-for-18-bit-color.patch @@ -157,7 +157,7 @@ Signed-off-by: Joerg Quinten static const struct drm_display_mode innolux_at070tn92_mode = { .clock = 33333, .hdisplay = 800, -@@ -4660,6 +4692,9 @@ static const struct of_device_id platfor +@@ -4662,6 +4694,9 @@ static const struct of_device_id platfor .compatible = "innolux,at043tn24", .data = &innolux_at043tn24, }, { diff --git a/target/linux/bcm27xx/patches-5.15/950-0479-drm-panel-simple-Add-a-timing-for-the-Raspberry-Pi-7.patch b/target/linux/bcm27xx/patches-5.15/950-0479-drm-panel-simple-Add-a-timing-for-the-Raspberry-Pi-7.patch index 62b5c2c7acd1de..21aa2168ad9d8b 100644 --- a/target/linux/bcm27xx/patches-5.15/950-0479-drm-panel-simple-Add-a-timing-for-the-Raspberry-Pi-7.patch +++ b/target/linux/bcm27xx/patches-5.15/950-0479-drm-panel-simple-Add-a-timing-for-the-Raspberry-Pi-7.patch @@ -15,7 +15,7 @@ Signed-off-by: Dave Stevenson --- a/drivers/gpu/drm/panel/panel-simple.c +++ b/drivers/gpu/drm/panel/panel-simple.c -@@ -3759,6 +3759,31 @@ static const struct panel_desc qishenglo +@@ -3761,6 +3761,31 @@ static const struct panel_desc qishenglo .connector_type = DRM_MODE_CONNECTOR_DPI, }; @@ -47,7 +47,7 @@ Signed-off-by: Dave Stevenson static const struct display_timing rocktech_rk070er9427_timing = { .pixelclock = { 26400000, 33300000, 46800000 }, .hactive = { 800, 800, 800 }, -@@ -4839,6 +4864,9 @@ static const struct of_device_id platfor +@@ -4841,6 +4866,9 @@ static const struct of_device_id platfor .compatible = "qishenglong,gopher2b-lcd", .data = &qishenglong_gopher2b_lcd, }, { diff --git a/target/linux/bcm27xx/patches-5.15/950-0686-drm-panel-simple-add-Geekworm-MZP280-Panel.patch b/target/linux/bcm27xx/patches-5.15/950-0686-drm-panel-simple-add-Geekworm-MZP280-Panel.patch index b71b9da8d79e32..3b7ec4bf99d923 100644 --- a/target/linux/bcm27xx/patches-5.15/950-0686-drm-panel-simple-add-Geekworm-MZP280-Panel.patch +++ b/target/linux/bcm27xx/patches-5.15/950-0686-drm-panel-simple-add-Geekworm-MZP280-Panel.patch @@ -46,7 +46,7 @@ Acked-by: Maxime Ripard static const struct drm_display_mode giantplus_gpg482739qs5_mode = { .clock = 9000, .hdisplay = 480, -@@ -4702,6 +4728,9 @@ static const struct of_device_id platfor +@@ -4704,6 +4730,9 @@ static const struct of_device_id platfor .compatible = "friendlyarm,hd702e", .data = &friendlyarm_hd702e, }, { diff --git a/target/linux/generic/backport-5.15/703-03-v5.16-net-dsa-populate-supported_interfaces-member.patch b/target/linux/generic/backport-5.15/703-03-v5.16-net-dsa-populate-supported_interfaces-member.patch index 83d1f7ee7c0ab5..b10e6da0e9a79d 100644 --- a/target/linux/generic/backport-5.15/703-03-v5.16-net-dsa-populate-supported_interfaces-member.patch +++ b/target/linux/generic/backport-5.15/703-03-v5.16-net-dsa-populate-supported_interfaces-member.patch @@ -37,7 +37,7 @@ Signed-off-by: David S. Miller struct phylink_link_state *state); --- a/net/dsa/port.c +++ b/net/dsa/port.c -@@ -1172,6 +1172,10 @@ static int dsa_port_phylink_register(str +@@ -1188,6 +1188,10 @@ static int dsa_port_phylink_register(str dp->pl_config.type = PHYLINK_DEV; dp->pl_config.pcs_poll = ds->pcs_poll; diff --git a/target/linux/generic/backport-5.15/703-04-v5.17-net-dsa-consolidate-phylink-creation.patch b/target/linux/generic/backport-5.15/703-04-v5.17-net-dsa-consolidate-phylink-creation.patch index 8b58c8331230be..9b67a8a5185781 100644 --- a/target/linux/generic/backport-5.15/703-04-v5.17-net-dsa-consolidate-phylink-creation.patch +++ b/target/linux/generic/backport-5.15/703-04-v5.17-net-dsa-consolidate-phylink-creation.patch @@ -21,7 +21,7 @@ Signed-off-by: Jakub Kicinski --- a/net/dsa/dsa_priv.h +++ b/net/dsa/dsa_priv.h -@@ -260,13 +260,13 @@ int dsa_port_mrp_add_ring_role(const str +@@ -261,13 +261,13 @@ int dsa_port_mrp_add_ring_role(const str const struct switchdev_obj_ring_role_mrp *mrp); int dsa_port_mrp_del_ring_role(const struct dsa_port *dp, const struct switchdev_obj_ring_role_mrp *mrp); @@ -38,7 +38,7 @@ Signed-off-by: Jakub Kicinski const struct net_device *dev) --- a/net/dsa/port.c +++ b/net/dsa/port.c -@@ -1076,7 +1076,7 @@ static void dsa_port_phylink_mac_link_up +@@ -1092,7 +1092,7 @@ static void dsa_port_phylink_mac_link_up speed, duplex, tx_pause, rx_pause); } @@ -47,7 +47,7 @@ Signed-off-by: Jakub Kicinski .validate = dsa_port_phylink_validate, .mac_pcs_get_state = dsa_port_phylink_mac_pcs_get_state, .mac_config = dsa_port_phylink_mac_config, -@@ -1085,6 +1085,30 @@ const struct phylink_mac_ops dsa_port_ph +@@ -1101,6 +1101,30 @@ const struct phylink_mac_ops dsa_port_ph .mac_link_up = dsa_port_phylink_mac_link_up, }; @@ -78,7 +78,7 @@ Signed-off-by: Jakub Kicinski static int dsa_port_setup_phy_of(struct dsa_port *dp, bool enable) { struct dsa_switch *ds = dp->ds; -@@ -1161,27 +1185,15 @@ static int dsa_port_phylink_register(str +@@ -1177,27 +1201,15 @@ static int dsa_port_phylink_register(str { struct dsa_switch *ds = dp->ds; struct device_node *port_dn = dp->dn; diff --git a/target/linux/generic/backport-5.15/703-05-v5.17-net-dsa-replace-phylink_get_interfaces-with-phylink_.patch b/target/linux/generic/backport-5.15/703-05-v5.17-net-dsa-replace-phylink_get_interfaces-with-phylink_.patch index 4cea5994da2dc5..d70b9aa6a47195 100644 --- a/target/linux/generic/backport-5.15/703-05-v5.17-net-dsa-replace-phylink_get_interfaces-with-phylink_.patch +++ b/target/linux/generic/backport-5.15/703-05-v5.17-net-dsa-replace-phylink_get_interfaces-with-phylink_.patch @@ -37,7 +37,7 @@ Signed-off-by: Jakub Kicinski struct phylink_link_state *state); --- a/net/dsa/port.c +++ b/net/dsa/port.c -@@ -1095,9 +1095,8 @@ int dsa_port_phylink_create(struct dsa_p +@@ -1111,9 +1111,8 @@ int dsa_port_phylink_create(struct dsa_p if (err) mode = PHY_INTERFACE_MODE_NA; diff --git a/target/linux/generic/backport-5.15/703-06-v5.18-net-dsa-add-support-for-phylink-mac_select_pcs.patch b/target/linux/generic/backport-5.15/703-06-v5.18-net-dsa-add-support-for-phylink-mac_select_pcs.patch index a28d14d27a3c2a..2af5cb9d9db7b7 100644 --- a/target/linux/generic/backport-5.15/703-06-v5.18-net-dsa-add-support-for-phylink-mac_select_pcs.patch +++ b/target/linux/generic/backport-5.15/703-06-v5.18-net-dsa-add-support-for-phylink-mac_select_pcs.patch @@ -28,7 +28,7 @@ Signed-off-by: David S. Miller void (*phylink_mac_config)(struct dsa_switch *ds, int port, --- a/net/dsa/port.c +++ b/net/dsa/port.c -@@ -1012,6 +1012,20 @@ static void dsa_port_phylink_mac_pcs_get +@@ -1028,6 +1028,20 @@ static void dsa_port_phylink_mac_pcs_get } } @@ -49,7 +49,7 @@ Signed-off-by: David S. Miller static void dsa_port_phylink_mac_config(struct phylink_config *config, unsigned int mode, const struct phylink_link_state *state) -@@ -1078,6 +1092,7 @@ static void dsa_port_phylink_mac_link_up +@@ -1094,6 +1108,7 @@ static void dsa_port_phylink_mac_link_up static const struct phylink_mac_ops dsa_port_phylink_mac_ops = { .validate = dsa_port_phylink_validate, diff --git a/target/linux/generic/backport-5.15/703-13-v5.17-net-dsa-mark-DSA-phylink-as-legacy_pre_march2020.patch b/target/linux/generic/backport-5.15/703-13-v5.17-net-dsa-mark-DSA-phylink-as-legacy_pre_march2020.patch index dff0db5db659ff..849881942e1a03 100644 --- a/target/linux/generic/backport-5.15/703-13-v5.17-net-dsa-mark-DSA-phylink-as-legacy_pre_march2020.patch +++ b/target/linux/generic/backport-5.15/703-13-v5.17-net-dsa-mark-DSA-phylink-as-legacy_pre_march2020.patch @@ -20,7 +20,7 @@ Signed-off-by: Jakub Kicinski --- a/net/dsa/port.c +++ b/net/dsa/port.c -@@ -1110,6 +1110,13 @@ int dsa_port_phylink_create(struct dsa_p +@@ -1126,6 +1126,13 @@ int dsa_port_phylink_create(struct dsa_p if (err) mode = PHY_INTERFACE_MODE_NA; diff --git a/target/linux/generic/backport-5.15/703-15-v5.18-net-phy-phylink-fix-DSA-mac_select_pcs-introduction.patch b/target/linux/generic/backport-5.15/703-15-v5.18-net-phy-phylink-fix-DSA-mac_select_pcs-introduction.patch index 4ab90fafe1da76..9e5061aaed832b 100644 --- a/target/linux/generic/backport-5.15/703-15-v5.18-net-phy-phylink-fix-DSA-mac_select_pcs-introduction.patch +++ b/target/linux/generic/backport-5.15/703-15-v5.18-net-phy-phylink-fix-DSA-mac_select_pcs-introduction.patch @@ -76,7 +76,7 @@ Signed-off-by: Jakub Kicinski if (iface == PHY_INTERFACE_MODE_MOCA) --- a/net/dsa/port.c +++ b/net/dsa/port.c -@@ -1017,8 +1017,8 @@ dsa_port_phylink_mac_select_pcs(struct p +@@ -1033,8 +1033,8 @@ dsa_port_phylink_mac_select_pcs(struct p phy_interface_t interface) { struct dsa_port *dp = container_of(config, struct dsa_port, pl_config); diff --git a/target/linux/generic/backport-5.15/765-v5.17-03-net-next-net-dsa-stop-updating-master-MTU-from-master.c.patch b/target/linux/generic/backport-5.15/765-v5.17-03-net-next-net-dsa-stop-updating-master-MTU-from-master.c.patch index d1126de5dd0770..6c7aad692885e7 100644 --- a/target/linux/generic/backport-5.15/765-v5.17-03-net-next-net-dsa-stop-updating-master-MTU-from-master.c.patch +++ b/target/linux/generic/backport-5.15/765-v5.17-03-net-next-net-dsa-stop-updating-master-MTU-from-master.c.patch @@ -37,7 +37,7 @@ Signed-off-by: David S. Miller --- a/net/dsa/master.c +++ b/net/dsa/master.c -@@ -330,28 +330,13 @@ static const struct attribute_group dsa_ +@@ -329,28 +329,13 @@ static const struct attribute_group dsa_ .attrs = dsa_slave_attrs, }; @@ -67,7 +67,7 @@ Signed-off-by: David S. Miller /* The DSA master must use SET_NETDEV_DEV for this to work. */ consumer_link = device_link_add(ds->dev, dev->dev.parent, -@@ -361,13 +346,6 @@ int dsa_master_setup(struct net_device * +@@ -360,13 +345,6 @@ int dsa_master_setup(struct net_device * "Failed to create a device link to DSA switch %s\n", dev_name(ds->dev)); @@ -81,7 +81,7 @@ Signed-off-by: David S. Miller /* If we use a tagging format that doesn't have an ethertype * field, make sure that all packets from this point on get * sent to the tag format's receive function. -@@ -405,7 +383,6 @@ void dsa_master_teardown(struct net_devi +@@ -404,7 +382,6 @@ void dsa_master_teardown(struct net_devi sysfs_remove_group(&dev->dev.kobj, &dsa_group); dsa_netdev_ops_set(dev, NULL); dsa_master_ethtool_teardown(dev); diff --git a/target/linux/generic/backport-5.15/765-v5.17-04-net-next-net-dsa-hold-rtnl_mutex-when-calling-dsa_master_-set.patch b/target/linux/generic/backport-5.15/765-v5.17-04-net-next-net-dsa-hold-rtnl_mutex-when-calling-dsa_master_-set.patch index 67d434006b7721..e331226fc41d09 100644 --- a/target/linux/generic/backport-5.15/765-v5.17-04-net-next-net-dsa-hold-rtnl_mutex-when-calling-dsa_master_-set.patch +++ b/target/linux/generic/backport-5.15/765-v5.17-04-net-next-net-dsa-hold-rtnl_mutex-when-calling-dsa_master_-set.patch @@ -64,7 +64,7 @@ Signed-off-by: David S. Miller static int dsa_tree_setup_lags(struct dsa_switch_tree *dst) --- a/net/dsa/master.c +++ b/net/dsa/master.c -@@ -267,9 +267,9 @@ static void dsa_master_set_promiscuity(s +@@ -266,9 +266,9 @@ static void dsa_master_set_promiscuity(s if (!ops->promisc_on_master) return; diff --git a/target/linux/generic/backport-5.15/766-v5.18-01-net-dsa-provide-switch-operations-for-tracking-the-m.patch b/target/linux/generic/backport-5.15/766-v5.18-01-net-dsa-provide-switch-operations-for-tracking-the-m.patch index 7c6a3a3f8d770d..bffdcb28819fbf 100644 --- a/target/linux/generic/backport-5.15/766-v5.18-01-net-dsa-provide-switch-operations-for-tracking-the-m.patch +++ b/target/linux/generic/backport-5.15/766-v5.18-01-net-dsa-provide-switch-operations-for-tracking-the-m.patch @@ -160,7 +160,7 @@ Signed-off-by: David S. Miller struct dsa_switchdev_event_work { struct dsa_switch *ds; int port; -@@ -548,6 +555,12 @@ int dsa_tree_change_tag_proto(struct dsa +@@ -549,6 +556,12 @@ int dsa_tree_change_tag_proto(struct dsa struct net_device *master, const struct dsa_device_ops *tag_ops, const struct dsa_device_ops *old_tag_ops); diff --git a/target/linux/generic/backport-5.15/775-v6.0-01-net-ethernet-stmicro-stmmac-move-queue-reset-to-dedi.patch b/target/linux/generic/backport-5.15/775-v6.0-01-net-ethernet-stmicro-stmmac-move-queue-reset-to-dedi.patch index b6b94ba6c25197..78a5494bf252a0 100644 --- a/target/linux/generic/backport-5.15/775-v6.0-01-net-ethernet-stmicro-stmmac-move-queue-reset-to-dedi.patch +++ b/target/linux/generic/backport-5.15/775-v6.0-01-net-ethernet-stmicro-stmmac-move-queue-reset-to-dedi.patch @@ -87,7 +87,7 @@ Signed-off-by: Jakub Kicinski stmmac_clear_tx_descriptors(priv, queue); stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, -@@ -7387,6 +7382,25 @@ int stmmac_suspend(struct device *dev) +@@ -7390,6 +7385,25 @@ int stmmac_suspend(struct device *dev) } EXPORT_SYMBOL_GPL(stmmac_suspend); @@ -113,7 +113,7 @@ Signed-off-by: Jakub Kicinski /** * stmmac_reset_queues_param - reset queue parameters * @priv: device pointer -@@ -7397,22 +7411,11 @@ static void stmmac_reset_queues_param(st +@@ -7400,22 +7414,11 @@ static void stmmac_reset_queues_param(st u32 tx_cnt = priv->plat->tx_queues_to_use; u32 queue; diff --git a/target/linux/generic/backport-5.15/775-v6.0-03-net-ethernet-stmicro-stmmac-move-dma-conf-to-dedicat.patch b/target/linux/generic/backport-5.15/775-v6.0-03-net-ethernet-stmicro-stmmac-move-dma-conf-to-dedicat.patch index ec3607feeb457d..5cfb14aaab1bb2 100644 --- a/target/linux/generic/backport-5.15/775-v6.0-03-net-ethernet-stmicro-stmmac-move-dma-conf-to-dedicat.patch +++ b/target/linux/generic/backport-5.15/775-v6.0-03-net-ethernet-stmicro-stmmac-move-dma-conf-to-dedicat.patch @@ -1143,7 +1143,7 @@ Signed-off-by: Jakub Kicinski struct stmmac_channel *ch = &priv->channel[queue]; unsigned long flags; int ret; -@@ -6493,7 +6497,7 @@ void stmmac_xdp_release(struct net_devic +@@ -6496,7 +6500,7 @@ void stmmac_xdp_release(struct net_devic stmmac_disable_all_queues(priv); for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) @@ -1152,7 +1152,7 @@ Signed-off-by: Jakub Kicinski /* Free the IRQ lines */ stmmac_free_irq(dev, REQ_IRQ_ERR_ALL, 0); -@@ -6552,7 +6556,7 @@ int stmmac_xdp_open(struct net_device *d +@@ -6555,7 +6559,7 @@ int stmmac_xdp_open(struct net_device *d /* DMA RX Channel Configuration */ for (chan = 0; chan < rx_cnt; chan++) { @@ -1161,7 +1161,7 @@ Signed-off-by: Jakub Kicinski stmmac_init_rx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, rx_q->dma_rx_phy, chan); -@@ -6570,7 +6574,7 @@ int stmmac_xdp_open(struct net_device *d +@@ -6573,7 +6577,7 @@ int stmmac_xdp_open(struct net_device *d rx_q->queue_index); } else { stmmac_set_dma_bfsize(priv, priv->ioaddr, @@ -1170,7 +1170,7 @@ Signed-off-by: Jakub Kicinski rx_q->queue_index); } -@@ -6579,7 +6583,7 @@ int stmmac_xdp_open(struct net_device *d +@@ -6582,7 +6586,7 @@ int stmmac_xdp_open(struct net_device *d /* DMA TX Channel Configuration */ for (chan = 0; chan < tx_cnt; chan++) { @@ -1179,7 +1179,7 @@ Signed-off-by: Jakub Kicinski stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, tx_q->dma_tx_phy, chan); -@@ -6612,7 +6616,7 @@ int stmmac_xdp_open(struct net_device *d +@@ -6615,7 +6619,7 @@ int stmmac_xdp_open(struct net_device *d irq_error: for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) @@ -1188,7 +1188,7 @@ Signed-off-by: Jakub Kicinski stmmac_hw_teardown(dev); init_error: -@@ -6639,8 +6643,8 @@ int stmmac_xsk_wakeup(struct net_device +@@ -6642,8 +6646,8 @@ int stmmac_xsk_wakeup(struct net_device queue >= priv->plat->tx_queues_to_use) return -EINVAL; @@ -1199,7 +1199,7 @@ Signed-off-by: Jakub Kicinski ch = &priv->channel[queue]; if (!rx_q->xsk_pool && !tx_q->xsk_pool) -@@ -6896,8 +6900,8 @@ int stmmac_reinit_ringparam(struct net_d +@@ -6899,8 +6903,8 @@ int stmmac_reinit_ringparam(struct net_d if (netif_running(dev)) stmmac_release(dev); @@ -1210,7 +1210,7 @@ Signed-off-by: Jakub Kicinski if (netif_running(dev)) ret = stmmac_open(dev); -@@ -7333,7 +7337,7 @@ int stmmac_suspend(struct device *dev) +@@ -7336,7 +7340,7 @@ int stmmac_suspend(struct device *dev) stmmac_disable_all_queues(priv); for (chan = 0; chan < priv->plat->tx_queues_to_use; chan++) @@ -1219,7 +1219,7 @@ Signed-off-by: Jakub Kicinski if (priv->eee_enabled) { priv->tx_path_in_lpi_mode = false; -@@ -7384,7 +7388,7 @@ EXPORT_SYMBOL_GPL(stmmac_suspend); +@@ -7387,7 +7391,7 @@ EXPORT_SYMBOL_GPL(stmmac_suspend); static void stmmac_reset_rx_queue(struct stmmac_priv *priv, u32 queue) { @@ -1228,7 +1228,7 @@ Signed-off-by: Jakub Kicinski rx_q->cur_rx = 0; rx_q->dirty_rx = 0; -@@ -7392,7 +7396,7 @@ static void stmmac_reset_rx_queue(struct +@@ -7395,7 +7399,7 @@ static void stmmac_reset_rx_queue(struct static void stmmac_reset_tx_queue(struct stmmac_priv *priv, u32 queue) { diff --git a/target/linux/generic/backport-5.15/775-v6.0-04-net-ethernet-stmicro-stmmac-generate-stmmac-dma-conf.patch b/target/linux/generic/backport-5.15/775-v6.0-04-net-ethernet-stmicro-stmmac-generate-stmmac-dma-conf.patch index 0635693d55f89f..4c41d3c7433fe4 100644 --- a/target/linux/generic/backport-5.15/775-v6.0-04-net-ethernet-stmicro-stmmac-generate-stmmac-dma-conf.patch +++ b/target/linux/generic/backport-5.15/775-v6.0-04-net-ethernet-stmicro-stmmac-generate-stmmac-dma-conf.patch @@ -1115,7 +1115,7 @@ Signed-off-by: Jakub Kicinski stmmac_init_tx_chan(priv, priv->ioaddr, priv->plat->dma_cfg, tx_q->dma_tx_phy, tx_q->queue_index); -@@ -6506,7 +6622,7 @@ void stmmac_xdp_release(struct net_devic +@@ -6509,7 +6625,7 @@ void stmmac_xdp_release(struct net_devic stmmac_stop_all_dma(priv); /* Release and free the Rx/Tx resources */ @@ -1124,7 +1124,7 @@ Signed-off-by: Jakub Kicinski /* Disable the MAC Rx/Tx */ stmmac_mac_set(priv, priv->ioaddr, false); -@@ -6531,14 +6647,14 @@ int stmmac_xdp_open(struct net_device *d +@@ -6534,14 +6650,14 @@ int stmmac_xdp_open(struct net_device *d u32 chan; int ret; @@ -1141,7 +1141,7 @@ Signed-off-by: Jakub Kicinski if (ret < 0) { netdev_err(dev, "%s: DMA descriptors initialization failed\n", __func__); -@@ -6620,7 +6736,7 @@ irq_error: +@@ -6623,7 +6739,7 @@ irq_error: stmmac_hw_teardown(dev); init_error: @@ -1150,7 +1150,7 @@ Signed-off-by: Jakub Kicinski dma_desc_error: return ret; } -@@ -7479,7 +7595,7 @@ int stmmac_resume(struct device *dev) +@@ -7482,7 +7598,7 @@ int stmmac_resume(struct device *dev) stmmac_reset_queues_param(priv); stmmac_free_tx_skbufs(priv); diff --git a/target/linux/generic/hack-5.15/780-usb-net-MeigLink_modem_support.patch b/target/linux/generic/hack-5.15/780-usb-net-MeigLink_modem_support.patch index 34a741b1c7f04d..eb11d9b700b408 100644 --- a/target/linux/generic/hack-5.15/780-usb-net-MeigLink_modem_support.patch +++ b/target/linux/generic/hack-5.15/780-usb-net-MeigLink_modem_support.patch @@ -20,8 +20,8 @@ Subject: [PATCH] net/usb/qmi_wwan: add MeigLink modem support {QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */ --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c -@@ -243,6 +243,8 @@ static void option_instat_callback(struc - #define UBLOX_PRODUCT_R6XX 0x90fa +@@ -244,6 +244,8 @@ static void option_instat_callback(struc + #define UBLOX_PRODUCT_R410M 0x90b2 /* These Yuga products use Qualcomm's vendor ID */ #define YUGA_PRODUCT_CLM920_NC5 0x9625 +/* These MeigLink products use Qualcomm's vendor ID */ @@ -29,7 +29,7 @@ Subject: [PATCH] net/usb/qmi_wwan: add MeigLink modem support #define QUECTEL_VENDOR_ID 0x2c7c /* These Quectel products use Quectel's vendor ID */ -@@ -1143,6 +1145,11 @@ static const struct usb_device_id option +@@ -1155,6 +1157,11 @@ static const struct usb_device_id option .driver_info = ZLP }, { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96), .driver_info = RSVD(4) }, diff --git a/target/linux/generic/hack-5.15/992-add-ndo-do-ioctl.patch b/target/linux/generic/hack-5.15/992-add-ndo-do-ioctl.patch index da206e4b46120e..0df54ea22ea7ee 100644 --- a/target/linux/generic/hack-5.15/992-add-ndo-do-ioctl.patch +++ b/target/linux/generic/hack-5.15/992-add-ndo-do-ioctl.patch @@ -1,6 +1,6 @@ --- a/net/wireless/wext-core.c +++ b/net/wireless/wext-core.c -@@ -956,6 +956,9 @@ static int wireless_process_ioctl(struct +@@ -959,6 +959,9 @@ static int wireless_process_ioctl(struct else if (private) return private(dev, iwr, cmd, info, handler); } diff --git a/target/linux/generic/pending-5.15/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch b/target/linux/generic/pending-5.15/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch index 3a5f5a238df6d8..1c75eff1ba4c2e 100644 --- a/target/linux/generic/pending-5.15/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch +++ b/target/linux/generic/pending-5.15/330-MIPS-kexec-Accept-command-line-parameters-from-users.patch @@ -260,23 +260,22 @@ Signed-off-by: Yousong Zhou #ifdef CONFIG_SMP /* -@@ -181,9 +182,15 @@ kexec_indirection_page: +@@ -177,8 +178,15 @@ EXPORT(kexec_indirection_page) PTR_WD 0 .size kexec_indirection_page, PTRSIZE -relocate_new_kernel_end: +kexec_argv_buf: + EXPORT(kexec_argv_buf) -+ .skip KEXEC_COMMAND_LINE_SIZE -+ .size kexec_argv_buf, KEXEC_COMMAND_LINE_SIZE ++ .skip KEXEC_COMMAND_LINE_SIZE ++ .size kexec_argv_buf, KEXEC_COMMAND_LINE_SIZE + +kexec_argv: + EXPORT(kexec_argv) -+ .skip KEXEC_ARGV_SIZE -+ .size kexec_argv, KEXEC_ARGV_SIZE ++ .skip KEXEC_ARGV_SIZE ++ .size kexec_argv, KEXEC_ARGV_SIZE --relocate_new_kernel_size: -- EXPORT(relocate_new_kernel_size) +-EXPORT(relocate_new_kernel_size) - PTR_WD relocate_new_kernel_end - relocate_new_kernel - .size relocate_new_kernel_size, PTRSIZE +kexec_relocate_new_kernel_end: diff --git a/target/linux/mediatek/patches-5.15/410-bt-mtk-serial-fix.patch b/target/linux/mediatek/patches-5.15/410-bt-mtk-serial-fix.patch index 69647e075ae9b3..11922fe740abd3 100644 --- a/target/linux/mediatek/patches-5.15/410-bt-mtk-serial-fix.patch +++ b/target/linux/mediatek/patches-5.15/410-bt-mtk-serial-fix.patch @@ -19,7 +19,7 @@ }, [PORT_NPCM] = { .name = "Nuvoton 16550", -@@ -2753,6 +2753,11 @@ serial8250_do_set_termios(struct uart_po +@@ -2756,6 +2756,11 @@ serial8250_do_set_termios(struct uart_po unsigned long flags; unsigned int baud, quot, frac = 0; diff --git a/target/linux/mediatek/patches-5.15/930-spi-mediatek-fix-spi1-clock-dependency-for-mt7986.patch b/target/linux/mediatek/patches-5.15/930-spi-mediatek-fix-spi1-clock-dependency-for-mt7986.patch index bcb716ab2c37d8..904f2ef3a2ff7b 100644 --- a/target/linux/mediatek/patches-5.15/930-spi-mediatek-fix-spi1-clock-dependency-for-mt7986.patch +++ b/target/linux/mediatek/patches-5.15/930-spi-mediatek-fix-spi1-clock-dependency-for-mt7986.patch @@ -1,6 +1,6 @@ --- a/drivers/spi/spi-mt65xx.c +++ b/drivers/spi/spi-mt65xx.c -@@ -1223,10 +1223,16 @@ +@@ -1223,10 +1223,16 @@ static int mtk_spi_probe(struct platform goto err_disable_spi_hclk; } @@ -18,7 +18,7 @@ } mdata->spi_clk_hz = clk_get_rate(mdata->spi_clk); -@@ -1277,6 +1283,8 @@ +@@ -1277,6 +1283,8 @@ static int mtk_spi_probe(struct platform err_disable_runtime_pm: pm_runtime_disable(&pdev->dev); diff --git a/target/linux/mediatek/patches-5.15/931-led-mediatek-add-support-for-xiaomi-redmi-ax6000-spi-led-panel.patch b/target/linux/mediatek/patches-5.15/931-led-mediatek-add-support-for-xiaomi-redmi-ax6000-spi-led-panel.patch index 38b33dcf984674..1c9043d3bd332e 100644 --- a/target/linux/mediatek/patches-5.15/931-led-mediatek-add-support-for-xiaomi-redmi-ax6000-spi-led-panel.patch +++ b/target/linux/mediatek/patches-5.15/931-led-mediatek-add-support-for-xiaomi-redmi-ax6000-spi-led-panel.patch @@ -1,6 +1,6 @@ --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile -@@ -93,6 +93,7 @@ +@@ -93,6 +93,7 @@ obj-$(CONFIG_LEDS_CR0014114) += leds-cr obj-$(CONFIG_LEDS_DAC124S085) += leds-dac124s085.o obj-$(CONFIG_LEDS_EL15203000) += leds-el15203000.o obj-$(CONFIG_LEDS_SPI_BYTE) += leds-spi-byte.o @@ -10,7 +10,7 @@ obj-$(CONFIG_LEDS_USER) += uleds.o --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig -@@ -818,6 +818,16 @@ +@@ -818,6 +818,16 @@ config LEDS_SPI_BYTE for controlling the brightness. Currently the following controller is supported: Ubiquiti airCube ISP microcontroller based LED controller. diff --git a/target/linux/mediatek/patches-5.15/951-add-mt7981-clock-support.patch b/target/linux/mediatek/patches-5.15/951-add-mt7981-clock-support.patch index 330ddbc19cbf21..1587c803e13f2f 100644 --- a/target/linux/mediatek/patches-5.15/951-add-mt7981-clock-support.patch +++ b/target/linux/mediatek/patches-5.15/951-add-mt7981-clock-support.patch @@ -1,8 +1,6 @@ -diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig -index 843cea0c7a44..a558c0e1b353 100644 --- a/drivers/clk/mediatek/Kconfig +++ b/drivers/clk/mediatek/Kconfig -@@ -381,6 +381,23 @@ config COMMON_CLK_MT7629_HIFSYS +@@ -344,6 +344,23 @@ config COMMON_CLK_MT7629_HIFSYS This driver supports MediaTek MT7629 HIFSYS clocks providing to PCI-E and USB. @@ -26,11 +24,9 @@ index 843cea0c7a44..a558c0e1b353 100644 config COMMON_CLK_MT7986 bool "Clock driver for MediaTek MT7986" depends on ARCH_MEDIATEK || COMPILE_TEST -diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile -index ea3b73240303..be9ab51fa6d5 100644 --- a/drivers/clk/mediatek/Makefile +++ b/drivers/clk/mediatek/Makefile -@@ -52,6 +52,10 @@ obj-$(CONFIG_COMMON_CLK_MT7622_AUDSYS) += clk-mt7622-aud.o +@@ -46,6 +46,10 @@ obj-$(CONFIG_COMMON_CLK_MT7622_AUDSYS) + obj-$(CONFIG_COMMON_CLK_MT7629) += clk-mt7629.o obj-$(CONFIG_COMMON_CLK_MT7629_ETHSYS) += clk-mt7629-eth.o obj-$(CONFIG_COMMON_CLK_MT7629_HIFSYS) += clk-mt7629-hif.o @@ -41,12 +37,9 @@ index ea3b73240303..be9ab51fa6d5 100644 obj-$(CONFIG_COMMON_CLK_MT7986) += clk-mt7986-apmixed.o obj-$(CONFIG_COMMON_CLK_MT7986) += clk-mt7986-topckgen.o obj-$(CONFIG_COMMON_CLK_MT7986) += clk-mt7986-infracfg.o -diff --git a/drivers/clk/mediatek/clk-mt7981-apmixed.c b/drivers/clk/mediatek/clk-mt7981-apmixed.c -new file mode 100644 -index 000000000000..b517d20b5fde --- /dev/null +++ b/drivers/clk/mediatek/clk-mt7981-apmixed.c -@@ -0,0 +1,103 @@ +@@ -0,0 +1,103 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2021 MediaTek Inc. @@ -150,12 +143,9 @@ index 000000000000..b517d20b5fde + }, +}; +builtin_platform_driver(clk_mt7981_apmixed_drv); -diff --git a/drivers/clk/mediatek/clk-mt7981-eth.c b/drivers/clk/mediatek/clk-mt7981-eth.c -new file mode 100644 -index 000000000000..36f0fa222675 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt7981-eth.c -@@ -0,0 +1,138 @@ +@@ -0,0 +1,138 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2021 MediaTek Inc. @@ -294,12 +284,9 @@ index 000000000000..36f0fa222675 + __func__, r); +} +CLK_OF_DECLARE(mtk_ethsys, "mediatek,mt7981-ethsys", mtk_ethsys_init); -diff --git a/drivers/clk/mediatek/clk-mt7981-infracfg.c b/drivers/clk/mediatek/clk-mt7981-infracfg.c -new file mode 100644 -index 000000000000..d483e654606f --- /dev/null +++ b/drivers/clk/mediatek/clk-mt7981-infracfg.c -@@ -0,0 +1,323 @@ +@@ -0,0 +1,323 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2021 MediaTek Inc. @@ -623,12 +610,9 @@ index 000000000000..d483e654606f + }, +}; +builtin_platform_driver(clk_mt7981_infracfg_ao_drv); -diff --git a/drivers/clk/mediatek/clk-mt7981-topckgen.c b/drivers/clk/mediatek/clk-mt7981-topckgen.c -new file mode 100644 -index 000000000000..a136c0b36469 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt7981-topckgen.c -@@ -0,0 +1,431 @@ +@@ -0,0 +1,431 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2021 MediaTek Inc. @@ -1060,12 +1044,9 @@ index 000000000000..a136c0b36469 + }, +}; +builtin_platform_driver(clk_mt7981_topckgen_drv); -diff --git a/include/dt-bindings/clock/mt7981-clk.h b/include/dt-bindings/clock/mt7981-clk.h -new file mode 100644 -index 000000000000..0e17a7f93272 --- /dev/null +++ b/include/dt-bindings/clock/mt7981-clk.h -@@ -0,0 +1,253 @@ +@@ -0,0 +1,253 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ +/* + * Copyright (c) 2021 MediaTek Inc. diff --git a/target/linux/rockchip/patches-5.15/107-mmc-core-set-initial-signal-voltage-on-power-off.patch b/target/linux/rockchip/patches-5.15/107-mmc-core-set-initial-signal-voltage-on-power-off.patch index d6694b512ee835..136afaf8815614 100644 --- a/target/linux/rockchip/patches-5.15/107-mmc-core-set-initial-signal-voltage-on-power-off.patch +++ b/target/linux/rockchip/patches-5.15/107-mmc-core-set-initial-signal-voltage-on-power-off.patch @@ -24,7 +24,7 @@ Signed-off-by: Jonas Karlman --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c -@@ -1358,6 +1358,8 @@ void mmc_power_off(struct mmc_host *host +@@ -1364,6 +1364,8 @@ void mmc_power_off(struct mmc_host *host mmc_pwrseq_power_off(host); From da4a9aaee0a40328577a4e2c4bc0b030dbe1ef46 Mon Sep 17 00:00:00 2001 From: coolsnowwolf Date: Sun, 27 Nov 2022 00:37:12 +0800 Subject: [PATCH 26/26] pacakge: add mosdns and luci-app-mosdns from sbwml --- package/lean/luci-app-mosdns/Makefile | 19 ++ .../luasrc/controller/mosdns.lua | 42 ++++ .../luasrc/model/cbi/mosdns/basic.lua | 111 ++++++++++ .../luasrc/model/cbi/mosdns/log.lua | 5 + .../luasrc/model/cbi/mosdns/rule_list.lua | 87 ++++++++ .../luasrc/model/cbi/mosdns/update.lua | 31 +++ .../luasrc/view/mosdns/geo_update.htm | 34 ++++ .../luasrc/view/mosdns/mosdns_log.htm | 29 +++ .../luasrc/view/mosdns/mosdns_status.htm | 28 +++ .../lean/luci-app-mosdns/po/zh-cn/mosdns.po | 179 ++++++++++++++++ package/lean/luci-app-mosdns/po/zh_Hans | 1 + .../luci-app-mosdns/root/etc/config/mosdns | 20 ++ .../root/etc/hotplug.d/iface/99-mosdns | 2 + .../luci-app-mosdns/root/etc/init.d/mosdns | 151 ++++++++++++++ .../root/etc/mosdns/config_custom.yaml | 162 +++++++++++++++ .../root/etc/mosdns/rule/adlist.txt | 0 .../root/etc/mosdns/rule/blocklist.txt | 0 .../root/etc/mosdns/rule/greylist.txt | 3 + .../root/etc/mosdns/rule/hosts.txt | 0 .../root/etc/mosdns/rule/local-ptr.txt | 87 ++++++++ .../root/etc/mosdns/rule/redirect.txt | 0 .../root/etc/mosdns/rule/whitelist.txt | 24 +++ .../root/etc/uci-defaults/luci-mosdns | 11 + .../root/usr/share/mosdns/default.yaml | 191 ++++++++++++++++++ .../root/usr/share/mosdns/mosdns.sh | 86 ++++++++ .../usr/share/rpcd/acl.d/luci-app-mosdns.json | 11 + package/lean/mosdns/Makefile | 45 +++++ 27 files changed, 1359 insertions(+) create mode 100644 package/lean/luci-app-mosdns/Makefile create mode 100644 package/lean/luci-app-mosdns/luasrc/controller/mosdns.lua create mode 100644 package/lean/luci-app-mosdns/luasrc/model/cbi/mosdns/basic.lua create mode 100644 package/lean/luci-app-mosdns/luasrc/model/cbi/mosdns/log.lua create mode 100644 package/lean/luci-app-mosdns/luasrc/model/cbi/mosdns/rule_list.lua create mode 100644 package/lean/luci-app-mosdns/luasrc/model/cbi/mosdns/update.lua create mode 100644 package/lean/luci-app-mosdns/luasrc/view/mosdns/geo_update.htm create mode 100644 package/lean/luci-app-mosdns/luasrc/view/mosdns/mosdns_log.htm create mode 100644 package/lean/luci-app-mosdns/luasrc/view/mosdns/mosdns_status.htm create mode 100644 package/lean/luci-app-mosdns/po/zh-cn/mosdns.po create mode 120000 package/lean/luci-app-mosdns/po/zh_Hans create mode 100644 package/lean/luci-app-mosdns/root/etc/config/mosdns create mode 100755 package/lean/luci-app-mosdns/root/etc/hotplug.d/iface/99-mosdns create mode 100755 package/lean/luci-app-mosdns/root/etc/init.d/mosdns create mode 100644 package/lean/luci-app-mosdns/root/etc/mosdns/config_custom.yaml create mode 100644 package/lean/luci-app-mosdns/root/etc/mosdns/rule/adlist.txt create mode 100644 package/lean/luci-app-mosdns/root/etc/mosdns/rule/blocklist.txt create mode 100644 package/lean/luci-app-mosdns/root/etc/mosdns/rule/greylist.txt create mode 100644 package/lean/luci-app-mosdns/root/etc/mosdns/rule/hosts.txt create mode 100644 package/lean/luci-app-mosdns/root/etc/mosdns/rule/local-ptr.txt create mode 100644 package/lean/luci-app-mosdns/root/etc/mosdns/rule/redirect.txt create mode 100644 package/lean/luci-app-mosdns/root/etc/mosdns/rule/whitelist.txt create mode 100755 package/lean/luci-app-mosdns/root/etc/uci-defaults/luci-mosdns create mode 100644 package/lean/luci-app-mosdns/root/usr/share/mosdns/default.yaml create mode 100755 package/lean/luci-app-mosdns/root/usr/share/mosdns/mosdns.sh create mode 100644 package/lean/luci-app-mosdns/root/usr/share/rpcd/acl.d/luci-app-mosdns.json create mode 100644 package/lean/mosdns/Makefile diff --git a/package/lean/luci-app-mosdns/Makefile b/package/lean/luci-app-mosdns/Makefile new file mode 100644 index 00000000000000..dc11b2668fb2be --- /dev/null +++ b/package/lean/luci-app-mosdns/Makefile @@ -0,0 +1,19 @@ +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-mosdns +PKG_VERSION:=1.4.3 +PKG_RELEASE:=2 + +LUCI_TITLE:=LuCI Support for mosdns +LUCI_PKGARCH:=all +LUCI_DEPENDS:=+mosdns +jsonfilter +luci-compat +curl +v2ray-geoip +v2ray-geosite + +define Package/$(PKG_NAME)/conffiles +/etc/config/mosdns +/etc/mosdns/config_custom.yaml +/etc/mosdns/rule +endef + +include $(TOPDIR)/feeds/luci/luci.mk + +# call BuildPackage - OpenWrt buildroot signature diff --git a/package/lean/luci-app-mosdns/luasrc/controller/mosdns.lua b/package/lean/luci-app-mosdns/luasrc/controller/mosdns.lua new file mode 100644 index 00000000000000..4a7bb64205943f --- /dev/null +++ b/package/lean/luci-app-mosdns/luasrc/controller/mosdns.lua @@ -0,0 +1,42 @@ +module("luci.controller.mosdns", package.seeall) + +function index() + if not nixio.fs.access("/etc/config/mosdns") then + return + end + + local page = entry({"admin", "services", "mosdns"}, alias("admin", "services", "mosdns", "basic"), _("MosDNS"), 30) + page.dependent = true + page.acl_depends = { "luci-app-mosdns" } + + entry({"admin", "services", "mosdns", "basic"}, cbi("mosdns/basic"), _("Basic Setting"), 1).leaf = true + entry({"admin", "services", "mosdns", "rule_list"}, cbi("mosdns/rule_list"), _("Rule List"), 2).leaf = true + entry({"admin", "services", "mosdns", "update"}, cbi("mosdns/update"), _("Geodata Update"), 3).leaf = true + entry({"admin", "services", "mosdns", "log"}, cbi("mosdns/log"), _("Logs"), 4).leaf = true + entry({"admin", "services", "mosdns", "status"}, call("act_status")).leaf = true + entry({"admin", "services", "mosdns", "get_log"}, call("get_log")).leaf = true + entry({"admin", "services", "mosdns", "clear_log"}, call("clear_log")).leaf = true + entry({"admin", "services", "mosdns", "geo_update"}, call("geo_update")).leaf = true +end + +function act_status() + local e = {} + e.running = luci.sys.call("pgrep -f mosdns >/dev/null") == 0 + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end + +function get_log() + luci.http.write(luci.sys.exec("cat $(/usr/share/mosdns/mosdns.sh logfile)")) +end + +function clear_log() + luci.sys.call("cat /dev/null > $(/usr/share/mosdns/mosdns.sh logfile)") +end + +function geo_update() + local e = {} + e.updating = luci.sys.call("/usr/share/mosdns/mosdns.sh geodata >/dev/null") == 0 + luci.http.prepare_content("application/json") + luci.http.write_json(e) +end diff --git a/package/lean/luci-app-mosdns/luasrc/model/cbi/mosdns/basic.lua b/package/lean/luci-app-mosdns/luasrc/model/cbi/mosdns/basic.lua new file mode 100644 index 00000000000000..e7304147d55d4f --- /dev/null +++ b/package/lean/luci-app-mosdns/luasrc/model/cbi/mosdns/basic.lua @@ -0,0 +1,111 @@ +m = Map("mosdns") +m.title = translate("MosDNS") +m.description = translate("MosDNS is a 'programmable' DNS forwarder.") + +m:section(SimpleSection).template = "mosdns/mosdns_status" + +s = m:section(TypedSection, "mosdns") +s.addremove = false +s.anonymous = true + +enable = s:option(Flag, "enabled", translate("Enable")) +enable.rmempty = false + +configfile = s:option(ListValue, "configfile", translate("Config File")) +configfile:value("/etc/mosdns/config.yaml", translate("Default Config")) +configfile:value("/etc/mosdns/config_custom.yaml", translate("Custom Config")) +configfile.default = "/etc/mosdns/config.yaml" + +listenport = s:option(Value, "listen_port", translate("Listen port")) +listenport.datatype = "and(port,min(1))" +listenport.default = 5335 +listenport:depends( "configfile", "/etc/mosdns/config.yaml") + +loglevel = s:option(ListValue, "log_level", translate("Log Level")) +loglevel:value("debug", translate("Debug")) +loglevel:value("info", translate("Info")) +loglevel:value("warn", translate("Warning")) +loglevel:value("error", translate("Error")) +loglevel.default = "info" +loglevel:depends( "configfile", "/etc/mosdns/config.yaml") + +logfile = s:option(Value, "logfile", translate("Log File")) +logfile.placeholder = "/tmp/mosdns.log" +logfile.default = "/tmp/mosdns.log" +logfile:depends( "configfile", "/etc/mosdns/config.yaml") + +remote_dns = s:option(DynamicList, "remote_dns", translate("Remote DNS")) +remote_dns:value("tls://1.1.1.1", "1.1.1.1 (CloudFlare DNS)") +remote_dns:value("tls://1.0.0.1", "1.0.0.1 (CloudFlare DNS)") +remote_dns:value("tls://8.8.8.8", "8.8.8.8 (Google DNS)") +remote_dns:value("tls://8.8.4.4", "8.8.4.4 (Google DNS)") +remote_dns:value("tls://9.9.9.9", "9.9.9.9 (Quad9 DNS)") +remote_dns:value("tls://149.112.112.112", "149.112.112.112 (Quad9 DNS)") +remote_dns:value("tls://45.11.45.11", "45.11.45.11 (DNS.SB)") +remote_dns:value("tls://208.67.222.222", "208.67.222.222 (Open DNS)") +remote_dns:value("tls://208.67.220.220", "208.67.220.220 (Open DNS)") +remote_dns:depends( "configfile", "/etc/mosdns/config.yaml") + +remote_dns_pipeline = s:option(Flag, "enable_pipeline", translate("Remote DNS Connection Multiplexing"), translate("Enable TCP/DoT RFC 7766 new Query Pipelining connection multiplexing mode")) +remote_dns_pipeline.rmempty = false +remote_dns_pipeline.default = false +remote_dns_pipeline:depends( "configfile", "/etc/mosdns/config.yaml") + +cache_size = s:option(Value, "cache_size", translate("DNS Cache Size")) +cache_size.datatype = "and(uinteger,min(0))" +cache_size.default = "200000" +cache_size:depends( "configfile", "/etc/mosdns/config.yaml") + +cache_size = s:option(Value, "cache_survival_time", translate("Cache Survival Time")) +cache_size.datatype = "and(uinteger,min(0))" +cache_size.default = "259200" +cache_size:depends( "configfile", "/etc/mosdns/config.yaml") + +minimal_ttl = s:option(Value, "minimal_ttl", translate("Minimum TTL")) +minimal_ttl.datatype = "and(uinteger,min(0))" +minimal_ttl.datatype = "and(uinteger,max(3600))" +minimal_ttl.default = "0" +minimal_ttl:depends( "configfile", "/etc/mosdns/config.yaml") + +maximum_ttl = s:option(Value, "maximum_ttl", translate("Maximum TTL")) +maximum_ttl.datatype = "and(uinteger,min(0))" +maximum_ttl.default = "0" +maximum_ttl:depends( "configfile", "/etc/mosdns/config.yaml") + +redirect = s:option(Flag, "redirect", translate("Enable DNS Forward"), translate("Forward Dnsmasq Domain Name resolution requests to MosDNS")) +redirect.default = true + +adblock = s:option(Flag, "adblock", translate("Enable DNS ADblock")) +adblock:depends( "configfile", "/etc/mosdns/config.yaml") +adblock.default = false + +adblock = s:option(Value, "ad_source", translate("ADblock Source")) +adblock:depends("adblock", "1") +adblock.default = "https://raw.githubusercontent.com/privacy-protection-tools/anti-AD/master/anti-ad-domains.txt" +adblock:value("geosite.dat", "v2ray-geosite") +adblock:value("https://raw.githubusercontent.com/privacy-protection-tools/anti-AD/master/anti-ad-domains.txt", "anti-AD") +adblock:value("https://raw.githubusercontent.com/sjhgvr/oisd/main/dbl_basic.txt", "oisd (basic)") +adblock:value("https://raw.githubusercontent.com/QiuSimons/openwrt-mos/master/dat/serverlist.txt", "QiuSimons/openwrt-mos") + +reload_service = s:option( Button, "_reload", translate("Reload Service"), translate("Reload service to take effect of new configuration")) +reload_service.write = function() + luci.sys.exec("/etc/init.d/mosdns reload") +end +reload_service:depends( "configfile", "/etc/mosdns/config_custom.yaml") + +config = s:option(TextValue, "manual-config") +config.description = translate("View the Custom YAML Configuration file used by this MosDNS. You can edit it as you own need.") +config.template = "cbi/tvalue" +config.rows = 25 +config:depends( "configfile", "/etc/mosdns/config_custom.yaml") + +function config.cfgvalue(self, section) + return nixio.fs.readfile("/etc/mosdns/config_custom.yaml") +end + +function config.write(self, section, value) + value = value:gsub("\r\n?", "\n") + nixio.fs.writefile("/etc/mosdns/config_custom.yaml", value) +end + +return m diff --git a/package/lean/luci-app-mosdns/luasrc/model/cbi/mosdns/log.lua b/package/lean/luci-app-mosdns/luasrc/model/cbi/mosdns/log.lua new file mode 100644 index 00000000000000..79fc1a95e3abc1 --- /dev/null +++ b/package/lean/luci-app-mosdns/luasrc/model/cbi/mosdns/log.lua @@ -0,0 +1,5 @@ +m = Map("mosdns") + +m:append(Template("mosdns/mosdns_log")) + +return m diff --git a/package/lean/luci-app-mosdns/luasrc/model/cbi/mosdns/rule_list.lua b/package/lean/luci-app-mosdns/luasrc/model/cbi/mosdns/rule_list.lua new file mode 100644 index 00000000000000..660b2e77dae955 --- /dev/null +++ b/package/lean/luci-app-mosdns/luasrc/model/cbi/mosdns/rule_list.lua @@ -0,0 +1,87 @@ +local datatypes = require "luci.cbi.datatypes" + +local white_list_file = "/etc/mosdns/rule/whitelist.txt" +local block_list_file = "/etc/mosdns/rule/blocklist.txt" +local grey_list_file = "/etc/mosdns/rule/greylist.txt" +local hosts_list_file = "/etc/mosdns/rule/hosts.txt" +local redirect_list_file = "/etc/mosdns/rule/redirect.txt" +local local_ptr_file = "/etc/mosdns/rule/local-ptr.txt" + +m = Map("mosdns") + +s = m:section(TypedSection, "mosdns", translate("Rule Settings")) +s.anonymous = true + +s:tab("white_list", translate("White Lists")) +s:tab("block_list", translate("Block Lists")) +s:tab("grey_list", translate("Grey Lists")) +s:tab("hosts_list", translate("Hosts")) +s:tab("redirect_list", translate("Redirect")) +s:tab("local_ptr_list", translate("Block PTR")) + +o = s:taboption("white_list", TextValue, "whitelist", "", "" .. translate("These domain names allow DNS resolution with the highest priority. Please input the domain names of websites, every line can input only one website domain. For example: hm.baidu.com.") .. "" .. "" .. translate("
The list of rules only apply to 'Default Config' profiles.") .. "
") +o.rows = 15 +o.wrap = "off" +o.cfgvalue = function(self, section) return nixio.fs.readfile(white_list_file) or "" end +o.write = function(self, section, value) nixio.fs.writefile(white_list_file , value:gsub("\r\n", "\n")) end +o.remove = function(self, section, value) nixio.fs.writefile(white_list_file , "") end +o.validate = function(self, value) + return value +end + +o = s:taboption("block_list", TextValue, "blocklist", "", "" .. translate("These domains are blocked from DNS resolution. Please input the domain names of websites, every line can input only one website domain. For example: baidu.com.") .. "" .. "" .. translate("
The list of rules only apply to 'Default Config' profiles.") .. "
") +o.rows = 15 +o.wrap = "off" +o.cfgvalue = function(self, section) return nixio.fs.readfile(block_list_file) or "" end +o.write = function(self, section, value) nixio.fs.writefile(block_list_file, value:gsub("\r\n", "\n")) end +o.remove = function(self, section, value) nixio.fs.writefile(block_list_file, "") end +o.validate = function(self, value) + return value +end + +o = s:taboption("grey_list", TextValue, "greylist", "", "" .. translate("These domains are always resolved using remote DNS. Please input the domain names of websites, every line can input only one website domain. For example: google.com.") .. "" .. "" .. translate("
The list of rules only apply to 'Default Config' profiles.") .. "
") +o.rows = 15 +o.wrap = "off" +o.cfgvalue = function(self, section) return nixio.fs.readfile(grey_list_file) or "" end +o.write = function(self, section, value) nixio.fs.writefile(grey_list_file, value:gsub("\r\n", "\n")) end +o.remove = function(self, section, value) nixio.fs.writefile(grey_list_file, "") end +o.validate = function(self, value) + return value +end + +o = s:taboption("hosts_list", TextValue, "hosts", "", "" .. translate("Hosts For example: baidu.com 10.0.0.1") .. "" .. "" .. translate("
The list of rules only apply to 'Default Config' profiles.") .. "
") +o.rows = 15 +o.wrap = "off" +o.cfgvalue = function(self, section) return nixio.fs.readfile(hosts_list_file) or "" end +o.write = function(self, section, value) nixio.fs.writefile(hosts_list_file, value:gsub("\r\n", "\n")) end +o.remove = function(self, section, value) nixio.fs.writefile(hosts_list_file, "") end +o.validate = function(self, value) + return value +end + +o = s:taboption("redirect_list", TextValue, "redirect", "", "" .. translate("The domain name to redirect the request to. Requests domain A, but returns records for domain B. example: a.com b.com") .. "" .. "" .. translate("
The list of rules only apply to 'Default Config' profiles.") .. "
") +o.rows = 15 +o.wrap = "off" +o.cfgvalue = function(self, section) return nixio.fs.readfile(redirect_list_file) or "" end +o.write = function(self, section, value) nixio.fs.writefile(redirect_list_file, value:gsub("\r\n", "\n")) end +o.remove = function(self, section, value) nixio.fs.writefile(redirect_list_file, "") end +o.validate = function(self, value) + return value +end + +o = s:taboption("local_ptr_list", TextValue, "local_ptr", "", "" .. translate("These domains are blocked from PTR requests") .. "" .. "" .. translate("
The list of rules only apply to 'Default Config' profiles.") .. "
") +o.rows = 15 +o.wrap = "off" +o.cfgvalue = function(self, section) return nixio.fs.readfile(local_ptr_file) or "" end +o.write = function(self, section, value) nixio.fs.writefile(local_ptr_file, value:gsub("\r\n", "\n")) end +o.remove = function(self, section, value) nixio.fs.writefile(local_ptr_file, "") end +o.validate = function(self, value) + return value +end + +local apply = luci.http.formvalue("cbi.apply") +if apply then + luci.sys.exec("/etc/init.d/mosdns reload") +end + +return m diff --git a/package/lean/luci-app-mosdns/luasrc/model/cbi/mosdns/update.lua b/package/lean/luci-app-mosdns/luasrc/model/cbi/mosdns/update.lua new file mode 100644 index 00000000000000..0beaf6d34be84f --- /dev/null +++ b/package/lean/luci-app-mosdns/luasrc/model/cbi/mosdns/update.lua @@ -0,0 +1,31 @@ +m = Map("mosdns") + +s = m:section(TypedSection, "mosdns", translate("Update GeoIP & GeoSite dat")) +s.addremove = false +s.anonymous = true + +enable = s:option(Flag, "geo_auto_update", translate("Enable Auto Database Update")) +enable.rmempty = false + +o = s:option(ListValue, "geo_update_week_time", translate("Update Cycle")) +o:value("*", translate("Every Day")) +o:value("1", translate("Every Monday")) +o:value("2", translate("Every Tuesday")) +o:value("3", translate("Every Wednesday")) +o:value("4", translate("Every Thursday")) +o:value("5", translate("Every Friday")) +o:value("6", translate("Every Saturday")) +o:value("7", translate("Every Sunday")) +o.default = "*" + +update_time = s:option(ListValue, "geo_update_day_time", translate("Update Time")) +for t = 0, 23 do + update_time:value(t, t..":00") +end +update_time.default = 0 + +data_update = s:option(Button, "geo_update_database", translate("Database Update")) +data_update.rawhtml = true +data_update.template = "mosdns/geo_update" + +return m diff --git a/package/lean/luci-app-mosdns/luasrc/view/mosdns/geo_update.htm b/package/lean/luci-app-mosdns/luasrc/view/mosdns/geo_update.htm new file mode 100644 index 00000000000000..68b3027f49a5be --- /dev/null +++ b/package/lean/luci-app-mosdns/luasrc/view/mosdns/geo_update.htm @@ -0,0 +1,34 @@ +<%+cbi/valueheader%> + + +<%=self.value%> +<%+cbi/valuefooter%> diff --git a/package/lean/luci-app-mosdns/luasrc/view/mosdns/mosdns_log.htm b/package/lean/luci-app-mosdns/luasrc/view/mosdns/mosdns_log.htm new file mode 100644 index 00000000000000..c6456983bf5bc7 --- /dev/null +++ b/package/lean/luci-app-mosdns/luasrc/view/mosdns/mosdns_log.htm @@ -0,0 +1,29 @@ + +

+ + +
diff --git a/package/lean/luci-app-mosdns/luasrc/view/mosdns/mosdns_status.htm b/package/lean/luci-app-mosdns/luasrc/view/mosdns/mosdns_status.htm new file mode 100644 index 00000000000000..7f9be5bda705f7 --- /dev/null +++ b/package/lean/luci-app-mosdns/luasrc/view/mosdns/mosdns_status.htm @@ -0,0 +1,28 @@ + + +
+

+ <%:Collecting data...%> +

+
diff --git a/package/lean/luci-app-mosdns/po/zh-cn/mosdns.po b/package/lean/luci-app-mosdns/po/zh-cn/mosdns.po new file mode 100644 index 00000000000000..f091dca1c9907d --- /dev/null +++ b/package/lean/luci-app-mosdns/po/zh-cn/mosdns.po @@ -0,0 +1,179 @@ +msgid "Basic Setting" +msgstr "基本设置" + +msgid "MosDNS is a 'programmable' DNS forwarder." +msgstr "MosDNS 是一个插件化的 DNS 转发/分流器。" + +msgid "RUNNING" +msgstr "运行中" + +msgid "NOT RUNNING" +msgstr "未运行" + +msgid "Collecting data..." +msgstr "获取数据中..." + +msgid "Enable" +msgstr "启用" + +msgid "Listen port" +msgstr "监听端口" + +msgid "Log Level" +msgstr "日志等级" + +msgid "Enable DNS Forward" +msgstr "启用 DNS 转发" + +msgid "Forward Dnsmasq Domain Name resolution requests to MosDNS" +msgstr "将 Dnsmasq 域名解析请求转发到 MosDNS 服务器" + +msgid "Enable DNS ADblock" +msgstr "启用 DNS 广告过滤" + +msgid "ADblock Source" +msgstr "广告过滤来源" + +msgid "Reload Service" +msgstr "重载服务" + +msgid "Reload service to take effect of new configuration" +msgstr "重载 MosDNS 服务生效配置文件" + +msgid "View the Custom YAML Configuration file used by this MosDNS. You can edit it as you own need." +msgstr "注意!此页的更改仅当配置文件为 “自定义” 时才会生效" + +msgid "Geodata Update" +msgstr "更新数据库" + +msgid "Update GeoIP & GeoSite dat" +msgstr "更新 GeoIP & GeoSite 数据库" + +msgid "Update Time" +msgstr "更新时间" + +msgid "Update Cycle" +msgstr "更新周期" + +msgid "Every Day" +msgstr "每天" + +msgid "Every Monday" +msgstr "每周一" + +msgid "Every Tuesday" +msgstr "每周二" + +msgid "Every Wednesday" +msgstr "每周三" + +msgid "Every Thursday" +msgstr "每周四" + +msgid "Every Friday" +msgstr "每周五" + +msgid "Every Saturday" +msgstr "每周六" + +msgid "Every Sunday" +msgstr "每周日" + +msgid "Database Update" +msgstr "数据库更新" + +msgid "Check And Update" +msgstr "检查并更新" + +msgid "Enable Auto Database Update" +msgstr "启用自动更新" + +msgid "Updating..." +msgstr "正在更新..." + +msgid "Update success" +msgstr "更新成功" + +msgid "Update failed, Please check the network status" +msgstr "更新失败,请检查网络状态" + +msgid "Config File" +msgstr "配置文件" + +msgid "Default Config" +msgstr "内置预设" + +msgid "Custom Config" +msgstr "自定义" + +msgid "Log File" +msgstr "日志文件" + +msgid "Remote DNS" +msgstr "远程 DNS" + +msgid "Remote DNS Connection Multiplexing" +msgstr "远程 DNS 连接复用" + +msgid "Enable TCP/DoT RFC 7766 new Query Pipelining connection multiplexing mode" +msgstr "启用 TCP/DoT RFC 7766 新型 Query Pipelining 连接复用模式" + +msgid "DNS Cache Size" +msgstr "DNS 缓存大小(条)" + +msgid "Cache Survival Time" +msgstr "缓存生存时间(秒)" + +msgid "Minimum TTL" +msgstr "覆盖最小 TTL 值(默认 0)" + +msgid "Maximum TTL" +msgstr "覆盖最大 TTL 值(默认 0)" + +msgid "Logs" +msgstr "日志" + +msgid "Clear logs" +msgstr "清空日志" + +msgid "Rule List" +msgstr "规则列表" + +msgid "Rule Settings" +msgstr "自定义规则列表" + +msgid "
The list of rules only apply to 'Default Config' profiles." +msgstr "
规则列表仅适用于 “内置预设” 配置文件" + +msgid "White Lists" +msgstr "白名单" + +msgid "These domain names allow DNS resolution with the highest priority. Please input the domain names of websites, every line can input only one website domain. For example: hm.baidu.com." +msgstr "加入的域名始终允许使用 “本地 DNS” 进行解析,且优先级最高(每个域名一行,支持域名匹配规则)" + +msgid "Block Lists" +msgstr "黑名单" + +msgid "These domains are blocked from DNS resolution. Please input the domain names of websites, every line can input only one website domain. For example: baidu.com." +msgstr "加入的域名将屏蔽 DNS 解析(每个域名一行,支持域名匹配规则)" + +msgid "Grey Lists" +msgstr "灰名单" + +msgid "These domains are always resolved using remote DNS. Please input the domain names of websites, every line can input only one website domain. For example: google.com." +msgstr "加入的域名始终使用 “远程 DNS” 进行解析(每个域名一行,支持域名匹配规则)" + +msgid "Hosts For example: baidu.com 10.0.0.1" +msgstr "自定义 Hosts 重写,如:baidu.com 10.0.0.1(每个规则一行)" + +msgid "Redirect" +msgstr "重定向" + +msgid "The domain name to redirect the request to. Requests domain A, but returns records for domain B. example: a.com b.com" +msgstr "重定向请求的域名。请求域名 A,但返回域名 B 的记录,如:baidu.com qq.com(每个规则一行)" + +msgid "Block PTR" +msgstr "PTR 黑名单" + +msgid "These domains are blocked from PTR requests" +msgstr "加入的域名将阻止 PTR 请求(每个域名一行,支持域名匹配规则)" diff --git a/package/lean/luci-app-mosdns/po/zh_Hans b/package/lean/luci-app-mosdns/po/zh_Hans new file mode 120000 index 00000000000000..41451e4a19c465 --- /dev/null +++ b/package/lean/luci-app-mosdns/po/zh_Hans @@ -0,0 +1 @@ +zh-cn \ No newline at end of file diff --git a/package/lean/luci-app-mosdns/root/etc/config/mosdns b/package/lean/luci-app-mosdns/root/etc/config/mosdns new file mode 100644 index 00000000000000..81e922c9f5bada --- /dev/null +++ b/package/lean/luci-app-mosdns/root/etc/config/mosdns @@ -0,0 +1,20 @@ + +config mosdns 'config' + option enabled '0' + option listen_port '5335' + option geo_auto_update '0' + option geo_update_week_time '*' + option geo_update_day_time '2' + option redirect '1' + option adblock '0' + option configfile '/etc/mosdns/config.yaml' + option log_level 'info' + option logfile '/tmp/mosdns.log' + option cache_size '200000' + option cache_survival_time '259200' + option minimal_ttl '0' + option maximum_ttl '0' + option enable_pipeline '0' + list remote_dns 'tls://8.8.8.8' + list remote_dns 'tls://1.1.1.1' + diff --git a/package/lean/luci-app-mosdns/root/etc/hotplug.d/iface/99-mosdns b/package/lean/luci-app-mosdns/root/etc/hotplug.d/iface/99-mosdns new file mode 100755 index 00000000000000..1fb646fb06b203 --- /dev/null +++ b/package/lean/luci-app-mosdns/root/etc/hotplug.d/iface/99-mosdns @@ -0,0 +1,2 @@ +#!/bin/sh +[ "$ACTION" = ifup ] && /etc/init.d/mosdns restart diff --git a/package/lean/luci-app-mosdns/root/etc/init.d/mosdns b/package/lean/luci-app-mosdns/root/etc/init.d/mosdns new file mode 100755 index 00000000000000..08b4cbdec6087c --- /dev/null +++ b/package/lean/luci-app-mosdns/root/etc/init.d/mosdns @@ -0,0 +1,151 @@ +#!/bin/sh /etc/rc.common +# +# Copyright (C) 2020-2022, IrineSistiana +# +# This file is part of mosdns. +# +# mosdns is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# mosdns is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +START=99 +USE_PROCD=1 + +PROG=/usr/bin/mosdns +CONF=$(uci -q get mosdns.config.configfile) +CRON_FILE=/etc/crontabs/root + +get_config() { + config_get enabled $1 enabled 0 + config_get ad_source $1 ad_source "" + config_get cache_size $1 cache_size 200000 + config_get cache_survival_time $1 cache_survival_time 259200 + config_get enable_pipeline $1 enable_pipeline 0 + config_get geo_auto_update $1 geo_auto_update 0 + config_get geo_update_day_time $1 geo_update_day_time 2 + config_get geo_update_week_time $1 geo_update_week_time "*" + config_get listen_port $1 listen_port 5335 + config_get log_file $1 logfile "/tmp/mosdns.log" + config_get log_level $1 log_level "info" + config_get maximum_ttl_custom $1 maximum_ttl 0 + config_get minimal_ttl_custom $1 minimal_ttl 0 + config_get redirect $1 redirect 0 + config_get remote_dns $1 remote_dns "tls://8.8.8.8 tls://1.1.1.1" +} + +init_yaml() { + tmpdir=$(mktemp -d) || exit 1 + adblock=$(/usr/share/mosdns/mosdns.sh ad) + [ $enable_pipeline = 1 ] && enable_pipeline=true || enable_pipeline=false + local_dns=$(/usr/share/mosdns/mosdns.sh dns | xargs -n1 echo " - addr:") + remote_dns=$(echo $remote_dns | awk '{for(i=1;i<=NF;i++)printf "%s- addr: %s\n%s enable_pipeline: '${enable_pipeline}'\n",s,$i,s}' s=' ') + sed "s,log_level,$log_level,g;s,log_file,$log_file,g; \ + s,listen_port,$listen_port,g;s,cache_size,$cache_size,g; \ + s,cache_survival_time,$cache_survival_time,g; \ + s,minimal_ttl_custom,$minimal_ttl_custom,g; \ + s,maximum_ttl_custom,$maximum_ttl_custom,g; \ + s,adblock,$adblock,g;s,remote_dns_pipeline,$enable_pipeline,g" \ + /usr/share/mosdns/default.yaml > $CONF + echo "${local_dns}" > $tmpdir/local_dns.txt + echo "${remote_dns}" > $tmpdir/remote_dns.txt + sed -i -e '/- addr: local_dns/{r '$tmpdir/local_dns.txt -e';d};/- addr: remote_dns/{r '$tmpdir/remote_dns.txt -e';d}' \ + $CONF + rm -rf $tmpdir +} + +service_triggers() { + procd_add_reload_trigger "mosdns" +} + +restore_setting() { + rm -f /etc/mosdns/redirect.lock + sed -i "/list server/d" /etc/config/dhcp + uci set dhcp.@dnsmasq[0].noresolv='0' + uci del dhcp.@dnsmasq[0].cachesize + uci commit dhcp +} + +redirect_setting() { + if [ "${CONF}" = "/etc/mosdns/config.yaml" ]; then + sed -i "/list server/d" /etc/config/dhcp + uci add_list dhcp.@dnsmasq[0].server="127.0.0.1#$listen_port" + uci set dhcp.@dnsmasq[0].rebind_protection='0' + uci set dhcp.@dnsmasq[0].noresolv="1" + uci set dhcp.@dnsmasq[0].cachesize='0' + uci commit dhcp + else + sed -i "/list server/d" /etc/config/dhcp + uci add_list dhcp.@dnsmasq[0].server="127.0.0.1#$(cat /etc/mosdns/config_custom.yaml | awk -F'[:" ]+' '/^\s+addr:/{for(i=1;i<=NF;i++){if($i~/^[0-9]+$/){print $i;exit}}}')" + uci set dhcp.@dnsmasq[0].rebind_protection='0' + uci set dhcp.@dnsmasq[0].noresolv="1" + uci set dhcp.@dnsmasq[0].cachesize='0' + uci commit dhcp + fi + touch /etc/mosdns/redirect.lock +} + +reload_others() { + /etc/init.d/network reload + /etc/init.d/dnsmasq reload +} + +reload_service() { + stop + sleep 1 + start +} + +setcron() { + sed -i '/mosdns.sh/d' $CRON_FILE 2>/dev/null + [ "$geo_auto_update" -eq 1 ] && echo "0 $geo_update_day_time * * $geo_update_week_time /usr/share/mosdns/mosdns.sh geodata" >>$CRON_FILE + crontab $CRON_FILE +} + +delcron() { + sed -i '/mosdns.sh/d' $CRON_FILE 2>/dev/null + crontab $CRON_FILE +} + +start_service() { + config_load "mosdns" + config_foreach get_config "mosdns" + [ $enabled != 1 ] && return 1 + delcron + setcron + [ "${CONF}" = "/etc/mosdns/config.yaml" ] && init_yaml + cat /dev/null > $(/usr/share/mosdns/mosdns.sh logfile) + [ ! "$ad_source" = "geosite.dat" ] && cat /dev/null > /etc/mosdns/rule/adlist.txt + procd_open_instance mosdns + procd_set_param command $PROG start -c "$CONF" + procd_set_param user root + procd_set_param stdout 1 + procd_set_param stderr 1 + procd_set_param respawn "${respawn_threshold:-3600}" "${respawn_timeout:-5}" "${respawn_retry:-5}" + procd_close_instance mosdns + + [ "$redirect" -ne 1 ] && [ -f "/etc/mosdns/redirect.lock" ] && restore_setting + [ "$redirect" -eq 1 ] && redirect_setting + + reload_others + + [ ! "$ad_source" = "geosite.dat" ] && /usr/share/mosdns/mosdns.sh adlist_update &> /dev/null & +} + +stop_service() { + pgrep -f /usr/bin/mosdns | xargs kill -9 >/dev/null 2>&1 + config_load "mosdns" + config_foreach get_config "mosdns" + [ "$enabled" = "0" ] && [ -f "/etc/mosdns/redirect.lock" ] && restore_setting + reload_others + delcron +} diff --git a/package/lean/luci-app-mosdns/root/etc/mosdns/config_custom.yaml b/package/lean/luci-app-mosdns/root/etc/mosdns/config_custom.yaml new file mode 100644 index 00000000000000..a291817e38a1e4 --- /dev/null +++ b/package/lean/luci-app-mosdns/root/etc/mosdns/config_custom.yaml @@ -0,0 +1,162 @@ +log: + level: info + file: "/tmp/mosdns.log" + +include: [] + +data_providers: + - tag: geoip + file: "/usr/share/v2ray/geoip.dat" + auto_reload: true + + - tag: geosite + file: "/usr/share/v2ray/geosite.dat" + auto_reload: true + + - tag: whitelist + file: "/etc/mosdns/rule/whitelist.txt" + auto_reload: true + + - tag: blocklist + file: "/etc/mosdns/rule/blocklist.txt" + auto_reload: true + + - tag: hosts + file: "/etc/mosdns/rule/hosts.txt" + auto_reload: true + + - tag: redirect + file: "/etc/mosdns/rule/redirect.txt" + auto_reload: true + +plugins: + - tag: lazy_cache + type: cache + args: + size: 200000 + lazy_cache_ttl: 259200 + + - tag: modify_ttl + type: ttl + args: + minimal_ttl: 0 + maximum_ttl: 0 + + - tag: "forward_local" + type: fast_forward + args: + upstream: + - addr: 119.29.29.29 + - addr: 114.114.114.114 + + - tag: "forward_remote" + type: fast_forward + args: + upstream: + - addr: tls://8.8.8.8 + - addr: tls://1.1.1.1 + + - tag: query_is_whitelist_domain + type: query_matcher + args: + domain: + - "provider:whitelist" + + - tag: query_is_blocklist_domain + type: query_matcher + args: + domain: + - "provider:blocklist" + + - tag: query_is_hosts_domain + type: hosts + args: + hosts: + - "provider:hosts" + + - tag: query_is_redirect_domain + type: redirect + args: + rule: + - "provider:redirect" + + - tag: query_is_local_domain + type: query_matcher + args: + domain: + - "provider:geosite:cn,apple-cn,icloud,google-cn,tld-cn" + + - tag: query_is_non_local_domain + type: query_matcher + args: + domain: + - "provider:geosite:geolocation-!cn" + + - tag: response_has_local_ip + type: response_matcher + args: + ip: + - "provider:geoip:cn" + + - tag: query_is_ad_domain + type: query_matcher + args: + domain: + - "provider:geosite:category-ads-all" + + - tag: match_qtype65 + type: query_matcher + args: + qtype: [65] + + - tag: "main_sequence" + type: "sequence" + args: + exec: + - _misc_optm + - query_is_hosts_domain + - query_is_redirect_domain + + - if: query_is_whitelist_domain + exec: + - forward_local + - modify_ttl + - _return + + - if: "query_is_blocklist_domain || query_is_ad_domain || match_qtype65" + exec: + - _new_nxdomain_response + - _return + + - lazy_cache + + - if: query_is_local_domain + exec: + - forward_local + - modify_ttl + - _return + + - if: query_is_non_local_domain + exec: + - _prefer_ipv4 + - forward_remote + - modify_ttl + - _return + - primary: + - forward_local + - if: "(! response_has_local_ip) && [_response_valid_answer]" + exec: + - _drop_response + secondary: + - _prefer_ipv4 + - forward_remote + - modify_ttl + fast_fallback: 200 + +servers: + - exec: main_sequence + listeners: + - protocol: udp + addr: ":5335" + - protocol: tcp + addr: ":5335" diff --git a/package/lean/luci-app-mosdns/root/etc/mosdns/rule/adlist.txt b/package/lean/luci-app-mosdns/root/etc/mosdns/rule/adlist.txt new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/package/lean/luci-app-mosdns/root/etc/mosdns/rule/blocklist.txt b/package/lean/luci-app-mosdns/root/etc/mosdns/rule/blocklist.txt new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/package/lean/luci-app-mosdns/root/etc/mosdns/rule/greylist.txt b/package/lean/luci-app-mosdns/root/etc/mosdns/rule/greylist.txt new file mode 100644 index 00000000000000..cab65c84c40510 --- /dev/null +++ b/package/lean/luci-app-mosdns/root/etc/mosdns/rule/greylist.txt @@ -0,0 +1,3 @@ +domain:gstatic.com +domain:kernel.org +keyword:github diff --git a/package/lean/luci-app-mosdns/root/etc/mosdns/rule/hosts.txt b/package/lean/luci-app-mosdns/root/etc/mosdns/rule/hosts.txt new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/package/lean/luci-app-mosdns/root/etc/mosdns/rule/local-ptr.txt b/package/lean/luci-app-mosdns/root/etc/mosdns/rule/local-ptr.txt new file mode 100644 index 00000000000000..0a66cae4ee444c --- /dev/null +++ b/package/lean/luci-app-mosdns/root/etc/mosdns/rule/local-ptr.txt @@ -0,0 +1,87 @@ +0.in-addr.arpa +10.in-addr.arpa +127.in-addr.arpa +16.172.in-addr.arpa +17.172.in-addr.arpa +18.172.in-addr.arpa +19.172.in-addr.arpa +20.172.in-addr.arpa +21.172.in-addr.arpa +22.172.in-addr.arpa +23.172.in-addr.arpa +24.172.in-addr.arpa +25.172.in-addr.arpa +26.172.in-addr.arpa +27.172.in-addr.arpa +28.172.in-addr.arpa +29.172.in-addr.arpa +30.172.in-addr.arpa +31.172.in-addr.arpa +64.100.in-addr.arpa +65.100.in-addr.arpa +66.100.in-addr.arpa +67.100.in-addr.arpa +68.100.in-addr.arpa +69.100.in-addr.arpa +70.100.in-addr.arpa +71.100.in-addr.arpa +72.100.in-addr.arpa +73.100.in-addr.arpa +74.100.in-addr.arpa +75.100.in-addr.arpa +76.100.in-addr.arpa +77.100.in-addr.arpa +78.100.in-addr.arpa +79.100.in-addr.arpa +80.100.in-addr.arpa +81.100.in-addr.arpa +82.100.in-addr.arpa +83.100.in-addr.arpa +84.100.in-addr.arpa +85.100.in-addr.arpa +86.100.in-addr.arpa +87.100.in-addr.arpa +88.100.in-addr.arpa +89.100.in-addr.arpa +90.100.in-addr.arpa +91.100.in-addr.arpa +92.100.in-addr.arpa +93.100.in-addr.arpa +94.100.in-addr.arpa +95.100.in-addr.arpa +96.100.in-addr.arpa +97.100.in-addr.arpa +98.100.in-addr.arpa +99.100.in-addr.arpa +100.100.in-addr.arpa +101.100.in-addr.arpa +102.100.in-addr.arpa +103.100.in-addr.arpa +104.100.in-addr.arpa +105.100.in-addr.arpa +106.100.in-addr.arpa +107.100.in-addr.arpa +108.100.in-addr.arpa +109.100.in-addr.arpa +110.100.in-addr.arpa +111.100.in-addr.arpa +112.100.in-addr.arpa +113.100.in-addr.arpa +114.100.in-addr.arpa +115.100.in-addr.arpa +116.100.in-addr.arpa +117.100.in-addr.arpa +118.100.in-addr.arpa +119.100.in-addr.arpa +120.100.in-addr.arpa +121.100.in-addr.arpa +122.100.in-addr.arpa +123.100.in-addr.arpa +124.100.in-addr.arpa +125.100.in-addr.arpa +126.100.in-addr.arpa +127.100.in-addr.arpa +2.0.192.in-addr.arpa +168.192.in-addr.arpa +255.255.255.255.in-addr.arpa +domain:ip6.arpa diff --git a/package/lean/luci-app-mosdns/root/etc/mosdns/rule/redirect.txt b/package/lean/luci-app-mosdns/root/etc/mosdns/rule/redirect.txt new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/package/lean/luci-app-mosdns/root/etc/mosdns/rule/whitelist.txt b/package/lean/luci-app-mosdns/root/etc/mosdns/rule/whitelist.txt new file mode 100644 index 00000000000000..bf94567705cc61 --- /dev/null +++ b/package/lean/luci-app-mosdns/root/etc/mosdns/rule/whitelist.txt @@ -0,0 +1,24 @@ +domain:bing.com +domain:live.com +domain:msn.com +domain:ntp.org +domain:office.com +domain:qlogo.cn +domain:qq.com +domain:redhat.com +keyword:aaplimg +keyword:aicdn +keyword:akadns +keyword:akamai +keyword:apple +keyword:douyin +keyword:fclouddns +keyword:icloud +keyword:itunes +keyword:microsoft +keyword:mzstatic +keyword:ssrcdn +keyword:windows +keyword:xxpkg +keyword:yximgs +keyword:yxygslb diff --git a/package/lean/luci-app-mosdns/root/etc/uci-defaults/luci-mosdns b/package/lean/luci-app-mosdns/root/etc/uci-defaults/luci-mosdns new file mode 100755 index 00000000000000..09c39fa02c4888 --- /dev/null +++ b/package/lean/luci-app-mosdns/root/etc/uci-defaults/luci-mosdns @@ -0,0 +1,11 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@mosdns[-1] + add ucitrack mosdns + set ucitrack.@mosdns[-1].init=mosdns + commit ucitrack +EOF + +rm -rf /tmp/luci-* +exit 0 diff --git a/package/lean/luci-app-mosdns/root/usr/share/mosdns/default.yaml b/package/lean/luci-app-mosdns/root/usr/share/mosdns/default.yaml new file mode 100644 index 00000000000000..88012de0c9de53 --- /dev/null +++ b/package/lean/luci-app-mosdns/root/usr/share/mosdns/default.yaml @@ -0,0 +1,191 @@ +log: + level: log_level + file: "log_file" + +include: [] + +data_providers: + - tag: geoip + file: "/usr/share/v2ray/geoip.dat" + auto_reload: true + + - tag: geosite + file: "/usr/share/v2ray/geosite.dat" + auto_reload: true + + - tag: whitelist + file: "/etc/mosdns/rule/whitelist.txt" + auto_reload: true + + - tag: blocklist + file: "/etc/mosdns/rule/blocklist.txt" + auto_reload: true + + - tag: greylist + file: "/etc/mosdns/rule/greylist.txt" + auto_reload: true + + - tag: hosts + file: "/etc/mosdns/rule/hosts.txt" + auto_reload: true + + - tag: redirect + file: "/etc/mosdns/rule/redirect.txt" + auto_reload: true + + - tag: local_ptr + file: "/etc/mosdns/rule/local-ptr.txt" + auto_reload: true + + - tag: adlist + file: "/etc/mosdns/rule/adlist.txt" + auto_reload: true + +plugins: + - tag: lazy_cache + type: cache + args: + size: cache_size + lazy_cache_ttl: cache_survival_time + + - tag: modify_ttl + type: ttl + args: + minimal_ttl: minimal_ttl_custom + maximum_ttl: maximum_ttl_custom + + - tag: "forward_local" + type: fast_forward + args: + upstream: + - addr: local_dns + + - tag: "forward_remote" + type: fast_forward + args: + upstream: + - addr: remote_dns + + - tag: query_is_whitelist_domain + type: query_matcher + args: + domain: + - "provider:whitelist" + + - tag: query_is_blocklist_domain + type: query_matcher + args: + domain: + - "provider:blocklist" + + - tag: query_is_greylist_domain + type: query_matcher + args: + domain: + - "provider:greylist" + + - tag: query_is_hosts_domain + type: hosts + args: + hosts: + - "provider:hosts" + + - tag: query_is_redirect_domain + type: redirect + args: + rule: + - "provider:redirect" + + - tag: query_is_local_domain + type: query_matcher + args: + domain: + - "provider:geosite:cn,apple-cn,icloud,google-cn,tld-cn" + + - tag: query_is_non_local_domain + type: query_matcher + args: + domain: + - "provider:geosite:geolocation-!cn" + + - tag: response_has_local_ip + type: response_matcher + args: + ip: + - "provider:geoip:cn" + + - tag: query_is_ad_domain + type: query_matcher + args: + domain: + - "adblock" + + - tag: match_local_ptr + type: query_matcher + args: + qtype: [12] + domain: + - "provider:local_ptr" + + - tag: match_qtype65 + type: query_matcher + args: + qtype: [65] + + - tag: "main_sequence" + type: "sequence" + args: + exec: + - _misc_optm + - query_is_hosts_domain + - query_is_redirect_domain + + - if: query_is_whitelist_domain + exec: + - forward_local + - modify_ttl + - _return + + - if: "query_is_blocklist_domain || query_is_ad_domain || match_local_ptr || match_qtype65" + exec: + - _new_nxdomain_response + - _return + + - lazy_cache + + - if: query_is_greylist_domain + exec: + - forward_remote + - modify_ttl + - _return + + - if: query_is_local_domain + exec: + - forward_local + - modify_ttl + - _return + + - if: query_is_non_local_domain + exec: + - _prefer_ipv4 + - forward_remote + - modify_ttl + - _return + - primary: + - forward_local + - if: "(! response_has_local_ip) && [_response_valid_answer]" + exec: + - _drop_response + secondary: + - _prefer_ipv4 + - forward_remote + - modify_ttl + fast_fallback: 200 + +servers: + - exec: main_sequence + listeners: + - protocol: udp + addr: ":listen_port" + - protocol: tcp + addr: ":listen_port" diff --git a/package/lean/luci-app-mosdns/root/usr/share/mosdns/mosdns.sh b/package/lean/luci-app-mosdns/root/usr/share/mosdns/mosdns.sh new file mode 100755 index 00000000000000..22d1af271a914b --- /dev/null +++ b/package/lean/luci-app-mosdns/root/usr/share/mosdns/mosdns.sh @@ -0,0 +1,86 @@ +#!/bin/sh + +logfile_path() ( + configfile=$(uci -q get mosdns.config.configfile) + if [ "$configfile" = "/etc/mosdns/config.yaml" ]; then + uci -q get mosdns.config.logfile + else + [ ! -f /etc/mosdns/config_custom.yaml ] && exit 1 + cat /etc/mosdns/config_custom.yaml | grep -A 4 log | grep file | awk -F ":" '{print $2}' | sed 's/\"//g;s/ //g' + fi +) + +interface_dns() ( + peerdns=$(uci -q get network.wan.peerdns) + proto=$(uci -q get network.wan.proto) + if [ "$peerdns" = 0 ] || [ "$proto" = "static" ]; then + uci -q get network.wan.dns + else + interface_status=$(ubus call network.interface.wan status) + echo $interface_status | jsonfilter -e "@['dns-server'][0]" + echo $interface_status | jsonfilter -e "@['dns-server'][1]" + fi + [ $? -ne 0 ] && echo "119.29.29.29" +) + +ad_block() ( + adblock=$(uci -q get mosdns.config.adblock) + if [ "$adblock" -eq 1 ]; then + ad_source=$(uci -q get mosdns.config.ad_source) + if [ "$ad_source" = "geosite.dat" ]; then + echo "provider:geosite:category-ads-all" + else + echo "provider:adlist" + fi + else + echo "full:disable-category-ads-all.null" + fi +) + +adlist_update() ( + ad_source=$(uci -q get mosdns.config.ad_source) + [ "$ad_source" = "geosite.dat" ] && exit 0 + AD_TMPDIR=$(mktemp -d) || exit 1 + if [[ "$ad_source" =~ "^https://raw.githubusercontent.com" ]]; then + google_status=$(curl -I -4 -m 3 -o /dev/null -s -w %{http_code} http://www.google.com/generate_204) + [ "$google_status" -ne "204" ] && mirror="https://ghproxy.com/" + fi + echo -e "\e[1;32mDownloading $mirror$ad_source\e[0m" + curl --connect-timeout 60 -m 90 --ipv4 -fSLo "$AD_TMPDIR/adlist.txt" "$mirror$ad_source" + if [ $? -ne 0 ]; then + rm -rf "$AD_TMPDIR" + exit 1 + else + \cp "$AD_TMPDIR/adlist.txt" /etc/mosdns/rule/adlist.txt + rm -rf "$AD_TMPDIR" + fi +) + +geodat_update() ( + geodat_download() ( + google_status=$(curl -I -4 -m 3 -o /dev/null -s -w %{http_code} http://www.google.com/generate_204) + [ "$google_status" -ne "204" ] && mirror="https://ghproxy.com/" + echo -e "\e[1;32mDownloading "$mirror"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/$1\e[0m" + curl --connect-timeout 60 -m 900 --ipv4 -fSLo "$TMPDIR/$1" ""$mirror"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/$1" + ) + TMPDIR=$(mktemp -d) || exit 1 + geodat_download geoip.dat && geodat_download geosite.dat + if [ $? -ne 0 ]; then + rm -rf "$TMPDIR" + exit 1 + fi + cp -f "$TMPDIR"/* /usr/share/v2ray + rm -rf "$TMPDIR" +) + +if [ "$1" == "dns" ]; then + interface_dns +elif [ "$1" == "ad" ]; then + ad_block +elif [ "$1" == "geodata" ]; then + geodat_update && adlist_update +elif [ "$1" == "logfile" ]; then + logfile_path +elif [ "$1" == "adlist_update" ]; then + adlist_update +fi diff --git a/package/lean/luci-app-mosdns/root/usr/share/rpcd/acl.d/luci-app-mosdns.json b/package/lean/luci-app-mosdns/root/usr/share/rpcd/acl.d/luci-app-mosdns.json new file mode 100644 index 00000000000000..6c79e330793b70 --- /dev/null +++ b/package/lean/luci-app-mosdns/root/usr/share/rpcd/acl.d/luci-app-mosdns.json @@ -0,0 +1,11 @@ +{ + "luci-app-mosdns": { + "description": "Grant UCI access for luci-app-mosdns", + "read": { + "uci": [ "mosdns" ] + }, + "write": { + "uci": [ "mosdns" ] + } + } +} diff --git a/package/lean/mosdns/Makefile b/package/lean/mosdns/Makefile new file mode 100644 index 00000000000000..77ad3227294ca8 --- /dev/null +++ b/package/lean/mosdns/Makefile @@ -0,0 +1,45 @@ +# SPDX-License-Identifier: GPL-3.0-only +# +# Copyright (C) 2021 ImmortalWrt.org + +include $(TOPDIR)/rules.mk + +PKG_NAME:=mosdns +PKG_VERSION:=4.5.3 +PKG_RELEASE:=$(AUTORELEASE) + +PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz +PKG_SOURCE_URL:=https://codeload.github.com/IrineSistiana/mosdns/tar.gz/v$(PKG_VERSION)? +PKG_HASH:=2a13b1b1d862731cf946a8ceaa99523a0eb0eaae56045dd31207b61a5a6d47ae + +PKG_LICENSE:=GPL-3.0 +PKG_LICENSE_FILE:=LICENSE +PKG_MAINTAINER:=Tianling Shen + +PKG_BUILD_DEPENDS:=golang/host +PKG_BUILD_PARALLEL:=1 +PKG_USE_MIPS16:=0 + +GO_PKG:=github.com/IrineSistiana/mosdns +GO_PKG_LDFLAGS_X:=main.version=v$(PKG_VERSION) + +include $(INCLUDE_DIR)/package.mk +include $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk + +define Package/mosdns + SECTION:=net + CATEGORY:=Network + SUBMENU:=IP Addresses and Names + TITLE:=A plug-in DNS forwarder/splitter + URL:=https://github.com/IrineSistiana/mosdns + DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle +endef + +GO_PKG_TARGET_VARS:=$(filter-out CGO_ENABLED=%,$(GO_PKG_TARGET_VARS)) CGO_ENABLED=0 + +define Package/mosdns/install + $(call GoPackage/Package/Install/Bin,$(1)) +endef + +$(eval $(call GoBinPackage,mosdns)) +$(eval $(call BuildPackage,mosdns))