From 73195d63dad515330a2c4c8af2baeba5a7321cb9 Mon Sep 17 00:00:00 2001 From: Sven Eckelmann Date: Sun, 17 Apr 2022 13:25:16 +0200 Subject: [PATCH 1/3] batman-adv: compat: Add atomic mc_forwarding support for stable kernels Eric Dumazet changed the mc_forwarding in commit 145c7a793838 ("ipv6: make mc_forwarding atomic") the type of mc_forwarding from __s32 to an atomic_t. This patch was then ported to various stable kernels. This code change caused a FTBFS when in batman-adv when CONFIG_BATMAN_ADV_MCAST was activated. To work around this problem, provide a version for kernels with __s32 mc_forwarding and a version for kernel with atomic_t mc_forwarding. Fixes: #850 Reported-by: Huangbin Zhan Signed-off-by: Sven Eckelmann --- ...batman-adv-make-mc_forwarding-atomic.patch | 27 +++++++++++++++++++ ...t-Add-atomic-mc_fowarding-support-fo.patch | 23 ++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 batman-adv/patches/0006-batman-adv-make-mc_forwarding-atomic.patch create mode 100644 batman-adv/patches/0007-batman-adv-compat-Add-atomic-mc_fowarding-support-fo.patch diff --git a/batman-adv/patches/0006-batman-adv-make-mc_forwarding-atomic.patch b/batman-adv/patches/0006-batman-adv-make-mc_forwarding-atomic.patch new file mode 100644 index 0000000..d72882e --- /dev/null +++ b/batman-adv/patches/0006-batman-adv-make-mc_forwarding-atomic.patch @@ -0,0 +1,27 @@ +From: Eric Dumazet +Date: Wed, 2 Mar 2022 20:05:13 +0100 +Subject: batman-adv: make mc_forwarding atomic + +This fixes minor data-races in ip6_mc_input() and +batadv_mcast_mla_rtr_flags_softif_get_ipv6() + +Signed-off-by: Eric Dumazet +Signed-off-by: David S. Miller +[sven@narfation.org: Add ugly hack to get it building with old kernels] +Signed-off-by: Sven Eckelmann +Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/56db7c0540e733a1f063ccd6bab1b537a80857eb + +--- a/net/batman-adv/multicast.c ++++ b/net/batman-adv/multicast.c +@@ -134,7 +134,11 @@ static u8 batadv_mcast_mla_rtr_flags_sof + { + struct inet6_dev *in6_dev = __in6_dev_get(dev); + ++#if LINUX_VERSION_IS_GEQ(5, 18, 0) // UGLY_HACK_NEW ++ if (in6_dev && atomic_read(&in6_dev->cnf.mc_forwarding)) ++#else // UGLY_HACK_OLD + if (in6_dev && in6_dev->cnf.mc_forwarding) ++#endif // UGLY_HACK_STOP + return BATADV_NO_FLAGS; + else + return BATADV_MCAST_WANT_NO_RTR6; diff --git a/batman-adv/patches/0007-batman-adv-compat-Add-atomic-mc_fowarding-support-fo.patch b/batman-adv/patches/0007-batman-adv-compat-Add-atomic-mc_fowarding-support-fo.patch new file mode 100644 index 0000000..9d5f0ac --- /dev/null +++ b/batman-adv/patches/0007-batman-adv-compat-Add-atomic-mc_fowarding-support-fo.patch @@ -0,0 +1,23 @@ +From: Sven Eckelmann +Date: Fri, 15 Apr 2022 15:12:45 +0200 +Subject: batman-adv: compat: Add atomic mc_fowarding support for stable kernels + +Fixes: 56db7c0540e7 ("batman-adv: make mc_forwarding atomic") +Signed-off-by: Sven Eckelmann +Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/350adcaec82fbaa358a2406343b6130ac8dad126 + +--- a/net/batman-adv/multicast.c ++++ b/net/batman-adv/multicast.c +@@ -134,7 +134,11 @@ static u8 batadv_mcast_mla_rtr_flags_sof + { + struct inet6_dev *in6_dev = __in6_dev_get(dev); + +-#if LINUX_VERSION_IS_GEQ(5, 18, 0) // UGLY_HACK_NEW ++#if (LINUX_VERSION_IS_GEQ(5, 4, 189) && LINUX_VERSION_IS_LESS(5, 5, 0)) || /* UGLY_HACK */ \ ++ (LINUX_VERSION_IS_GEQ(5, 10, 111) && LINUX_VERSION_IS_LESS(5, 11, 0)) || /* UGLY_HACK */ \ ++ (LINUX_VERSION_IS_GEQ(5, 15, 34) && LINUX_VERSION_IS_LESS(5, 16, 0)) || /* UGLY_HACK */ \ ++ (LINUX_VERSION_IS_GEQ(5, 16, 20) && LINUX_VERSION_IS_LESS(5, 17, 0)) || /* UGLY_HACK */ \ ++ LINUX_VERSION_IS_GEQ(5, 17, 3) // UGLY_HACK_NEW + if (in6_dev && atomic_read(&in6_dev->cnf.mc_forwarding)) + #else // UGLY_HACK_OLD + if (in6_dev && in6_dev->cnf.mc_forwarding) From 500352d44f8a8a3b12aa558a2f4a5d6e143f1832 Mon Sep 17 00:00:00 2001 From: Sven Eckelmann Date: Sun, 17 Apr 2022 13:36:52 +0200 Subject: [PATCH 2/3] batman-adv: Drop unused compat patches The minimal kernel version in OpenWrt is now Linux 5.10.111. It already provides various thing which needed special patches on older versions. Signed-off-by: Sven Eckelmann --- ...v-genetlink-move-to-smaller-ops-wher.patch | 128 ------------------ ...ild-of-multicast-code-against-Linux.patch} | 0 ...v-Add-new-include-for-min-max-helper.patch | 116 ---------------- ...v-Switch-to-kstrtox.h-for-kstrtou64.patch} | 0 ...ert-batman-adv-use-Linux-s-stdarg.h.patch} | 0 ...atman-adv-make-mc_forwarding-atomic.patch} | 0 ...-Add-atomic-mc_fowarding-support-fo.patch} | 0 7 files changed, 244 deletions(-) delete mode 100644 batman-adv/patches/0001-Revert-batman-adv-genetlink-move-to-smaller-ops-wher.patch rename batman-adv/patches/{0003-batman-adv-Fix-build-of-multicast-code-against-Linux.patch => 0001-batman-adv-Fix-build-of-multicast-code-against-Linux.patch} (100%) delete mode 100644 batman-adv/patches/0002-Revert-batman-adv-Add-new-include-for-min-max-helper.patch rename batman-adv/patches/{0004-Revert-batman-adv-Switch-to-kstrtox.h-for-kstrtou64.patch => 0002-Revert-batman-adv-Switch-to-kstrtox.h-for-kstrtou64.patch} (100%) rename batman-adv/patches/{0005-Revert-batman-adv-use-Linux-s-stdarg.h.patch => 0003-Revert-batman-adv-use-Linux-s-stdarg.h.patch} (100%) rename batman-adv/patches/{0006-batman-adv-make-mc_forwarding-atomic.patch => 0004-batman-adv-make-mc_forwarding-atomic.patch} (100%) rename batman-adv/patches/{0007-batman-adv-compat-Add-atomic-mc_fowarding-support-fo.patch => 0005-batman-adv-compat-Add-atomic-mc_fowarding-support-fo.patch} (100%) diff --git a/batman-adv/patches/0001-Revert-batman-adv-genetlink-move-to-smaller-ops-wher.patch b/batman-adv/patches/0001-Revert-batman-adv-genetlink-move-to-smaller-ops-wher.patch deleted file mode 100644 index 68187b0..0000000 --- a/batman-adv/patches/0001-Revert-batman-adv-genetlink-move-to-smaller-ops-wher.patch +++ /dev/null @@ -1,128 +0,0 @@ -From: Sven Eckelmann -Date: Sat, 24 Oct 2020 22:51:23 +0200 -Subject: Revert "batman-adv: genetlink: move to smaller ops wherever possible" - -The netlink genl_ops interface was splitted into two parts for Linux 5.10. -The batman-adv code changed to the new one because it doesn't use the more -complex policy handling of genl_ops. But the backports-5.8-1 version in -OpenWrt doesn't yet support the new genl_small_ops. - -This patch must be dropped directly when OpenWrt switches to backports-5.10 -or newer - otherwise it will not work as expected. - -This reverts commit 725b4ef5be840cfcd0ca33b9393c14dee40c10f7. - ---- a/compat-include/net/genetlink.h -+++ b/compat-include/net/genetlink.h -@@ -31,17 +31,15 @@ void batadv_genl_dump_check_consistent(s - #endif /* LINUX_VERSION_IS_LESS(4, 15, 0) */ - - --#if LINUX_VERSION_IS_LESS(5, 10, 0) -- - #if LINUX_VERSION_IS_LESS(5, 2, 0) -+ - enum genl_validate_flags { - GENL_DONT_VALIDATE_STRICT = BIT(0), - GENL_DONT_VALIDATE_DUMP = BIT(1), - GENL_DONT_VALIDATE_DUMP_STRICT = BIT(2), - }; --#endif /* LINUX_VERSION_IS_LESS(5, 2, 0) */ - --struct batadv_genl_small_ops { -+struct batadv_genl_ops { - int (*doit)(struct sk_buff *skb, - struct genl_info *info); - int (*dumpit)(struct sk_buff *skb, -@@ -70,9 +68,9 @@ struct batadv_genl_family { - struct genl_info *info); - void (*post_doit)(const struct genl_ops *ops, struct sk_buff *skb, - struct genl_info *info); -- const struct batadv_genl_small_ops *small_ops; -+ const struct batadv_genl_ops *ops; - const struct genl_multicast_group *mcgrps; -- unsigned int n_small_ops; -+ unsigned int n_ops; - unsigned int n_mcgrps; - struct module *module; - -@@ -96,32 +94,24 @@ static inline int batadv_genl_register_f - family->family.pre_doit = family->pre_doit; - family->family.post_doit = family->post_doit; - family->family.mcgrps = family->mcgrps; -- family->family.n_ops = family->n_small_ops; -+ family->family.n_ops = family->n_ops; - family->family.n_mcgrps = family->n_mcgrps; - family->family.module = family->module; - -- ops = kzalloc(sizeof(*ops) * family->n_small_ops, GFP_KERNEL); -+ ops = kzalloc(sizeof(*ops) * family->n_ops, GFP_KERNEL); - if (!ops) - return -ENOMEM; - - for (i = 0; i < family->family.n_ops; i++) { -- ops[i].doit = family->small_ops[i].doit; -- ops[i].dumpit = family->small_ops[i].dumpit; -- ops[i].done = family->small_ops[i].done; -- ops[i].cmd = family->small_ops[i].cmd; -- ops[i].internal_flags = family->small_ops[i].internal_flags; -- ops[i].flags = family->small_ops[i].flags; --#if LINUX_VERSION_IS_GEQ(5, 2, 0) -- ops[i].validate = family->small_ops[i].validate; --#else -+ ops[i].doit = family->ops[i].doit; -+ ops[i].dumpit = family->ops[i].dumpit; -+ ops[i].done = family->ops[i].done; -+ ops[i].cmd = family->ops[i].cmd; -+ ops[i].internal_flags = family->ops[i].internal_flags; -+ ops[i].flags = family->ops[i].flags; - ops[i].policy = family->policy; --#endif - } - --#if LINUX_VERSION_IS_GEQ(5, 2, 0) -- family->family.policy = family->policy; --#endif -- - family->family.ops = ops; - family->copy_ops = ops; - -@@ -136,7 +126,7 @@ typedef struct genl_ops batadv_genl_ops_ - #define batadv_post_doit(__x, __y, __z) \ - batadv_post_doit(const batadv_genl_ops_old *ops, __y, __z) - --#define genl_small_ops batadv_genl_small_ops -+#define genl_ops batadv_genl_ops - #define genl_family batadv_genl_family - - #define genl_register_family(family) \ -@@ -160,6 +150,6 @@ batadv_genl_unregister_family(struct bat - genlmsg_multicast_netns(&(_family)->family, _net, _skb, _portid, \ - _group, _flags) - --#endif /* LINUX_VERSION_IS_LESS(5, 10, 0) */ -+#endif /* LINUX_VERSION_IS_LESS(5, 2, 0) */ - - #endif /* _NET_BATMAN_ADV_COMPAT_NET_GENETLINK_H_ */ ---- a/net/batman-adv/netlink.c -+++ b/net/batman-adv/netlink.c -@@ -1357,7 +1357,7 @@ static void batadv_post_doit(const struc - } - } - --static const struct genl_small_ops batadv_netlink_ops[] = { -+static const struct genl_ops batadv_netlink_ops[] = { - { - .cmd = BATADV_CMD_GET_MESH, - .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, -@@ -1491,8 +1491,8 @@ struct genl_family batadv_netlink_family - .pre_doit = batadv_pre_doit, - .post_doit = batadv_post_doit, - .module = THIS_MODULE, -- .small_ops = batadv_netlink_ops, -- .n_small_ops = ARRAY_SIZE(batadv_netlink_ops), -+ .ops = batadv_netlink_ops, -+ .n_ops = ARRAY_SIZE(batadv_netlink_ops), - .mcgrps = batadv_netlink_mcgrps, - .n_mcgrps = ARRAY_SIZE(batadv_netlink_mcgrps), - }; diff --git a/batman-adv/patches/0003-batman-adv-Fix-build-of-multicast-code-against-Linux.patch b/batman-adv/patches/0001-batman-adv-Fix-build-of-multicast-code-against-Linux.patch similarity index 100% rename from batman-adv/patches/0003-batman-adv-Fix-build-of-multicast-code-against-Linux.patch rename to batman-adv/patches/0001-batman-adv-Fix-build-of-multicast-code-against-Linux.patch diff --git a/batman-adv/patches/0002-Revert-batman-adv-Add-new-include-for-min-max-helper.patch b/batman-adv/patches/0002-Revert-batman-adv-Add-new-include-for-min-max-helper.patch deleted file mode 100644 index 6f4b56f..0000000 --- a/batman-adv/patches/0002-Revert-batman-adv-Add-new-include-for-min-max-helper.patch +++ /dev/null @@ -1,116 +0,0 @@ -From: Sven Eckelmann -Date: Thu, 28 Jan 2021 21:06:51 +0100 -Subject: Revert "batman-adv: Add new include for min/max helpers" - -The OpenWrt kernel sources and backports sources are currently missing this -header. - -This reverts commit 1810de05310d5c5e9140f870ac21052f38bc06b8. - -Signed-off-by: Sven Eckelmann - ---- a/compat-include/linux/minmax.h -+++ /dev/null -@@ -1,20 +0,0 @@ --/* SPDX-License-Identifier: GPL-2.0 */ --/* Copyright (C) B.A.T.M.A.N. contributors: -- * -- * Marek Lindner, Simon Wunderlich -- * -- * This file contains macros for maintaining compatibility with older versions -- * of the Linux kernel. -- */ -- --#ifndef _NET_BATMAN_ADV_COMPAT_LINUX_MINMAX_H_ --#define _NET_BATMAN_ADV_COMPAT_LINUX_MINMAX_H_ -- --#include --#if LINUX_VERSION_IS_GEQ(5, 10, 0) --#include_next --#else --#include --#endif -- --#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_MINMAX_H_ */ ---- a/net/batman-adv/bat_v.c -+++ b/net/batman-adv/bat_v.c -@@ -15,7 +15,6 @@ - #include - #include - #include --#include - #include - #include - #include ---- a/net/batman-adv/bat_v_elp.c -+++ b/net/batman-adv/bat_v_elp.c -@@ -18,7 +18,6 @@ - #include - #include - #include --#include - #include - #include - #include ---- a/net/batman-adv/bat_v_ogm.c -+++ b/net/batman-adv/bat_v_ogm.c -@@ -18,7 +18,6 @@ - #include - #include - #include --#include - #include - #include - #include ---- a/net/batman-adv/fragmentation.c -+++ b/net/batman-adv/fragmentation.c -@@ -14,8 +14,8 @@ - #include - #include - #include -+#include - #include --#include - #include - #include - #include ---- a/net/batman-adv/hard-interface.c -+++ b/net/batman-adv/hard-interface.c -@@ -17,7 +17,6 @@ - #include - #include - #include --#include - #include - #include - #include ---- a/net/batman-adv/main.c -+++ b/net/batman-adv/main.c -@@ -23,7 +23,6 @@ - #include - #include - #include --#include - #include - #include - #include ---- a/net/batman-adv/netlink.c -+++ b/net/batman-adv/netlink.c -@@ -23,7 +23,6 @@ - #include - #include - #include --#include - #include - #include - #include ---- a/net/batman-adv/tp_meter.c -+++ b/net/batman-adv/tp_meter.c -@@ -23,7 +23,6 @@ - #include - #include - #include --#include - #include - #include - #include diff --git a/batman-adv/patches/0004-Revert-batman-adv-Switch-to-kstrtox.h-for-kstrtou64.patch b/batman-adv/patches/0002-Revert-batman-adv-Switch-to-kstrtox.h-for-kstrtou64.patch similarity index 100% rename from batman-adv/patches/0004-Revert-batman-adv-Switch-to-kstrtox.h-for-kstrtou64.patch rename to batman-adv/patches/0002-Revert-batman-adv-Switch-to-kstrtox.h-for-kstrtou64.patch diff --git a/batman-adv/patches/0005-Revert-batman-adv-use-Linux-s-stdarg.h.patch b/batman-adv/patches/0003-Revert-batman-adv-use-Linux-s-stdarg.h.patch similarity index 100% rename from batman-adv/patches/0005-Revert-batman-adv-use-Linux-s-stdarg.h.patch rename to batman-adv/patches/0003-Revert-batman-adv-use-Linux-s-stdarg.h.patch diff --git a/batman-adv/patches/0006-batman-adv-make-mc_forwarding-atomic.patch b/batman-adv/patches/0004-batman-adv-make-mc_forwarding-atomic.patch similarity index 100% rename from batman-adv/patches/0006-batman-adv-make-mc_forwarding-atomic.patch rename to batman-adv/patches/0004-batman-adv-make-mc_forwarding-atomic.patch diff --git a/batman-adv/patches/0007-batman-adv-compat-Add-atomic-mc_fowarding-support-fo.patch b/batman-adv/patches/0005-batman-adv-compat-Add-atomic-mc_fowarding-support-fo.patch similarity index 100% rename from batman-adv/patches/0007-batman-adv-compat-Add-atomic-mc_fowarding-support-fo.patch rename to batman-adv/patches/0005-batman-adv-compat-Add-atomic-mc_fowarding-support-fo.patch From b1d9a55b49638f66fc764a40c90c608f387f8c14 Mon Sep 17 00:00:00 2001 From: Sven Eckelmann Date: Sun, 17 Apr 2022 13:39:43 +0200 Subject: [PATCH 3/3] batman-adv: Drop compat hacks for kernels < 5.10 OpenWrt master is no longer providing any kernels older than 5.10. Just drop the compat-hacks for older kernels to make it easier to maintain the package. Signed-off-by: Sven Eckelmann --- batman-adv/src/compat-hacks.h | 44 ----------------------------------- 1 file changed, 44 deletions(-) diff --git a/batman-adv/src/compat-hacks.h b/batman-adv/src/compat-hacks.h index 99a1bb3..74107b6 100644 --- a/batman-adv/src/compat-hacks.h +++ b/batman-adv/src/compat-hacks.h @@ -5,50 +5,6 @@ #include /* LINUX_VERSION_CODE */ #include -#if LINUX_VERSION_IS_LESS(5, 10, 0) - -#include - -struct batadv_br_ip { - union { - __be32 ip4; -#if IS_ENABLED(CONFIG_IPV6) - struct in6_addr ip6; -#endif - } dst; - __be16 proto; - __u16 vid; -}; - -struct batadv_br_ip_list { - struct list_head list; - struct batadv_br_ip addr; -}; - -#if 0 -/* "static" dropped to force compiler to evaluate it as part of multicast.c - * might need to be added again and then called in some kind of dummy - * compat.c in case this header is included in multiple files. - */ -inline void __batadv_br_ip_list_check(void) -{ - BUILD_BUG_ON(sizeof(struct batadv_br_ip_list) != sizeof(struct br_ip_list)); - BUILD_BUG_ON(offsetof(struct batadv_br_ip_list, list) != offsetof(struct br_ip_list, list)); - BUILD_BUG_ON(offsetof(struct batadv_br_ip_list, addr) != offsetof(struct br_ip_list, addr)); - - BUILD_BUG_ON(sizeof(struct batadv_br_ip) != sizeof(struct br_ip)); - BUILD_BUG_ON(offsetof(struct batadv_br_ip, dst.ip4) != offsetof(struct br_ip, u.ip4)); - BUILD_BUG_ON(offsetof(struct batadv_br_ip, dst.ip6) != offsetof(struct br_ip, u.ip6)); - BUILD_BUG_ON(offsetof(struct batadv_br_ip, proto) != offsetof(struct br_ip, proto)); - BUILD_BUG_ON(offsetof(struct batadv_br_ip, vid) != offsetof(struct br_ip, vid)); -} -#endif - -#define br_ip batadv_br_ip -#define br_ip_list batadv_br_ip_list - -#endif /* LINUX_VERSION_IS_LESS(5, 10, 0) */ - #if LINUX_VERSION_IS_LESS(5, 14, 0) #include