Merge pull request #752 from ecsv/batadv-for-19.07
openwrt-19.07: batman-adv: Merge bugfixes from 2021.4
This commit is contained in:
commit
ee0fbac610
|
@ -7,11 +7,9 @@ API of Linux 5.2.
|
||||||
|
|
||||||
This reverts commit 337ae19a00d4455cf84afa58abfb432f78c882b9.
|
This reverts commit 337ae19a00d4455cf84afa58abfb432f78c882b9.
|
||||||
|
|
||||||
diff --git a/compat-include/linux/fs.h b/compat-include/linux/fs.h
|
|
||||||
index 480722f04ba7ddefc837d5e55a340271e0814b14..c52e0e8e87584d106ab64ef2c522e6ac1ff6e796 100644
|
|
||||||
--- a/compat-include/linux/fs.h
|
--- a/compat-include/linux/fs.h
|
||||||
+++ b/compat-include/linux/fs.h
|
+++ b/compat-include/linux/fs.h
|
||||||
@@ -31,15 +31,4 @@ static inline struct dentry *batadv_file_dentry(const struct file *file)
|
@@ -31,15 +31,4 @@ static inline struct dentry *batadv_file
|
||||||
|
|
||||||
#endif /* < KERNEL_VERSION(4, 6, 0) */
|
#endif /* < KERNEL_VERSION(4, 6, 0) */
|
||||||
|
|
||||||
|
@ -27,11 +25,9 @@ index 480722f04ba7ddefc837d5e55a340271e0814b14..c52e0e8e87584d106ab64ef2c522e6ac
|
||||||
-#endif /* < KERNEL_VERSION(5, 2, 0) */
|
-#endif /* < KERNEL_VERSION(5, 2, 0) */
|
||||||
-
|
-
|
||||||
#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_FS_H_ */
|
#endif /* _NET_BATMAN_ADV_COMPAT_LINUX_FS_H_ */
|
||||||
diff --git a/net/batman-adv/icmp_socket.c b/net/batman-adv/icmp_socket.c
|
|
||||||
index 0a91c8661357d4ddbea1ba20dcd0df67b8ba5a97..de81b5ecad91afd8d684edbf781c70a3bae38c60 100644
|
|
||||||
--- a/net/batman-adv/icmp_socket.c
|
--- a/net/batman-adv/icmp_socket.c
|
||||||
+++ b/net/batman-adv/icmp_socket.c
|
+++ b/net/batman-adv/icmp_socket.c
|
||||||
@@ -65,7 +65,7 @@ static int batadv_socket_open(struct inode *inode, struct file *file)
|
@@ -65,7 +65,7 @@ static int batadv_socket_open(struct ino
|
||||||
|
|
||||||
batadv_debugfs_deprecated(file, "");
|
batadv_debugfs_deprecated(file, "");
|
||||||
|
|
||||||
|
@ -40,11 +36,9 @@ index 0a91c8661357d4ddbea1ba20dcd0df67b8ba5a97..de81b5ecad91afd8d684edbf781c70a3
|
||||||
|
|
||||||
socket_client = kmalloc(sizeof(*socket_client), GFP_KERNEL);
|
socket_client = kmalloc(sizeof(*socket_client), GFP_KERNEL);
|
||||||
if (!socket_client) {
|
if (!socket_client) {
|
||||||
diff --git a/net/batman-adv/log.c b/net/batman-adv/log.c
|
|
||||||
index f79ebd5b46e95b3b6de717c7ea1ecf44e5c96051..60ce11e16a905e790424a2d7aca81c1f945c1ec2 100644
|
|
||||||
--- a/net/batman-adv/log.c
|
--- a/net/batman-adv/log.c
|
||||||
+++ b/net/batman-adv/log.c
|
+++ b/net/batman-adv/log.c
|
||||||
@@ -90,7 +90,7 @@ static int batadv_log_open(struct inode *inode, struct file *file)
|
@@ -90,7 +90,7 @@ static int batadv_log_open(struct inode
|
||||||
batadv_debugfs_deprecated(file,
|
batadv_debugfs_deprecated(file,
|
||||||
"Use tracepoint batadv:batadv_dbg instead\n");
|
"Use tracepoint batadv:batadv_dbg instead\n");
|
||||||
|
|
||||||
|
|
|
@ -7,8 +7,6 @@ API of Linux 5.2.
|
||||||
|
|
||||||
This reverts commit 1d30dbe3917d0d6fdb8ba473dfdd6265ac46670b.
|
This reverts commit 1d30dbe3917d0d6fdb8ba473dfdd6265ac46670b.
|
||||||
|
|
||||||
diff --git a/compat-include/net/genetlink.h b/compat-include/net/genetlink.h
|
|
||||||
index ee5b82288be97193c1a8e8340a2ea7e0c7ce112c..fbfdb733a3dd63c251def43cae416c7fe32cadab 100644
|
|
||||||
--- a/compat-include/net/genetlink.h
|
--- a/compat-include/net/genetlink.h
|
||||||
+++ b/compat-include/net/genetlink.h
|
+++ b/compat-include/net/genetlink.h
|
||||||
@@ -42,6 +42,7 @@ enum genl_validate_flags {
|
@@ -42,6 +42,7 @@ enum genl_validate_flags {
|
||||||
|
@ -19,7 +17,7 @@ index ee5b82288be97193c1a8e8340a2ea7e0c7ce112c..fbfdb733a3dd63c251def43cae416c7f
|
||||||
int (*dumpit)(struct sk_buff *skb,
|
int (*dumpit)(struct sk_buff *skb,
|
||||||
struct netlink_callback *cb);
|
struct netlink_callback *cb);
|
||||||
int (*done)(struct netlink_callback *cb);
|
int (*done)(struct netlink_callback *cb);
|
||||||
@@ -104,6 +105,7 @@ static inline int batadv_genl_register_family(struct batadv_genl_family *family)
|
@@ -104,6 +105,7 @@ static inline int batadv_genl_register_f
|
||||||
|
|
||||||
for (i = 0; i < family->family.n_ops; i++) {
|
for (i = 0; i < family->family.n_ops; i++) {
|
||||||
ops[i].doit = family->ops[i].doit;
|
ops[i].doit = family->ops[i].doit;
|
||||||
|
|
|
@ -7,11 +7,9 @@ API of Linux 5.2.
|
||||||
|
|
||||||
This reverts commit 2ee47abaeb35ca62bb909830e10b0e973393b853.
|
This reverts commit 2ee47abaeb35ca62bb909830e10b0e973393b853.
|
||||||
|
|
||||||
diff --git a/compat-include/net/genetlink.h b/compat-include/net/genetlink.h
|
|
||||||
index fbfdb733a3dd63c251def43cae416c7fe32cadab..7d17a705273650355f074788e9220fc4981b0db1 100644
|
|
||||||
--- a/compat-include/net/genetlink.h
|
--- a/compat-include/net/genetlink.h
|
||||||
+++ b/compat-include/net/genetlink.h
|
+++ b/compat-include/net/genetlink.h
|
||||||
@@ -33,25 +33,6 @@ void batadv_genl_dump_check_consistent(struct netlink_callback *cb,
|
@@ -33,25 +33,6 @@ void batadv_genl_dump_check_consistent(s
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 2, 0)
|
#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 2, 0)
|
||||||
|
|
||||||
|
@ -55,7 +53,7 @@ index fbfdb733a3dd63c251def43cae416c7fe32cadab..7d17a705273650355f074788e9220fc4
|
||||||
static inline int batadv_genl_register_family(struct batadv_genl_family *family)
|
static inline int batadv_genl_register_family(struct batadv_genl_family *family)
|
||||||
{
|
{
|
||||||
struct genl_ops *ops;
|
struct genl_ops *ops;
|
||||||
@@ -99,20 +82,12 @@ static inline int batadv_genl_register_family(struct batadv_genl_family *family)
|
@@ -99,20 +82,12 @@ static inline int batadv_genl_register_f
|
||||||
family->family.n_mcgrps = family->n_mcgrps;
|
family->family.n_mcgrps = family->n_mcgrps;
|
||||||
family->family.module = family->module;
|
family->family.module = family->module;
|
||||||
|
|
||||||
|
@ -78,7 +76,7 @@ index fbfdb733a3dd63c251def43cae416c7fe32cadab..7d17a705273650355f074788e9220fc4
|
||||||
|
|
||||||
family->family.ops = ops;
|
family->family.ops = ops;
|
||||||
family->copy_ops = ops;
|
family->copy_ops = ops;
|
||||||
@@ -120,17 +95,6 @@ static inline int batadv_genl_register_family(struct batadv_genl_family *family)
|
@@ -120,17 +95,6 @@ static inline int batadv_genl_register_f
|
||||||
return genl_register_family(&family->family);
|
return genl_register_family(&family->family);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,11 +94,9 @@ index fbfdb733a3dd63c251def43cae416c7fe32cadab..7d17a705273650355f074788e9220fc4
|
||||||
#define genl_register_family(family) \
|
#define genl_register_family(family) \
|
||||||
batadv_genl_register_family((family))
|
batadv_genl_register_family((family))
|
||||||
|
|
||||||
diff --git a/net/batman-adv/netlink.c b/net/batman-adv/netlink.c
|
|
||||||
index a67720fad46ca496c932c0306e2f7ec4ed496fc9..e7907308b331ddc3e4917ff7d648bca27a65536b 100644
|
|
||||||
--- a/net/batman-adv/netlink.c
|
--- a/net/batman-adv/netlink.c
|
||||||
+++ b/net/batman-adv/netlink.c
|
+++ b/net/batman-adv/netlink.c
|
||||||
@@ -1343,34 +1343,29 @@ static void batadv_post_doit(const struct genl_ops *ops, struct sk_buff *skb,
|
@@ -1343,34 +1343,29 @@ static void batadv_post_doit(const struc
|
||||||
static const struct genl_ops batadv_netlink_ops[] = {
|
static const struct genl_ops batadv_netlink_ops[] = {
|
||||||
{
|
{
|
||||||
.cmd = BATADV_CMD_GET_MESH,
|
.cmd = BATADV_CMD_GET_MESH,
|
||||||
|
@ -135,7 +131,7 @@ index a67720fad46ca496c932c0306e2f7ec4ed496fc9..e7907308b331ddc3e4917ff7d648bca2
|
||||||
/* can be retrieved by unprivileged users */
|
/* can be retrieved by unprivileged users */
|
||||||
.dumpit = batadv_netlink_dump_hardif,
|
.dumpit = batadv_netlink_dump_hardif,
|
||||||
.doit = batadv_netlink_get_hardif,
|
.doit = batadv_netlink_get_hardif,
|
||||||
@@ -1379,68 +1374,57 @@ static const struct genl_ops batadv_netlink_ops[] = {
|
@@ -1379,68 +1374,57 @@ static const struct genl_ops batadv_netl
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.cmd = BATADV_CMD_GET_TRANSTABLE_LOCAL,
|
.cmd = BATADV_CMD_GET_TRANSTABLE_LOCAL,
|
||||||
|
@ -204,7 +200,7 @@ index a67720fad46ca496c932c0306e2f7ec4ed496fc9..e7907308b331ddc3e4917ff7d648bca2
|
||||||
.flags = GENL_ADMIN_PERM,
|
.flags = GENL_ADMIN_PERM,
|
||||||
.doit = batadv_netlink_set_hardif,
|
.doit = batadv_netlink_set_hardif,
|
||||||
.internal_flags = BATADV_FLAG_NEED_MESH |
|
.internal_flags = BATADV_FLAG_NEED_MESH |
|
||||||
@@ -1448,7 +1432,6 @@ static const struct genl_ops batadv_netlink_ops[] = {
|
@@ -1448,7 +1432,6 @@ static const struct genl_ops batadv_netl
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.cmd = BATADV_CMD_GET_VLAN,
|
.cmd = BATADV_CMD_GET_VLAN,
|
||||||
|
@ -212,7 +208,7 @@ index a67720fad46ca496c932c0306e2f7ec4ed496fc9..e7907308b331ddc3e4917ff7d648bca2
|
||||||
/* can be retrieved by unprivileged users */
|
/* can be retrieved by unprivileged users */
|
||||||
.doit = batadv_netlink_get_vlan,
|
.doit = batadv_netlink_get_vlan,
|
||||||
.internal_flags = BATADV_FLAG_NEED_MESH |
|
.internal_flags = BATADV_FLAG_NEED_MESH |
|
||||||
@@ -1456,7 +1439,6 @@ static const struct genl_ops batadv_netlink_ops[] = {
|
@@ -1456,7 +1439,6 @@ static const struct genl_ops batadv_netl
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.cmd = BATADV_CMD_SET_VLAN,
|
.cmd = BATADV_CMD_SET_VLAN,
|
||||||
|
|
|
@ -7,8 +7,6 @@ API of Linux 5.2.
|
||||||
|
|
||||||
This reverts commit acfc9a214d01695d1676313ca80cfd2d9309f633.
|
This reverts commit acfc9a214d01695d1676313ca80cfd2d9309f633.
|
||||||
|
|
||||||
diff --git a/compat-include/linux/cache.h b/compat-include/linux/cache.h
|
|
||||||
index 9ddda31232ed4b58efcb57dc2ee99ae82d09d6e2..efe440d11d04a1c3999649ba52058ad82e4d6bea 100644
|
|
||||||
--- a/compat-include/linux/cache.h
|
--- a/compat-include/linux/cache.h
|
||||||
+++ b/compat-include/linux/cache.h
|
+++ b/compat-include/linux/cache.h
|
||||||
@@ -13,8 +13,12 @@
|
@@ -13,8 +13,12 @@
|
||||||
|
@ -25,11 +23,9 @@ index 9ddda31232ed4b58efcb57dc2ee99ae82d09d6e2..efe440d11d04a1c3999649ba52058ad8
|
||||||
#define __ro_after_init
|
#define __ro_after_init
|
||||||
|
|
||||||
#endif /* < KERNEL_VERSION(4, 6, 0) */
|
#endif /* < KERNEL_VERSION(4, 6, 0) */
|
||||||
diff --git a/compat-include/net/genetlink.h b/compat-include/net/genetlink.h
|
|
||||||
index 7d17a705273650355f074788e9220fc4981b0db1..58fc24d7147a7f79c2db1976b36351d294f2aa4c 100644
|
|
||||||
--- a/compat-include/net/genetlink.h
|
--- a/compat-include/net/genetlink.h
|
||||||
+++ b/compat-include/net/genetlink.h
|
+++ b/compat-include/net/genetlink.h
|
||||||
@@ -30,92 +30,4 @@ void batadv_genl_dump_check_consistent(struct netlink_callback *cb,
|
@@ -30,92 +30,4 @@ void batadv_genl_dump_check_consistent(s
|
||||||
|
|
||||||
#endif /* < KERNEL_VERSION(4, 15, 0) */
|
#endif /* < KERNEL_VERSION(4, 15, 0) */
|
||||||
|
|
||||||
|
@ -122,11 +118,9 @@ index 7d17a705273650355f074788e9220fc4981b0db1..58fc24d7147a7f79c2db1976b36351d2
|
||||||
-#endif /* < KERNEL_VERSION(5, 2, 0) */
|
-#endif /* < KERNEL_VERSION(5, 2, 0) */
|
||||||
-
|
-
|
||||||
#endif /* _NET_BATMAN_ADV_COMPAT_NET_GENETLINK_H_ */
|
#endif /* _NET_BATMAN_ADV_COMPAT_NET_GENETLINK_H_ */
|
||||||
diff --git a/net/batman-adv/netlink.c b/net/batman-adv/netlink.c
|
|
||||||
index e7907308b331ddc3e4917ff7d648bca27a65536b..daf56933223d478399c63360203bcf283d7686a3 100644
|
|
||||||
--- a/net/batman-adv/netlink.c
|
--- a/net/batman-adv/netlink.c
|
||||||
+++ b/net/batman-adv/netlink.c
|
+++ b/net/batman-adv/netlink.c
|
||||||
@@ -1344,29 +1344,34 @@ static const struct genl_ops batadv_netlink_ops[] = {
|
@@ -1344,29 +1344,34 @@ static const struct genl_ops batadv_netl
|
||||||
{
|
{
|
||||||
.cmd = BATADV_CMD_GET_MESH,
|
.cmd = BATADV_CMD_GET_MESH,
|
||||||
/* can be retrieved by unprivileged users */
|
/* can be retrieved by unprivileged users */
|
||||||
|
@ -161,7 +155,7 @@ index e7907308b331ddc3e4917ff7d648bca27a65536b..daf56933223d478399c63360203bcf28
|
||||||
.dumpit = batadv_netlink_dump_hardif,
|
.dumpit = batadv_netlink_dump_hardif,
|
||||||
.doit = batadv_netlink_get_hardif,
|
.doit = batadv_netlink_get_hardif,
|
||||||
.internal_flags = BATADV_FLAG_NEED_MESH |
|
.internal_flags = BATADV_FLAG_NEED_MESH |
|
||||||
@@ -1375,57 +1380,68 @@ static const struct genl_ops batadv_netlink_ops[] = {
|
@@ -1375,57 +1380,68 @@ static const struct genl_ops batadv_netl
|
||||||
{
|
{
|
||||||
.cmd = BATADV_CMD_GET_TRANSTABLE_LOCAL,
|
.cmd = BATADV_CMD_GET_TRANSTABLE_LOCAL,
|
||||||
.flags = GENL_ADMIN_PERM,
|
.flags = GENL_ADMIN_PERM,
|
||||||
|
@ -230,7 +224,7 @@ index e7907308b331ddc3e4917ff7d648bca27a65536b..daf56933223d478399c63360203bcf28
|
||||||
.doit = batadv_netlink_set_hardif,
|
.doit = batadv_netlink_set_hardif,
|
||||||
.internal_flags = BATADV_FLAG_NEED_MESH |
|
.internal_flags = BATADV_FLAG_NEED_MESH |
|
||||||
BATADV_FLAG_NEED_HARDIF,
|
BATADV_FLAG_NEED_HARDIF,
|
||||||
@@ -1433,6 +1449,7 @@ static const struct genl_ops batadv_netlink_ops[] = {
|
@@ -1433,6 +1449,7 @@ static const struct genl_ops batadv_netl
|
||||||
{
|
{
|
||||||
.cmd = BATADV_CMD_GET_VLAN,
|
.cmd = BATADV_CMD_GET_VLAN,
|
||||||
/* can be retrieved by unprivileged users */
|
/* can be retrieved by unprivileged users */
|
||||||
|
@ -238,7 +232,7 @@ index e7907308b331ddc3e4917ff7d648bca27a65536b..daf56933223d478399c63360203bcf28
|
||||||
.doit = batadv_netlink_get_vlan,
|
.doit = batadv_netlink_get_vlan,
|
||||||
.internal_flags = BATADV_FLAG_NEED_MESH |
|
.internal_flags = BATADV_FLAG_NEED_MESH |
|
||||||
BATADV_FLAG_NEED_VLAN,
|
BATADV_FLAG_NEED_VLAN,
|
||||||
@@ -1440,6 +1457,7 @@ static const struct genl_ops batadv_netlink_ops[] = {
|
@@ -1440,6 +1457,7 @@ static const struct genl_ops batadv_netl
|
||||||
{
|
{
|
||||||
.cmd = BATADV_CMD_SET_VLAN,
|
.cmd = BATADV_CMD_SET_VLAN,
|
||||||
.flags = GENL_ADMIN_PERM,
|
.flags = GENL_ADMIN_PERM,
|
||||||
|
@ -246,7 +240,7 @@ index e7907308b331ddc3e4917ff7d648bca27a65536b..daf56933223d478399c63360203bcf28
|
||||||
.doit = batadv_netlink_set_vlan,
|
.doit = batadv_netlink_set_vlan,
|
||||||
.internal_flags = BATADV_FLAG_NEED_MESH |
|
.internal_flags = BATADV_FLAG_NEED_MESH |
|
||||||
BATADV_FLAG_NEED_VLAN,
|
BATADV_FLAG_NEED_VLAN,
|
||||||
@@ -1451,7 +1469,6 @@ struct genl_family batadv_netlink_family __ro_after_init = {
|
@@ -1451,7 +1469,6 @@ struct genl_family batadv_netlink_family
|
||||||
.name = BATADV_NL_NAME,
|
.name = BATADV_NL_NAME,
|
||||||
.version = 1,
|
.version = 1,
|
||||||
.maxattr = BATADV_ATTR_MAX,
|
.maxattr = BATADV_ATTR_MAX,
|
||||||
|
|
|
@ -24,11 +24,9 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/c92331e0df3c0c5645ee5a897eb018c5da5e4aa5
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/c92331e0df3c0c5645ee5a897eb018c5da5e4aa5
|
||||||
|
|
||||||
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
|
|
||||||
index bd4138ddf7e09a0020d9842d603dc98f21e225c7..240ed70912d6a014c0a48280741989133034396c 100644
|
|
||||||
--- a/net/batman-adv/bat_iv_ogm.c
|
--- a/net/batman-adv/bat_iv_ogm.c
|
||||||
+++ b/net/batman-adv/bat_iv_ogm.c
|
+++ b/net/batman-adv/bat_iv_ogm.c
|
||||||
@@ -2337,7 +2337,7 @@ batadv_iv_ogm_neigh_is_sob(struct batadv_neigh_node *neigh1,
|
@@ -2337,7 +2337,7 @@ batadv_iv_ogm_neigh_is_sob(struct batadv
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,7 +35,7 @@ index bd4138ddf7e09a0020d9842d603dc98f21e225c7..240ed70912d6a014c0a4828074198913
|
||||||
{
|
{
|
||||||
/* begin scheduling originator messages on that interface */
|
/* begin scheduling originator messages on that interface */
|
||||||
batadv_iv_ogm_schedule(hard_iface);
|
batadv_iv_ogm_schedule(hard_iface);
|
||||||
@@ -2683,8 +2683,8 @@ static void batadv_iv_gw_dump(struct sk_buff *msg, struct netlink_callback *cb,
|
@@ -2683,8 +2683,8 @@ unlock:
|
||||||
static struct batadv_algo_ops batadv_batman_iv __read_mostly = {
|
static struct batadv_algo_ops batadv_batman_iv __read_mostly = {
|
||||||
.name = "BATMAN_IV",
|
.name = "BATMAN_IV",
|
||||||
.iface = {
|
.iface = {
|
||||||
|
@ -47,11 +45,9 @@ index bd4138ddf7e09a0020d9842d603dc98f21e225c7..240ed70912d6a014c0a4828074198913
|
||||||
.disable = batadv_iv_ogm_iface_disable,
|
.disable = batadv_iv_ogm_iface_disable,
|
||||||
.update_mac = batadv_iv_ogm_iface_update_mac,
|
.update_mac = batadv_iv_ogm_iface_update_mac,
|
||||||
.primary_set = batadv_iv_ogm_primary_iface_set,
|
.primary_set = batadv_iv_ogm_primary_iface_set,
|
||||||
diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
|
|
||||||
index 79d1731b83066c60f9aef958d2bc343233bce67a..3719cfd026f04093f5d86ffe1b41a41849b2af62 100644
|
|
||||||
--- a/net/batman-adv/hard-interface.c
|
--- a/net/batman-adv/hard-interface.c
|
||||||
+++ b/net/batman-adv/hard-interface.c
|
+++ b/net/batman-adv/hard-interface.c
|
||||||
@@ -795,6 +795,9 @@ int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,
|
@@ -795,6 +795,9 @@ int batadv_hardif_enable_interface(struc
|
||||||
|
|
||||||
batadv_hardif_recalc_extra_skbroom(soft_iface);
|
batadv_hardif_recalc_extra_skbroom(soft_iface);
|
||||||
|
|
||||||
|
@ -61,8 +57,6 @@ index 79d1731b83066c60f9aef958d2bc343233bce67a..3719cfd026f04093f5d86ffe1b41a418
|
||||||
out:
|
out:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
|
|
||||||
index 74b644738a36bfe063eef6df016278b45a1a0256..e0b25104cbfa9f715df364658621c29faa7ad637 100644
|
|
||||||
--- a/net/batman-adv/types.h
|
--- a/net/batman-adv/types.h
|
||||||
+++ b/net/batman-adv/types.h
|
+++ b/net/batman-adv/types.h
|
||||||
@@ -2129,6 +2129,9 @@ struct batadv_algo_iface_ops {
|
@@ -2129,6 +2129,9 @@ struct batadv_algo_iface_ops {
|
||||||
|
|
|
@ -14,11 +14,9 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/d1de7f7aa316d6f7b3268f61afa88f5d2c1a5db5
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/d1de7f7aa316d6f7b3268f61afa88f5d2c1a5db5
|
||||||
|
|
||||||
diff --git a/net/batman-adv/multicast.c b/net/batman-adv/multicast.c
|
|
||||||
index ec54e236e345432496df8f55b2e00fbad92f3444..50fe9dfb088b60a911756c8c22cac1db6ef10ca4 100644
|
|
||||||
--- a/net/batman-adv/multicast.c
|
--- a/net/batman-adv/multicast.c
|
||||||
+++ b/net/batman-adv/multicast.c
|
+++ b/net/batman-adv/multicast.c
|
||||||
@@ -1653,7 +1653,7 @@ __batadv_mcast_flags_dump(struct sk_buff *msg, u32 portid,
|
@@ -1653,7 +1653,7 @@ __batadv_mcast_flags_dump(struct sk_buff
|
||||||
|
|
||||||
while (bucket_tmp < hash->size) {
|
while (bucket_tmp < hash->size) {
|
||||||
if (batadv_mcast_flags_dump_bucket(msg, portid, cb, hash,
|
if (batadv_mcast_flags_dump_bucket(msg, portid, cb, hash,
|
||||||
|
|
|
@ -43,11 +43,9 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/9b470b8a2b9ef4ce68d6e95febd3a0574be1ac14
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/9b470b8a2b9ef4ce68d6e95febd3a0574be1ac14
|
||||||
|
|
||||||
diff --git a/net/batman-adv/netlink.c b/net/batman-adv/netlink.c
|
|
||||||
index daf56933223d478399c63360203bcf283d7686a3..e1978bc52a700e77ff881136c05ccb934f3b851d 100644
|
|
||||||
--- a/net/batman-adv/netlink.c
|
--- a/net/batman-adv/netlink.c
|
||||||
+++ b/net/batman-adv/netlink.c
|
+++ b/net/batman-adv/netlink.c
|
||||||
@@ -164,7 +164,7 @@ batadv_netlink_get_ifindex(const struct nlmsghdr *nlh, int attrtype)
|
@@ -164,7 +164,7 @@ batadv_netlink_get_ifindex(const struct
|
||||||
{
|
{
|
||||||
struct nlattr *attr = nlmsg_find_attr(nlh, GENL_HDRLEN, attrtype);
|
struct nlattr *attr = nlmsg_find_attr(nlh, GENL_HDRLEN, attrtype);
|
||||||
|
|
||||||
|
|
|
@ -21,11 +21,9 @@ Acked-by: Antonio Quartulli <a@unstable.cc>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/07b6051ebcfaa7ea89b4f278eca2ff4070d29e56
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/07b6051ebcfaa7ea89b4f278eca2ff4070d29e56
|
||||||
|
|
||||||
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
|
|
||||||
index 240ed70912d6a014c0a48280741989133034396c..d78938e3e0085d9cff138b805148a0e77de3f654 100644
|
|
||||||
--- a/net/batman-adv/bat_iv_ogm.c
|
--- a/net/batman-adv/bat_iv_ogm.c
|
||||||
+++ b/net/batman-adv/bat_iv_ogm.c
|
+++ b/net/batman-adv/bat_iv_ogm.c
|
||||||
@@ -277,17 +277,23 @@ static u8 batadv_hop_penalty(u8 tq, const struct batadv_priv *bat_priv)
|
@@ -277,17 +277,23 @@ static u8 batadv_hop_penalty(u8 tq, cons
|
||||||
* batadv_iv_ogm_aggr_packet() - checks if there is another OGM attached
|
* batadv_iv_ogm_aggr_packet() - checks if there is another OGM attached
|
||||||
* @buff_pos: current position in the skb
|
* @buff_pos: current position in the skb
|
||||||
* @packet_len: total length of the skb
|
* @packet_len: total length of the skb
|
||||||
|
@ -54,7 +52,7 @@ index 240ed70912d6a014c0a48280741989133034396c..d78938e3e0085d9cff138b805148a0e7
|
||||||
|
|
||||||
return (next_buff_pos <= packet_len) &&
|
return (next_buff_pos <= packet_len) &&
|
||||||
(next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES);
|
(next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES);
|
||||||
@@ -315,7 +321,7 @@ static void batadv_iv_ogm_send_to_if(struct batadv_forw_packet *forw_packet,
|
@@ -315,7 +321,7 @@ static void batadv_iv_ogm_send_to_if(str
|
||||||
|
|
||||||
/* adjust all flags and log packets */
|
/* adjust all flags and log packets */
|
||||||
while (batadv_iv_ogm_aggr_packet(buff_pos, forw_packet->packet_len,
|
while (batadv_iv_ogm_aggr_packet(buff_pos, forw_packet->packet_len,
|
||||||
|
@ -63,7 +61,7 @@ index 240ed70912d6a014c0a48280741989133034396c..d78938e3e0085d9cff138b805148a0e7
|
||||||
/* we might have aggregated direct link packets with an
|
/* we might have aggregated direct link packets with an
|
||||||
* ordinary base packet
|
* ordinary base packet
|
||||||
*/
|
*/
|
||||||
@@ -1704,7 +1710,7 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb,
|
@@ -1704,7 +1710,7 @@ static int batadv_iv_ogm_receive(struct
|
||||||
|
|
||||||
/* unpack the aggregated packets and process them one by one */
|
/* unpack the aggregated packets and process them one by one */
|
||||||
while (batadv_iv_ogm_aggr_packet(ogm_offset, skb_headlen(skb),
|
while (batadv_iv_ogm_aggr_packet(ogm_offset, skb_headlen(skb),
|
||||||
|
|
|
@ -18,11 +18,9 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/18f77da3761c5550f42a2d131f0fe5cac62e022d
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/18f77da3761c5550f42a2d131f0fe5cac62e022d
|
||||||
|
|
||||||
diff --git a/net/batman-adv/bat_v_ogm.c b/net/batman-adv/bat_v_ogm.c
|
|
||||||
index fad95ef64e01a9670ed66f9a81658718a14fc716..bc06e3cdfa84f63cc003867d4453a88249d3fb18 100644
|
|
||||||
--- a/net/batman-adv/bat_v_ogm.c
|
--- a/net/batman-adv/bat_v_ogm.c
|
||||||
+++ b/net/batman-adv/bat_v_ogm.c
|
+++ b/net/batman-adv/bat_v_ogm.c
|
||||||
@@ -631,17 +631,23 @@ batadv_v_ogm_process_per_outif(struct batadv_priv *bat_priv,
|
@@ -631,17 +631,23 @@ batadv_v_ogm_process_per_outif(struct ba
|
||||||
* batadv_v_ogm_aggr_packet() - checks if there is another OGM aggregated
|
* batadv_v_ogm_aggr_packet() - checks if there is another OGM aggregated
|
||||||
* @buff_pos: current position in the skb
|
* @buff_pos: current position in the skb
|
||||||
* @packet_len: total length of the skb
|
* @packet_len: total length of the skb
|
||||||
|
@ -51,7 +49,7 @@ index fad95ef64e01a9670ed66f9a81658718a14fc716..bc06e3cdfa84f63cc003867d4453a882
|
||||||
|
|
||||||
return (next_buff_pos <= packet_len) &&
|
return (next_buff_pos <= packet_len) &&
|
||||||
(next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES);
|
(next_buff_pos <= BATADV_MAX_AGGREGATION_BYTES);
|
||||||
@@ -818,7 +824,7 @@ int batadv_v_ogm_packet_recv(struct sk_buff *skb,
|
@@ -818,7 +824,7 @@ int batadv_v_ogm_packet_recv(struct sk_b
|
||||||
ogm_packet = (struct batadv_ogm2_packet *)skb->data;
|
ogm_packet = (struct batadv_ogm2_packet *)skb->data;
|
||||||
|
|
||||||
while (batadv_v_ogm_aggr_packet(ogm_offset, skb_headlen(skb),
|
while (batadv_v_ogm_aggr_packet(ogm_offset, skb_headlen(skb),
|
||||||
|
|
|
@ -19,8 +19,6 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/14ee24576213ff02272b7f8d975c7c61d5448aa2
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/14ee24576213ff02272b7f8d975c7c61d5448aa2
|
||||||
|
|
||||||
diff --git a/net/batman-adv/bat_v_ogm.c b/net/batman-adv/bat_v_ogm.c
|
|
||||||
index bc06e3cdfa84f63cc003867d4453a88249d3fb18..034bdc5e31e7b1b6f12c06da9977b3b6663da7f3 100644
|
|
||||||
--- a/net/batman-adv/bat_v_ogm.c
|
--- a/net/batman-adv/bat_v_ogm.c
|
||||||
+++ b/net/batman-adv/bat_v_ogm.c
|
+++ b/net/batman-adv/bat_v_ogm.c
|
||||||
@@ -21,6 +21,7 @@
|
@@ -21,6 +21,7 @@
|
||||||
|
@ -31,7 +29,7 @@ index bc06e3cdfa84f63cc003867d4453a88249d3fb18..034bdc5e31e7b1b6f12c06da9977b3b6
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/stddef.h>
|
#include <linux/stddef.h>
|
||||||
@@ -116,14 +117,12 @@ static void batadv_v_ogm_send_to_if(struct sk_buff *skb,
|
@@ -116,14 +117,12 @@ static void batadv_v_ogm_send_to_if(stru
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -49,7 +47,7 @@ index bc06e3cdfa84f63cc003867d4453a88249d3fb18..034bdc5e31e7b1b6f12c06da9977b3b6
|
||||||
struct batadv_ogm2_packet *ogm_packet;
|
struct batadv_ogm2_packet *ogm_packet;
|
||||||
struct sk_buff *skb, *skb_tmp;
|
struct sk_buff *skb, *skb_tmp;
|
||||||
unsigned char *ogm_buff;
|
unsigned char *ogm_buff;
|
||||||
@@ -131,8 +130,7 @@ static void batadv_v_ogm_send(struct work_struct *work)
|
@@ -131,8 +130,7 @@ static void batadv_v_ogm_send(struct wor
|
||||||
u16 tvlv_len = 0;
|
u16 tvlv_len = 0;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -59,11 +57,10 @@ index bc06e3cdfa84f63cc003867d4453a88249d3fb18..034bdc5e31e7b1b6f12c06da9977b3b6
|
||||||
|
|
||||||
if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING)
|
if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING)
|
||||||
goto out;
|
goto out;
|
||||||
@@ -223,6 +221,22 @@ static void batadv_v_ogm_send(struct work_struct *work)
|
@@ -224,6 +222,22 @@ out:
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
+/**
|
/**
|
||||||
+ * batadv_v_ogm_send() - periodic worker broadcasting the own OGM
|
+ * batadv_v_ogm_send() - periodic worker broadcasting the own OGM
|
||||||
+ * @work: work queue item
|
+ * @work: work queue item
|
||||||
+ */
|
+ */
|
||||||
|
@ -79,10 +76,11 @@ index bc06e3cdfa84f63cc003867d4453a88249d3fb18..034bdc5e31e7b1b6f12c06da9977b3b6
|
||||||
+ rtnl_unlock();
|
+ rtnl_unlock();
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
/**
|
+/**
|
||||||
* batadv_v_ogm_iface_enable() - prepare an interface for B.A.T.M.A.N. V
|
* batadv_v_ogm_iface_enable() - prepare an interface for B.A.T.M.A.N. V
|
||||||
* @hard_iface: the interface to prepare
|
* @hard_iface: the interface to prepare
|
||||||
@@ -249,6 +263,8 @@ void batadv_v_ogm_primary_iface_set(struct batadv_hard_iface *primary_iface)
|
*
|
||||||
|
@@ -249,6 +263,8 @@ void batadv_v_ogm_primary_iface_set(stru
|
||||||
struct batadv_priv *bat_priv = netdev_priv(primary_iface->soft_iface);
|
struct batadv_priv *bat_priv = netdev_priv(primary_iface->soft_iface);
|
||||||
struct batadv_ogm2_packet *ogm_packet;
|
struct batadv_ogm2_packet *ogm_packet;
|
||||||
|
|
||||||
|
@ -91,7 +89,7 @@ index bc06e3cdfa84f63cc003867d4453a88249d3fb18..034bdc5e31e7b1b6f12c06da9977b3b6
|
||||||
if (!bat_priv->bat_v.ogm_buff)
|
if (!bat_priv->bat_v.ogm_buff)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -857,6 +873,8 @@ int batadv_v_ogm_init(struct batadv_priv *bat_priv)
|
@@ -857,6 +873,8 @@ int batadv_v_ogm_init(struct batadv_priv
|
||||||
unsigned char *ogm_buff;
|
unsigned char *ogm_buff;
|
||||||
u32 random_seqno;
|
u32 random_seqno;
|
||||||
|
|
||||||
|
@ -100,8 +98,6 @@ index bc06e3cdfa84f63cc003867d4453a88249d3fb18..034bdc5e31e7b1b6f12c06da9977b3b6
|
||||||
bat_priv->bat_v.ogm_buff_len = BATADV_OGM2_HLEN;
|
bat_priv->bat_v.ogm_buff_len = BATADV_OGM2_HLEN;
|
||||||
ogm_buff = kzalloc(bat_priv->bat_v.ogm_buff_len, GFP_ATOMIC);
|
ogm_buff = kzalloc(bat_priv->bat_v.ogm_buff_len, GFP_ATOMIC);
|
||||||
if (!ogm_buff)
|
if (!ogm_buff)
|
||||||
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
|
|
||||||
index e0b25104cbfa9f715df364658621c29faa7ad637..f298e9a04986faf40db04ece14180b7f43b5a7b7 100644
|
|
||||||
--- a/net/batman-adv/types.h
|
--- a/net/batman-adv/types.h
|
||||||
+++ b/net/batman-adv/types.h
|
+++ b/net/batman-adv/types.h
|
||||||
@@ -1477,10 +1477,10 @@ struct batadv_softif_vlan {
|
@@ -1477,10 +1477,10 @@ struct batadv_softif_vlan {
|
||||||
|
|
|
@ -19,11 +19,9 @@ Fixes: 21a57f6e7a3b ("batman-adv: make the TT CRC logic VLAN specific")
|
||||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/fe8bf38f47a0c1a0e53c487228e3f5a44c86939f
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/fe8bf38f47a0c1a0e53c487228e3f5a44c86939f
|
||||||
|
|
||||||
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
|
|
||||||
index 8a482c5ec67bb22167bca02b4181252045e3b605..c5271ea4dc8321fadc75fca7790b1382102dbb5a 100644
|
|
||||||
--- a/net/batman-adv/translation-table.c
|
--- a/net/batman-adv/translation-table.c
|
||||||
+++ b/net/batman-adv/translation-table.c
|
+++ b/net/batman-adv/translation-table.c
|
||||||
@@ -891,6 +891,7 @@ batadv_tt_prepare_tvlv_global_data(struct batadv_orig_node *orig_node,
|
@@ -891,6 +891,7 @@ batadv_tt_prepare_tvlv_global_data(struc
|
||||||
hlist_for_each_entry_rcu(vlan, &orig_node->vlan_list, list) {
|
hlist_for_each_entry_rcu(vlan, &orig_node->vlan_list, list) {
|
||||||
tt_vlan->vid = htons(vlan->vid);
|
tt_vlan->vid = htons(vlan->vid);
|
||||||
tt_vlan->crc = htonl(vlan->tt.crc);
|
tt_vlan->crc = htonl(vlan->tt.crc);
|
||||||
|
@ -31,7 +29,7 @@ index 8a482c5ec67bb22167bca02b4181252045e3b605..c5271ea4dc8321fadc75fca7790b1382
|
||||||
|
|
||||||
tt_vlan++;
|
tt_vlan++;
|
||||||
}
|
}
|
||||||
@@ -974,6 +975,7 @@ batadv_tt_prepare_tvlv_local_data(struct batadv_priv *bat_priv,
|
@@ -974,6 +975,7 @@ batadv_tt_prepare_tvlv_local_data(struct
|
||||||
|
|
||||||
tt_vlan->vid = htons(vlan->vid);
|
tt_vlan->vid = htons(vlan->vid);
|
||||||
tt_vlan->crc = htonl(vlan->tt.crc);
|
tt_vlan->crc = htonl(vlan->tt.crc);
|
|
@ -20,8 +20,6 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/9b8ceef26c697d0c8319748428944c3339a498dc
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/9b8ceef26c697d0c8319748428944c3339a498dc
|
||||||
|
|
||||||
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
|
|
||||||
index d78938e3e0085d9cff138b805148a0e77de3f654..e20c3813182c422a52f58178f05010869c5ebe66 100644
|
|
||||||
--- a/net/batman-adv/bat_iv_ogm.c
|
--- a/net/batman-adv/bat_iv_ogm.c
|
||||||
+++ b/net/batman-adv/bat_iv_ogm.c
|
+++ b/net/batman-adv/bat_iv_ogm.c
|
||||||
@@ -29,6 +29,7 @@
|
@@ -29,6 +29,7 @@
|
||||||
|
@ -32,7 +30,7 @@ index d78938e3e0085d9cff138b805148a0e77de3f654..e20c3813182c422a52f58178f0501086
|
||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
@@ -193,6 +194,8 @@ static int batadv_iv_ogm_iface_enable(struct batadv_hard_iface *hard_iface)
|
@@ -193,6 +194,8 @@ static int batadv_iv_ogm_iface_enable(st
|
||||||
unsigned char *ogm_buff;
|
unsigned char *ogm_buff;
|
||||||
u32 random_seqno;
|
u32 random_seqno;
|
||||||
|
|
||||||
|
@ -41,7 +39,7 @@ index d78938e3e0085d9cff138b805148a0e77de3f654..e20c3813182c422a52f58178f0501086
|
||||||
/* randomize initial seqno to avoid collision */
|
/* randomize initial seqno to avoid collision */
|
||||||
get_random_bytes(&random_seqno, sizeof(random_seqno));
|
get_random_bytes(&random_seqno, sizeof(random_seqno));
|
||||||
atomic_set(&hard_iface->bat_iv.ogm_seqno, random_seqno);
|
atomic_set(&hard_iface->bat_iv.ogm_seqno, random_seqno);
|
||||||
@@ -217,6 +220,8 @@ static int batadv_iv_ogm_iface_enable(struct batadv_hard_iface *hard_iface)
|
@@ -217,6 +220,8 @@ static int batadv_iv_ogm_iface_enable(st
|
||||||
|
|
||||||
static void batadv_iv_ogm_iface_disable(struct batadv_hard_iface *hard_iface)
|
static void batadv_iv_ogm_iface_disable(struct batadv_hard_iface *hard_iface)
|
||||||
{
|
{
|
||||||
|
@ -50,7 +48,7 @@ index d78938e3e0085d9cff138b805148a0e77de3f654..e20c3813182c422a52f58178f0501086
|
||||||
kfree(hard_iface->bat_iv.ogm_buff);
|
kfree(hard_iface->bat_iv.ogm_buff);
|
||||||
hard_iface->bat_iv.ogm_buff = NULL;
|
hard_iface->bat_iv.ogm_buff = NULL;
|
||||||
}
|
}
|
||||||
@@ -226,6 +231,8 @@ static void batadv_iv_ogm_iface_update_mac(struct batadv_hard_iface *hard_iface)
|
@@ -226,6 +231,8 @@ static void batadv_iv_ogm_iface_update_m
|
||||||
struct batadv_ogm_packet *batadv_ogm_packet;
|
struct batadv_ogm_packet *batadv_ogm_packet;
|
||||||
unsigned char *ogm_buff = hard_iface->bat_iv.ogm_buff;
|
unsigned char *ogm_buff = hard_iface->bat_iv.ogm_buff;
|
||||||
|
|
||||||
|
@ -59,7 +57,7 @@ index d78938e3e0085d9cff138b805148a0e77de3f654..e20c3813182c422a52f58178f0501086
|
||||||
batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff;
|
batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff;
|
||||||
ether_addr_copy(batadv_ogm_packet->orig,
|
ether_addr_copy(batadv_ogm_packet->orig,
|
||||||
hard_iface->net_dev->dev_addr);
|
hard_iface->net_dev->dev_addr);
|
||||||
@@ -239,6 +246,8 @@ batadv_iv_ogm_primary_iface_set(struct batadv_hard_iface *hard_iface)
|
@@ -239,6 +246,8 @@ batadv_iv_ogm_primary_iface_set(struct b
|
||||||
struct batadv_ogm_packet *batadv_ogm_packet;
|
struct batadv_ogm_packet *batadv_ogm_packet;
|
||||||
unsigned char *ogm_buff = hard_iface->bat_iv.ogm_buff;
|
unsigned char *ogm_buff = hard_iface->bat_iv.ogm_buff;
|
||||||
|
|
||||||
|
@ -68,7 +66,7 @@ index d78938e3e0085d9cff138b805148a0e77de3f654..e20c3813182c422a52f58178f0501086
|
||||||
batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff;
|
batadv_ogm_packet = (struct batadv_ogm_packet *)ogm_buff;
|
||||||
batadv_ogm_packet->ttl = BATADV_TTL;
|
batadv_ogm_packet->ttl = BATADV_TTL;
|
||||||
}
|
}
|
||||||
@@ -753,6 +762,8 @@ static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface)
|
@@ -753,6 +762,8 @@ static void batadv_iv_ogm_schedule(struc
|
||||||
u16 tvlv_len = 0;
|
u16 tvlv_len = 0;
|
||||||
unsigned long send_time;
|
unsigned long send_time;
|
||||||
|
|
||||||
|
@ -77,7 +75,7 @@ index d78938e3e0085d9cff138b805148a0e77de3f654..e20c3813182c422a52f58178f0501086
|
||||||
if (hard_iface->if_status == BATADV_IF_NOT_IN_USE ||
|
if (hard_iface->if_status == BATADV_IF_NOT_IN_USE ||
|
||||||
hard_iface->if_status == BATADV_IF_TO_BE_REMOVED)
|
hard_iface->if_status == BATADV_IF_TO_BE_REMOVED)
|
||||||
return;
|
return;
|
||||||
@@ -1643,16 +1654,12 @@ static void batadv_iv_ogm_process(const struct sk_buff *skb, int ogm_offset,
|
@@ -1643,16 +1654,12 @@ static void batadv_iv_ogm_process(const
|
||||||
batadv_orig_node_put(orig_node);
|
batadv_orig_node_put(orig_node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,7 +94,7 @@ index d78938e3e0085d9cff138b805148a0e77de3f654..e20c3813182c422a52f58178f0501086
|
||||||
bat_priv = netdev_priv(forw_packet->if_incoming->soft_iface);
|
bat_priv = netdev_priv(forw_packet->if_incoming->soft_iface);
|
||||||
|
|
||||||
if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING) {
|
if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING) {
|
||||||
@@ -1681,6 +1688,20 @@ static void batadv_iv_send_outstanding_bat_ogm_packet(struct work_struct *work)
|
@@ -1681,6 +1688,20 @@ out:
|
||||||
batadv_forw_packet_free(forw_packet, dropped);
|
batadv_forw_packet_free(forw_packet, dropped);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,8 +115,6 @@ index d78938e3e0085d9cff138b805148a0e77de3f654..e20c3813182c422a52f58178f0501086
|
||||||
static int batadv_iv_ogm_receive(struct sk_buff *skb,
|
static int batadv_iv_ogm_receive(struct sk_buff *skb,
|
||||||
struct batadv_hard_iface *if_incoming)
|
struct batadv_hard_iface *if_incoming)
|
||||||
{
|
{
|
||||||
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
|
|
||||||
index f298e9a04986faf40db04ece14180b7f43b5a7b7..f3084b005ed641d8ab8910df542762bc7dff450a 100644
|
|
||||||
--- a/net/batman-adv/types.h
|
--- a/net/batman-adv/types.h
|
||||||
+++ b/net/batman-adv/types.h
|
+++ b/net/batman-adv/types.h
|
||||||
@@ -71,10 +71,10 @@ enum batadv_dhcp_recipient {
|
@@ -71,10 +71,10 @@ enum batadv_dhcp_recipient {
|
|
@ -12,8 +12,6 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/8069c581f9097f1f9398f2d49047a1dab8093821
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/8069c581f9097f1f9398f2d49047a1dab8093821
|
||||||
|
|
||||||
diff --git a/net/batman-adv/bat_v_ogm.c b/net/batman-adv/bat_v_ogm.c
|
|
||||||
index 034bdc5e31e7b1b6f12c06da9977b3b6663da7f3..74452e9385b1a6e81be64af259dfc371cd3e9655 100644
|
|
||||||
--- a/net/batman-adv/bat_v_ogm.c
|
--- a/net/batman-adv/bat_v_ogm.c
|
||||||
+++ b/net/batman-adv/bat_v_ogm.c
|
+++ b/net/batman-adv/bat_v_ogm.c
|
||||||
@@ -17,11 +17,12 @@
|
@@ -17,11 +17,12 @@
|
||||||
|
@ -30,7 +28,7 @@ index 034bdc5e31e7b1b6f12c06da9977b3b6663da7f3..74452e9385b1a6e81be64af259dfc371
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/stddef.h>
|
#include <linux/stddef.h>
|
||||||
@@ -130,7 +131,7 @@ static void batadv_v_ogm_send_softif(struct batadv_priv *bat_priv)
|
@@ -130,7 +131,7 @@ static void batadv_v_ogm_send_softif(str
|
||||||
u16 tvlv_len = 0;
|
u16 tvlv_len = 0;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -39,7 +37,7 @@ index 034bdc5e31e7b1b6f12c06da9977b3b6663da7f3..74452e9385b1a6e81be64af259dfc371
|
||||||
|
|
||||||
if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING)
|
if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING)
|
||||||
goto out;
|
goto out;
|
||||||
@@ -230,11 +231,12 @@ static void batadv_v_ogm_send(struct work_struct *work)
|
@@ -230,11 +231,12 @@ static void batadv_v_ogm_send(struct wor
|
||||||
struct batadv_priv_bat_v *bat_v;
|
struct batadv_priv_bat_v *bat_v;
|
||||||
struct batadv_priv *bat_priv;
|
struct batadv_priv *bat_priv;
|
||||||
|
|
||||||
|
@ -54,7 +52,7 @@ index 034bdc5e31e7b1b6f12c06da9977b3b6663da7f3..74452e9385b1a6e81be64af259dfc371
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -263,13 +265,15 @@ void batadv_v_ogm_primary_iface_set(struct batadv_hard_iface *primary_iface)
|
@@ -263,13 +265,15 @@ void batadv_v_ogm_primary_iface_set(stru
|
||||||
struct batadv_priv *bat_priv = netdev_priv(primary_iface->soft_iface);
|
struct batadv_priv *bat_priv = netdev_priv(primary_iface->soft_iface);
|
||||||
struct batadv_ogm2_packet *ogm_packet;
|
struct batadv_ogm2_packet *ogm_packet;
|
||||||
|
|
||||||
|
@ -73,7 +71,7 @@ index 034bdc5e31e7b1b6f12c06da9977b3b6663da7f3..74452e9385b1a6e81be64af259dfc371
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -873,8 +877,6 @@ int batadv_v_ogm_init(struct batadv_priv *bat_priv)
|
@@ -873,8 +877,6 @@ int batadv_v_ogm_init(struct batadv_priv
|
||||||
unsigned char *ogm_buff;
|
unsigned char *ogm_buff;
|
||||||
u32 random_seqno;
|
u32 random_seqno;
|
||||||
|
|
||||||
|
@ -82,7 +80,7 @@ index 034bdc5e31e7b1b6f12c06da9977b3b6663da7f3..74452e9385b1a6e81be64af259dfc371
|
||||||
bat_priv->bat_v.ogm_buff_len = BATADV_OGM2_HLEN;
|
bat_priv->bat_v.ogm_buff_len = BATADV_OGM2_HLEN;
|
||||||
ogm_buff = kzalloc(bat_priv->bat_v.ogm_buff_len, GFP_ATOMIC);
|
ogm_buff = kzalloc(bat_priv->bat_v.ogm_buff_len, GFP_ATOMIC);
|
||||||
if (!ogm_buff)
|
if (!ogm_buff)
|
||||||
@@ -893,6 +895,8 @@ int batadv_v_ogm_init(struct batadv_priv *bat_priv)
|
@@ -893,6 +895,8 @@ int batadv_v_ogm_init(struct batadv_priv
|
||||||
atomic_set(&bat_priv->bat_v.ogm_seqno, random_seqno);
|
atomic_set(&bat_priv->bat_v.ogm_seqno, random_seqno);
|
||||||
INIT_DELAYED_WORK(&bat_priv->bat_v.ogm_wq, batadv_v_ogm_send);
|
INIT_DELAYED_WORK(&bat_priv->bat_v.ogm_wq, batadv_v_ogm_send);
|
||||||
|
|
||||||
|
@ -91,7 +89,7 @@ index 034bdc5e31e7b1b6f12c06da9977b3b6663da7f3..74452e9385b1a6e81be64af259dfc371
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -904,7 +908,11 @@ void batadv_v_ogm_free(struct batadv_priv *bat_priv)
|
@@ -904,7 +908,11 @@ void batadv_v_ogm_free(struct batadv_pri
|
||||||
{
|
{
|
||||||
cancel_delayed_work_sync(&bat_priv->bat_v.ogm_wq);
|
cancel_delayed_work_sync(&bat_priv->bat_v.ogm_wq);
|
||||||
|
|
||||||
|
@ -103,8 +101,6 @@ index 034bdc5e31e7b1b6f12c06da9977b3b6663da7f3..74452e9385b1a6e81be64af259dfc371
|
||||||
+
|
+
|
||||||
+ mutex_unlock(&bat_priv->bat_v.ogm_buff_mutex);
|
+ mutex_unlock(&bat_priv->bat_v.ogm_buff_mutex);
|
||||||
}
|
}
|
||||||
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
|
|
||||||
index f3084b005ed641d8ab8910df542762bc7dff450a..09f44bac693fcb3dc13c33319f4928a472a14b2e 100644
|
|
||||||
--- a/net/batman-adv/types.h
|
--- a/net/batman-adv/types.h
|
||||||
+++ b/net/batman-adv/types.h
|
+++ b/net/batman-adv/types.h
|
||||||
@@ -16,6 +16,7 @@
|
@@ -16,6 +16,7 @@
|
|
@ -24,8 +24,6 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/d3be478f1aa27b47f61c4a62e18eb063d47c9168
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/d3be478f1aa27b47f61c4a62e18eb063d47c9168
|
||||||
|
|
||||||
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
|
|
||||||
index e20c3813182c422a52f58178f05010869c5ebe66..5b0b20e6da956b4333b118bce1c09c5acef6d66f 100644
|
|
||||||
--- a/net/batman-adv/bat_iv_ogm.c
|
--- a/net/batman-adv/bat_iv_ogm.c
|
||||||
+++ b/net/batman-adv/bat_iv_ogm.c
|
+++ b/net/batman-adv/bat_iv_ogm.c
|
||||||
@@ -22,6 +22,8 @@
|
@@ -22,6 +22,8 @@
|
||||||
|
@ -45,7 +43,7 @@ index e20c3813182c422a52f58178f05010869c5ebe66..5b0b20e6da956b4333b118bce1c09c5a
|
||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
@@ -194,7 +195,7 @@ static int batadv_iv_ogm_iface_enable(struct batadv_hard_iface *hard_iface)
|
@@ -194,7 +195,7 @@ static int batadv_iv_ogm_iface_enable(st
|
||||||
unsigned char *ogm_buff;
|
unsigned char *ogm_buff;
|
||||||
u32 random_seqno;
|
u32 random_seqno;
|
||||||
|
|
||||||
|
@ -54,7 +52,7 @@ index e20c3813182c422a52f58178f05010869c5ebe66..5b0b20e6da956b4333b118bce1c09c5a
|
||||||
|
|
||||||
/* randomize initial seqno to avoid collision */
|
/* randomize initial seqno to avoid collision */
|
||||||
get_random_bytes(&random_seqno, sizeof(random_seqno));
|
get_random_bytes(&random_seqno, sizeof(random_seqno));
|
||||||
@@ -202,8 +203,10 @@ static int batadv_iv_ogm_iface_enable(struct batadv_hard_iface *hard_iface)
|
@@ -202,8 +203,10 @@ static int batadv_iv_ogm_iface_enable(st
|
||||||
|
|
||||||
hard_iface->bat_iv.ogm_buff_len = BATADV_OGM_HLEN;
|
hard_iface->bat_iv.ogm_buff_len = BATADV_OGM_HLEN;
|
||||||
ogm_buff = kmalloc(hard_iface->bat_iv.ogm_buff_len, GFP_ATOMIC);
|
ogm_buff = kmalloc(hard_iface->bat_iv.ogm_buff_len, GFP_ATOMIC);
|
||||||
|
@ -66,7 +64,7 @@ index e20c3813182c422a52f58178f05010869c5ebe66..5b0b20e6da956b4333b118bce1c09c5a
|
||||||
|
|
||||||
hard_iface->bat_iv.ogm_buff = ogm_buff;
|
hard_iface->bat_iv.ogm_buff = ogm_buff;
|
||||||
|
|
||||||
@@ -215,41 +218,59 @@ static int batadv_iv_ogm_iface_enable(struct batadv_hard_iface *hard_iface)
|
@@ -215,41 +218,59 @@ static int batadv_iv_ogm_iface_enable(st
|
||||||
batadv_ogm_packet->reserved = 0;
|
batadv_ogm_packet->reserved = 0;
|
||||||
batadv_ogm_packet->tq = BATADV_TQ_MAX_VALUE;
|
batadv_ogm_packet->tq = BATADV_TQ_MAX_VALUE;
|
||||||
|
|
||||||
|
@ -133,7 +131,7 @@ index e20c3813182c422a52f58178f05010869c5ebe66..5b0b20e6da956b4333b118bce1c09c5a
|
||||||
}
|
}
|
||||||
|
|
||||||
/* when do we schedule our own ogm to be sent */
|
/* when do we schedule our own ogm to be sent */
|
||||||
@@ -751,7 +772,11 @@ batadv_iv_ogm_slide_own_bcast_window(struct batadv_hard_iface *hard_iface)
|
@@ -751,7 +772,11 @@ batadv_iv_ogm_slide_own_bcast_window(str
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,7 +144,7 @@ index e20c3813182c422a52f58178f05010869c5ebe66..5b0b20e6da956b4333b118bce1c09c5a
|
||||||
{
|
{
|
||||||
struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
|
struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface);
|
||||||
unsigned char **ogm_buff = &hard_iface->bat_iv.ogm_buff;
|
unsigned char **ogm_buff = &hard_iface->bat_iv.ogm_buff;
|
||||||
@@ -762,11 +787,7 @@ static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface)
|
@@ -762,11 +787,7 @@ static void batadv_iv_ogm_schedule(struc
|
||||||
u16 tvlv_len = 0;
|
u16 tvlv_len = 0;
|
||||||
unsigned long send_time;
|
unsigned long send_time;
|
||||||
|
|
||||||
|
@ -159,7 +157,7 @@ index e20c3813182c422a52f58178f05010869c5ebe66..5b0b20e6da956b4333b118bce1c09c5a
|
||||||
|
|
||||||
/* the interface gets activated here to avoid race conditions between
|
/* the interface gets activated here to avoid race conditions between
|
||||||
* the moment of activating the interface in
|
* the moment of activating the interface in
|
||||||
@@ -834,6 +855,17 @@ static void batadv_iv_ogm_schedule(struct batadv_hard_iface *hard_iface)
|
@@ -834,6 +855,17 @@ out:
|
||||||
batadv_hardif_put(primary_if);
|
batadv_hardif_put(primary_if);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -177,7 +175,7 @@ index e20c3813182c422a52f58178f05010869c5ebe66..5b0b20e6da956b4333b118bce1c09c5a
|
||||||
/**
|
/**
|
||||||
* batadv_iv_orig_ifinfo_sum() - Get bcast_own sum for originator over iterface
|
* batadv_iv_orig_ifinfo_sum() - Get bcast_own sum for originator over iterface
|
||||||
* @orig_node: originator which reproadcasted the OGMs directly
|
* @orig_node: originator which reproadcasted the OGMs directly
|
||||||
@@ -1654,12 +1686,16 @@ static void batadv_iv_ogm_process(const struct sk_buff *skb, int ogm_offset,
|
@@ -1654,12 +1686,16 @@ static void batadv_iv_ogm_process(const
|
||||||
batadv_orig_node_put(orig_node);
|
batadv_orig_node_put(orig_node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -196,7 +194,7 @@ index e20c3813182c422a52f58178f05010869c5ebe66..5b0b20e6da956b4333b118bce1c09c5a
|
||||||
bat_priv = netdev_priv(forw_packet->if_incoming->soft_iface);
|
bat_priv = netdev_priv(forw_packet->if_incoming->soft_iface);
|
||||||
|
|
||||||
if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING) {
|
if (atomic_read(&bat_priv->mesh_state) == BATADV_MESH_DEACTIVATING) {
|
||||||
@@ -1688,20 +1724,6 @@ batadv_iv_send_outstanding_forw_packet(struct batadv_forw_packet *forw_packet)
|
@@ -1688,20 +1724,6 @@ out:
|
||||||
batadv_forw_packet_free(forw_packet, dropped);
|
batadv_forw_packet_free(forw_packet, dropped);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -217,8 +215,6 @@ index e20c3813182c422a52f58178f05010869c5ebe66..5b0b20e6da956b4333b118bce1c09c5a
|
||||||
static int batadv_iv_ogm_receive(struct sk_buff *skb,
|
static int batadv_iv_ogm_receive(struct sk_buff *skb,
|
||||||
struct batadv_hard_iface *if_incoming)
|
struct batadv_hard_iface *if_incoming)
|
||||||
{
|
{
|
||||||
diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
|
|
||||||
index 3719cfd026f04093f5d86ffe1b41a41849b2af62..62b926dd4aaeffd82da83654c8e568de2c3714fb 100644
|
|
||||||
--- a/net/batman-adv/hard-interface.c
|
--- a/net/batman-adv/hard-interface.c
|
||||||
+++ b/net/batman-adv/hard-interface.c
|
+++ b/net/batman-adv/hard-interface.c
|
||||||
@@ -17,6 +17,7 @@
|
@@ -17,6 +17,7 @@
|
||||||
|
@ -229,7 +225,7 @@ index 3719cfd026f04093f5d86ffe1b41a41849b2af62..62b926dd4aaeffd82da83654c8e568de
|
||||||
#include <linux/netdevice.h>
|
#include <linux/netdevice.h>
|
||||||
#include <linux/printk.h>
|
#include <linux/printk.h>
|
||||||
#include <linux/rculist.h>
|
#include <linux/rculist.h>
|
||||||
@@ -930,6 +931,7 @@ batadv_hardif_add_interface(struct net_device *net_dev)
|
@@ -930,6 +931,7 @@ batadv_hardif_add_interface(struct net_d
|
||||||
INIT_LIST_HEAD(&hard_iface->list);
|
INIT_LIST_HEAD(&hard_iface->list);
|
||||||
INIT_HLIST_HEAD(&hard_iface->neigh_list);
|
INIT_HLIST_HEAD(&hard_iface->neigh_list);
|
||||||
|
|
||||||
|
@ -237,8 +233,6 @@ index 3719cfd026f04093f5d86ffe1b41a41849b2af62..62b926dd4aaeffd82da83654c8e568de
|
||||||
spin_lock_init(&hard_iface->neigh_list_lock);
|
spin_lock_init(&hard_iface->neigh_list_lock);
|
||||||
kref_init(&hard_iface->refcount);
|
kref_init(&hard_iface->refcount);
|
||||||
|
|
||||||
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
|
|
||||||
index 09f44bac693fcb3dc13c33319f4928a472a14b2e..c0ded822517b94333451deb9c0ff4037744b1fd9 100644
|
|
||||||
--- a/net/batman-adv/types.h
|
--- a/net/batman-adv/types.h
|
||||||
+++ b/net/batman-adv/types.h
|
+++ b/net/batman-adv/types.h
|
||||||
@@ -72,14 +72,17 @@ enum batadv_dhcp_recipient {
|
@@ -72,14 +72,17 @@ enum batadv_dhcp_recipient {
|
|
@ -19,11 +19,9 @@ Acked-by: Antonio Quartulli <a@unstable.cc>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/728aea06f38e0e4d70f4f7d43698187f7f7055c5
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/728aea06f38e0e4d70f4f7d43698187f7f7055c5
|
||||||
|
|
||||||
diff --git a/net/batman-adv/distributed-arp-table.c b/net/batman-adv/distributed-arp-table.c
|
|
||||||
index b0af3a11d4069cb7e44419d4494f20dd653dbca8..ec7bf5a4a9fc724b63da7bfd7ece79f32b104d99 100644
|
|
||||||
--- a/net/batman-adv/distributed-arp-table.c
|
--- a/net/batman-adv/distributed-arp-table.c
|
||||||
+++ b/net/batman-adv/distributed-arp-table.c
|
+++ b/net/batman-adv/distributed-arp-table.c
|
||||||
@@ -285,6 +285,7 @@ static u32 batadv_hash_dat(const void *data, u32 size)
|
@@ -285,6 +285,7 @@ static u32 batadv_hash_dat(const void *d
|
||||||
u32 hash = 0;
|
u32 hash = 0;
|
||||||
const struct batadv_dat_entry *dat = data;
|
const struct batadv_dat_entry *dat = data;
|
||||||
const unsigned char *key;
|
const unsigned char *key;
|
||||||
|
@ -31,7 +29,7 @@ index b0af3a11d4069cb7e44419d4494f20dd653dbca8..ec7bf5a4a9fc724b63da7bfd7ece79f3
|
||||||
u32 i;
|
u32 i;
|
||||||
|
|
||||||
key = (const unsigned char *)&dat->ip;
|
key = (const unsigned char *)&dat->ip;
|
||||||
@@ -294,7 +295,8 @@ static u32 batadv_hash_dat(const void *data, u32 size)
|
@@ -294,7 +295,8 @@ static u32 batadv_hash_dat(const void *d
|
||||||
hash ^= (hash >> 6);
|
hash ^= (hash >> 6);
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,11 +20,9 @@ Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/a089c55ca004b396d340baae58abe9a79f32cc0f
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/a089c55ca004b396d340baae58abe9a79f32cc0f
|
||||||
|
|
||||||
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
|
|
||||||
index 5b0b20e6da956b4333b118bce1c09c5acef6d66f..d88a4de0223727d25cf36839e46d7777449f025a 100644
|
|
||||||
--- a/net/batman-adv/bat_iv_ogm.c
|
--- a/net/batman-adv/bat_iv_ogm.c
|
||||||
+++ b/net/batman-adv/bat_iv_ogm.c
|
+++ b/net/batman-adv/bat_iv_ogm.c
|
||||||
@@ -789,6 +789,10 @@ static void batadv_iv_ogm_schedule_buff(struct batadv_hard_iface *hard_iface)
|
@@ -789,6 +789,10 @@ static void batadv_iv_ogm_schedule_buff(
|
||||||
|
|
||||||
lockdep_assert_held(&hard_iface->bat_iv.ogm_buff_mutex);
|
lockdep_assert_held(&hard_iface->bat_iv.ogm_buff_mutex);
|
||||||
|
|
|
@ -36,11 +36,9 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/db48c60b0edb995450ee846157364bd09bb23762
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/db48c60b0edb995450ee846157364bd09bb23762
|
||||||
|
|
||||||
diff --git a/net/batman-adv/network-coding.c b/net/batman-adv/network-coding.c
|
|
||||||
index c5e7906045f3c62c052400c44a18bca0a38499ba..b7f3d9ef83cfcc136888cd2487dcdd88cb16d6d9 100644
|
|
||||||
--- a/net/batman-adv/network-coding.c
|
--- a/net/batman-adv/network-coding.c
|
||||||
+++ b/net/batman-adv/network-coding.c
|
+++ b/net/batman-adv/network-coding.c
|
||||||
@@ -1009,15 +1009,8 @@ static struct batadv_nc_path *batadv_nc_get_path(struct batadv_priv *bat_priv,
|
@@ -1009,15 +1009,8 @@ static struct batadv_nc_path *batadv_nc_
|
||||||
*/
|
*/
|
||||||
static u8 batadv_nc_random_weight_tq(u8 tq)
|
static u8 batadv_nc_random_weight_tq(u8 tq)
|
||||||
{
|
{
|
|
@ -24,11 +24,9 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/f301bfed59b146a63471d0f147b767d7cafede6f
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/f301bfed59b146a63471d0f147b767d7cafede6f
|
||||||
|
|
||||||
diff --git a/net/batman-adv/sysfs.c b/net/batman-adv/sysfs.c
|
|
||||||
index 80fc3253c3368e3cc356176c5ba961542de0a8c9..c20f2bab9db56021f7280ebdfc2afcfd772991bd 100644
|
|
||||||
--- a/net/batman-adv/sysfs.c
|
--- a/net/batman-adv/sysfs.c
|
||||||
+++ b/net/batman-adv/sysfs.c
|
+++ b/net/batman-adv/sysfs.c
|
||||||
@@ -1189,6 +1189,7 @@ static ssize_t batadv_show_throughput_override(struct kobject *kobj,
|
@@ -1189,6 +1189,7 @@ static ssize_t batadv_show_throughput_ov
|
||||||
|
|
||||||
tp_override = atomic_read(&hard_iface->bat_v.throughput_override);
|
tp_override = atomic_read(&hard_iface->bat_v.throughput_override);
|
||||||
|
|
|
@ -24,11 +24,9 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/b69cd8bdbfd6fa7e61878c2fa9e6637406f40dd9
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/b69cd8bdbfd6fa7e61878c2fa9e6637406f40dd9
|
||||||
|
|
||||||
diff --git a/net/batman-adv/sysfs.c b/net/batman-adv/sysfs.c
|
|
||||||
index c20f2bab9db56021f7280ebdfc2afcfd772991bd..34e9948fbd45ef6f2690052a208d6a4e4a4f215b 100644
|
|
||||||
--- a/net/batman-adv/sysfs.c
|
--- a/net/batman-adv/sysfs.c
|
||||||
+++ b/net/batman-adv/sysfs.c
|
+++ b/net/batman-adv/sysfs.c
|
||||||
@@ -1149,7 +1149,7 @@ static ssize_t batadv_store_throughput_override(struct kobject *kobj,
|
@@ -1149,7 +1149,7 @@ static ssize_t batadv_store_throughput_o
|
||||||
ret = batadv_parse_throughput(net_dev, buff, "throughput_override",
|
ret = batadv_parse_throughput(net_dev, buff, "throughput_override",
|
||||||
&tp_override);
|
&tp_override);
|
||||||
if (!ret)
|
if (!ret)
|
|
@ -24,11 +24,9 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/4515f5e6a4ccbe1c563b05f2d487eb9eef3c9740
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/4515f5e6a4ccbe1c563b05f2d487eb9eef3c9740
|
||||||
|
|
||||||
diff --git a/net/batman-adv/bat_v_ogm.c b/net/batman-adv/bat_v_ogm.c
|
|
||||||
index 74452e9385b1a6e81be64af259dfc371cd3e9655..9c42152829c976a2fb6c4395ab4d17c34fe47682 100644
|
|
||||||
--- a/net/batman-adv/bat_v_ogm.c
|
--- a/net/batman-adv/bat_v_ogm.c
|
||||||
+++ b/net/batman-adv/bat_v_ogm.c
|
+++ b/net/batman-adv/bat_v_ogm.c
|
||||||
@@ -723,7 +723,7 @@ static void batadv_v_ogm_process(const struct sk_buff *skb, int ogm_offset,
|
@@ -723,7 +723,7 @@ static void batadv_v_ogm_process(const s
|
||||||
|
|
||||||
orig_node = batadv_v_ogm_orig_get(bat_priv, ogm_packet->orig);
|
orig_node = batadv_v_ogm_orig_get(bat_priv, ogm_packet->orig);
|
||||||
if (!orig_node)
|
if (!orig_node)
|
|
@ -28,8 +28,6 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/6e860b3d5e4147bafcda32bf9b3e769926f232c5
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/6e860b3d5e4147bafcda32bf9b3e769926f232c5
|
||||||
|
|
||||||
diff --git a/compat-include/linux/ethtool.h b/compat-include/linux/ethtool.h
|
|
||||||
index e1f39c3377febbd650a75206aafa9ae3e807762a..8dcbe02c3decf941e892af70a0a67653b010e65e 100644
|
|
||||||
--- a/compat-include/linux/ethtool.h
|
--- a/compat-include/linux/ethtool.h
|
||||||
+++ b/compat-include/linux/ethtool.h
|
+++ b/compat-include/linux/ethtool.h
|
||||||
@@ -21,7 +21,6 @@ struct batadv_ethtool_link_ksettings {
|
@@ -21,7 +21,6 @@ struct batadv_ethtool_link_ksettings {
|
||||||
|
@ -40,7 +38,7 @@ index e1f39c3377febbd650a75206aafa9ae3e807762a..8dcbe02c3decf941e892af70a0a67653
|
||||||
} base;
|
} base;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -42,7 +41,6 @@ batadv_ethtool_get_link_ksettings(struct net_device *dev,
|
@@ -42,7 +41,6 @@ batadv_ethtool_get_link_ksettings(struct
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
link_ksettings->base.duplex = cmd.duplex;
|
link_ksettings->base.duplex = cmd.duplex;
|
||||||
|
@ -48,11 +46,9 @@ index e1f39c3377febbd650a75206aafa9ae3e807762a..8dcbe02c3decf941e892af70a0a67653
|
||||||
link_ksettings->base.speed = ethtool_cmd_speed(&cmd);
|
link_ksettings->base.speed = ethtool_cmd_speed(&cmd);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
diff --git a/net/batman-adv/bat_v_elp.c b/net/batman-adv/bat_v_elp.c
|
|
||||||
index 2614a9caee008539cc489b71dabdc36ac0ae3752..a39af0eefad313101812118181ec0376b21b79bb 100644
|
|
||||||
--- a/net/batman-adv/bat_v_elp.c
|
--- a/net/batman-adv/bat_v_elp.c
|
||||||
+++ b/net/batman-adv/bat_v_elp.c
|
+++ b/net/batman-adv/bat_v_elp.c
|
||||||
@@ -120,20 +120,7 @@ static u32 batadv_v_elp_get_throughput(struct batadv_hardif_neigh_node *neigh)
|
@@ -120,20 +120,7 @@ static u32 batadv_v_elp_get_throughput(s
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
ret = __ethtool_get_link_ksettings(hard_iface->net_dev, &link_settings);
|
ret = __ethtool_get_link_ksettings(hard_iface->net_dev, &link_settings);
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
|
@ -23,11 +23,9 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/fcdf008ffd749246632d1f9423163af5dc3f8c7f
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/fcdf008ffd749246632d1f9423163af5dc3f8c7f
|
||||||
|
|
||||||
diff --git a/net/batman-adv/gateway_client.c b/net/batman-adv/gateway_client.c
|
|
||||||
index 47df4c678988613f7410acb96889558eabdf396d..89c9097007c3a575836018df9e0fe97731a19619 100644
|
|
||||||
--- a/net/batman-adv/gateway_client.c
|
--- a/net/batman-adv/gateway_client.c
|
||||||
+++ b/net/batman-adv/gateway_client.c
|
+++ b/net/batman-adv/gateway_client.c
|
||||||
@@ -703,8 +703,10 @@ batadv_gw_dhcp_recipient_get(struct sk_buff *skb, unsigned int *header_len,
|
@@ -703,8 +703,10 @@ batadv_gw_dhcp_recipient_get(struct sk_b
|
||||||
|
|
||||||
chaddr_offset = *header_len + BATADV_DHCP_CHADDR_OFFSET;
|
chaddr_offset = *header_len + BATADV_DHCP_CHADDR_OFFSET;
|
||||||
/* store the client address if the message is going to a client */
|
/* store the client address if the message is going to a client */
|
|
@ -28,11 +28,9 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/d41cc7cb62c184b2fb8ab97fda45815918200001
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/d41cc7cb62c184b2fb8ab97fda45815918200001
|
||||||
|
|
||||||
diff --git a/net/batman-adv/bat_v_ogm.c b/net/batman-adv/bat_v_ogm.c
|
|
||||||
index 9c42152829c976a2fb6c4395ab4d17c34fe47682..330204a73a0d3d9e4083656b82ff7b9d73a48fdc 100644
|
|
||||||
--- a/net/batman-adv/bat_v_ogm.c
|
--- a/net/batman-adv/bat_v_ogm.c
|
||||||
+++ b/net/batman-adv/bat_v_ogm.c
|
+++ b/net/batman-adv/bat_v_ogm.c
|
||||||
@@ -704,6 +704,12 @@ static void batadv_v_ogm_process(const struct sk_buff *skb, int ogm_offset,
|
@@ -704,6 +704,12 @@ static void batadv_v_ogm_process(const s
|
||||||
ntohl(ogm_packet->seqno), ogm_throughput, ogm_packet->ttl,
|
ntohl(ogm_packet->seqno), ogm_throughput, ogm_packet->ttl,
|
||||||
ogm_packet->version, ntohs(ogm_packet->tvlv_len));
|
ogm_packet->version, ntohs(ogm_packet->tvlv_len));
|
||||||
|
|
||||||
|
@ -45,7 +43,7 @@ index 9c42152829c976a2fb6c4395ab4d17c34fe47682..330204a73a0d3d9e4083656b82ff7b9d
|
||||||
/* If the throughput metric is 0, immediately drop the packet. No need
|
/* If the throughput metric is 0, immediately drop the packet. No need
|
||||||
* to create orig_node / neigh_node for an unusable route.
|
* to create orig_node / neigh_node for an unusable route.
|
||||||
*/
|
*/
|
||||||
@@ -831,11 +837,6 @@ int batadv_v_ogm_packet_recv(struct sk_buff *skb,
|
@@ -831,11 +837,6 @@ int batadv_v_ogm_packet_recv(struct sk_b
|
||||||
if (batadv_is_my_mac(bat_priv, ethhdr->h_source))
|
if (batadv_is_my_mac(bat_priv, ethhdr->h_source))
|
||||||
goto free_skb;
|
goto free_skb;
|
||||||
|
|
|
@ -13,11 +13,9 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/3747f81a1380b65740fc52fc71c7a3af4c6e49de
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/3747f81a1380b65740fc52fc71c7a3af4c6e49de
|
||||||
|
|
||||||
diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c
|
|
||||||
index 663a53b6d36e65508b4296d86cecdd808c653836..5f6309ade1ea19f6a0bd27e8cbc5fcfba8f7dda5 100644
|
|
||||||
--- a/net/batman-adv/bridge_loop_avoidance.c
|
--- a/net/batman-adv/bridge_loop_avoidance.c
|
||||||
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
||||||
@@ -437,7 +437,10 @@ static void batadv_bla_send_claim(struct batadv_priv *bat_priv, u8 *mac,
|
@@ -437,7 +437,10 @@ static void batadv_bla_send_claim(struct
|
||||||
batadv_add_counter(bat_priv, BATADV_CNT_RX_BYTES,
|
batadv_add_counter(bat_priv, BATADV_CNT_RX_BYTES,
|
||||||
skb->len + ETH_HLEN);
|
skb->len + ETH_HLEN);
|
||||||
|
|
|
@ -19,11 +19,9 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/398a706cd46c1fc085aef56ae8ed11f76e182bd1
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/398a706cd46c1fc085aef56ae8ed11f76e182bd1
|
||||||
|
|
||||||
diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c
|
|
||||||
index 5f6309ade1ea19f6a0bd27e8cbc5fcfba8f7dda5..62d2e766dd3929e54070c13225f0f71c7f59a212 100644
|
|
||||||
--- a/net/batman-adv/bridge_loop_avoidance.c
|
--- a/net/batman-adv/bridge_loop_avoidance.c
|
||||||
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
||||||
@@ -83,11 +83,12 @@ static inline u32 batadv_choose_claim(const void *data, u32 size)
|
@@ -83,11 +83,12 @@ static inline u32 batadv_choose_claim(co
|
||||||
*/
|
*/
|
||||||
static inline u32 batadv_choose_backbone_gw(const void *data, u32 size)
|
static inline u32 batadv_choose_backbone_gw(const void *data, u32 size)
|
||||||
{
|
{
|
|
@ -28,11 +28,9 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/22e740c5e6c9342e0f5028beb3d14b84a018d113
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/22e740c5e6c9342e0f5028beb3d14b84a018d113
|
||||||
|
|
||||||
diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c
|
|
||||||
index f0f864820dead3e7811a6b0d522ec84954d9aec2..708e90cb18a6e95409f50e41708d903dd8301f9c 100644
|
|
||||||
--- a/net/batman-adv/routing.c
|
--- a/net/batman-adv/routing.c
|
||||||
+++ b/net/batman-adv/routing.c
|
+++ b/net/batman-adv/routing.c
|
||||||
@@ -826,6 +826,10 @@ static bool batadv_check_unicast_ttvn(struct batadv_priv *bat_priv,
|
@@ -826,6 +826,10 @@ static bool batadv_check_unicast_ttvn(st
|
||||||
vid = batadv_get_vid(skb, hdr_len);
|
vid = batadv_get_vid(skb, hdr_len);
|
||||||
ethhdr = (struct ethhdr *)(skb->data + hdr_len);
|
ethhdr = (struct ethhdr *)(skb->data + hdr_len);
|
||||||
|
|
|
@ -12,8 +12,6 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/6ea99cd9c82b2d1bc4a313fe9006bcf5d956380e
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/6ea99cd9c82b2d1bc4a313fe9006bcf5d956380e
|
||||||
|
|
||||||
diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c
|
|
||||||
index 62d2e766dd3929e54070c13225f0f71c7f59a212..fe406c17b2c0aa24f49a7d5dee4264fbca56d72f 100644
|
|
||||||
--- a/net/batman-adv/bridge_loop_avoidance.c
|
--- a/net/batman-adv/bridge_loop_avoidance.c
|
||||||
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
||||||
@@ -25,6 +25,7 @@
|
@@ -25,6 +25,7 @@
|
|
@ -1,170 +0,0 @@
|
||||||
From: Linus Lüssing <linus.luessing@c0d3.blue>
|
|
||||||
Date: Tue, 15 Sep 2020 09:54:08 +0200
|
|
||||||
Subject: batman-adv: mcast: fix duplicate mcast packets in BLA backbone from LAN
|
|
||||||
|
|
||||||
Scenario:
|
|
||||||
* Multicast frame send from a BLA backbone (multiple nodes with
|
|
||||||
their bat0 bridged together, with BLA enabled)
|
|
||||||
|
|
||||||
Issue:
|
|
||||||
* BLA backbone nodes receive the frame multiple times on bat0
|
|
||||||
|
|
||||||
For multicast frames received via batman-adv broadcast packets the
|
|
||||||
originator of the broadcast packet is checked before decapsulating and
|
|
||||||
forwarding the frame to bat0 (batadv_bla_is_backbone_gw()->
|
|
||||||
batadv_recv_bcast_packet()). If it came from a node which shares the
|
|
||||||
same BLA backbone with us then it is not forwarded to bat0 to avoid a
|
|
||||||
loop.
|
|
||||||
|
|
||||||
When sending a multicast frame in a non-4-address batman-adv unicast
|
|
||||||
packet we are currently missing this check - and cannot do so because
|
|
||||||
the batman-adv unicast packet has no originator address field.
|
|
||||||
|
|
||||||
However, we can simply fix this on the sender side by only sending the
|
|
||||||
multicast frame via unicasts to interested nodes which do not share the
|
|
||||||
same BLA backbone with us. This also nicely avoids some unnecessary
|
|
||||||
transmissions on mesh side.
|
|
||||||
|
|
||||||
Note that no infinite loop was observed, probably because of dropping
|
|
||||||
via batadv_interface_tx()->batadv_bla_tx(). However the duplicates still
|
|
||||||
utterly confuse switches/bridges, ICMPv6 duplicate address detection and
|
|
||||||
neighbor discovery and therefore leads to long delays before being able
|
|
||||||
to establish TCP connections, for instance. And it also leads to the Linux
|
|
||||||
bridge printing messages like:
|
|
||||||
"br-lan: received packet on eth1 with own address as source address ..."
|
|
||||||
|
|
||||||
Fixes: 405cc1e5a81e ("batman-adv: Modified forwarding behaviour for multicast packets")
|
|
||||||
Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
|
||||||
Acked-by: Simon Wunderlich <sw@simonwunderlich.de>
|
|
||||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
|
||||||
|
|
||||||
Origin: backport, https://git.open-mesh.org/batman-adv.git/commit/3c39a2455a5be02ecceeaf1a15976bddd611392e
|
|
||||||
|
|
||||||
diff --git a/net/batman-adv/multicast.c b/net/batman-adv/multicast.c
|
|
||||||
index 50fe9dfb088b60a911756c8c22cac1db6ef10ca4..6f3a39ca274304c5d2196c2366291cd43ff234d5 100644
|
|
||||||
--- a/net/batman-adv/multicast.c
|
|
||||||
+++ b/net/batman-adv/multicast.c
|
|
||||||
@@ -50,6 +50,7 @@
|
|
||||||
#include <uapi/linux/batadv_packet.h>
|
|
||||||
#include <uapi/linux/batman_adv.h>
|
|
||||||
|
|
||||||
+#include "bridge_loop_avoidance.h"
|
|
||||||
#include "hard-interface.h"
|
|
||||||
#include "hash.h"
|
|
||||||
#include "log.h"
|
|
||||||
@@ -1019,6 +1020,35 @@ batadv_mcast_forw_mode(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
|
||||||
return BATADV_FORW_ALL;
|
|
||||||
}
|
|
||||||
|
|
||||||
+/**
|
|
||||||
+ * batadv_mcast_forw_send_orig() - send a multicast packet to an originator
|
|
||||||
+ * @bat_priv: the bat priv with all the soft interface information
|
|
||||||
+ * @skb: the multicast packet to send
|
|
||||||
+ * @vid: the vlan identifier
|
|
||||||
+ * @orig_node: the originator to send the packet to
|
|
||||||
+ *
|
|
||||||
+ * Return: NET_XMIT_DROP in case of error or NET_XMIT_SUCCESS otherwise.
|
|
||||||
+ */
|
|
||||||
+int batadv_mcast_forw_send_orig(struct batadv_priv *bat_priv,
|
|
||||||
+ struct sk_buff *skb,
|
|
||||||
+ unsigned short vid,
|
|
||||||
+ struct batadv_orig_node *orig_node)
|
|
||||||
+{
|
|
||||||
+ /* Avoid sending multicast-in-unicast packets to other BLA
|
|
||||||
+ * gateways - they already got the frame from the LAN side
|
|
||||||
+ * we share with them.
|
|
||||||
+ * TODO: Refactor to take BLA into account earlier, to avoid
|
|
||||||
+ * reducing the mcast_fanout count.
|
|
||||||
+ */
|
|
||||||
+ if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig, vid)) {
|
|
||||||
+ dev_kfree_skb(skb);
|
|
||||||
+ return NET_XMIT_SUCCESS;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return batadv_send_skb_unicast(bat_priv, skb, BATADV_UNICAST, 0,
|
|
||||||
+ orig_node, vid);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
/**
|
|
||||||
* batadv_mcast_forw_tt() - forwards a packet to multicast listeners
|
|
||||||
* @bat_priv: the bat priv with all the soft interface information
|
|
||||||
@@ -1056,8 +1086,8 @@ batadv_mcast_forw_tt(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
- batadv_send_skb_unicast(bat_priv, newskb, BATADV_UNICAST, 0,
|
|
||||||
- orig_entry->orig_node, vid);
|
|
||||||
+ batadv_mcast_forw_send_orig(bat_priv, newskb, vid,
|
|
||||||
+ orig_entry->orig_node);
|
|
||||||
}
|
|
||||||
rcu_read_unlock();
|
|
||||||
|
|
||||||
@@ -1098,8 +1128,7 @@ batadv_mcast_forw_want_all_ipv4(struct batadv_priv *bat_priv,
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
- batadv_send_skb_unicast(bat_priv, newskb, BATADV_UNICAST, 0,
|
|
||||||
- orig_node, vid);
|
|
||||||
+ batadv_mcast_forw_send_orig(bat_priv, newskb, vid, orig_node);
|
|
||||||
}
|
|
||||||
rcu_read_unlock();
|
|
||||||
return ret;
|
|
||||||
@@ -1136,8 +1165,7 @@ batadv_mcast_forw_want_all_ipv6(struct batadv_priv *bat_priv,
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
- batadv_send_skb_unicast(bat_priv, newskb, BATADV_UNICAST, 0,
|
|
||||||
- orig_node, vid);
|
|
||||||
+ batadv_mcast_forw_send_orig(bat_priv, newskb, vid, orig_node);
|
|
||||||
}
|
|
||||||
rcu_read_unlock();
|
|
||||||
return ret;
|
|
||||||
diff --git a/net/batman-adv/multicast.h b/net/batman-adv/multicast.h
|
|
||||||
index 653b9b76fabe68ee7dbe038ef86b7e631848c18a..a97e7f54b9fe58e980ba46b32c1a645e218d1f31 100644
|
|
||||||
--- a/net/batman-adv/multicast.h
|
|
||||||
+++ b/net/batman-adv/multicast.h
|
|
||||||
@@ -46,6 +46,11 @@ enum batadv_forw_mode
|
|
||||||
batadv_mcast_forw_mode(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
|
||||||
struct batadv_orig_node **mcast_single_orig);
|
|
||||||
|
|
||||||
+int batadv_mcast_forw_send_orig(struct batadv_priv *bat_priv,
|
|
||||||
+ struct sk_buff *skb,
|
|
||||||
+ unsigned short vid,
|
|
||||||
+ struct batadv_orig_node *orig_node);
|
|
||||||
+
|
|
||||||
int batadv_mcast_forw_send(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
|
||||||
unsigned short vid);
|
|
||||||
|
|
||||||
@@ -71,6 +76,16 @@ batadv_mcast_forw_mode(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
|
||||||
return BATADV_FORW_ALL;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static inline int
|
|
||||||
+batadv_mcast_forw_send_orig(struct batadv_priv *bat_priv,
|
|
||||||
+ struct sk_buff *skb,
|
|
||||||
+ unsigned short vid,
|
|
||||||
+ struct batadv_orig_node *orig_node)
|
|
||||||
+{
|
|
||||||
+ kfree_skb(skb);
|
|
||||||
+ return NET_XMIT_DROP;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static inline int
|
|
||||||
batadv_mcast_forw_send(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
|
||||||
unsigned short vid)
|
|
||||||
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c
|
|
||||||
index a7677e1d000fbc6ab60466cf5fc4f1750014268e..164cc254ef6f621ef7b8fb666821d8997188664f 100644
|
|
||||||
--- a/net/batman-adv/soft-interface.c
|
|
||||||
+++ b/net/batman-adv/soft-interface.c
|
|
||||||
@@ -363,9 +363,8 @@ static netdev_tx_t batadv_interface_tx(struct sk_buff *skb,
|
|
||||||
goto dropped;
|
|
||||||
ret = batadv_send_skb_via_gw(bat_priv, skb, vid);
|
|
||||||
} else if (mcast_single_orig) {
|
|
||||||
- ret = batadv_send_skb_unicast(bat_priv, skb,
|
|
||||||
- BATADV_UNICAST, 0,
|
|
||||||
- mcast_single_orig, vid);
|
|
||||||
+ ret = batadv_mcast_forw_send_orig(bat_priv, skb, vid,
|
|
||||||
+ mcast_single_orig);
|
|
||||||
} else if (forw_mode == BATADV_FORW_SOME) {
|
|
||||||
ret = batadv_mcast_forw_send(bat_priv, skb, vid);
|
|
||||||
} else {
|
|
|
@ -1,156 +1,164 @@
|
||||||
From: Linus Lüssing <linus.luessing@c0d3.blue>
|
From: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||||
Date: Tue, 15 Sep 2020 09:54:09 +0200
|
Date: Tue, 15 Sep 2020 09:54:08 +0200
|
||||||
Subject: batman-adv: mcast: fix duplicate mcast packets in BLA backbone from mesh
|
Subject: batman-adv: mcast: fix duplicate mcast packets in BLA backbone from LAN
|
||||||
|
|
||||||
Scenario:
|
Scenario:
|
||||||
* Multicast frame send from mesh to a BLA backbone (multiple nodes
|
* Multicast frame send from a BLA backbone (multiple nodes with
|
||||||
with their bat0 bridged together, with BLA enabled)
|
their bat0 bridged together, with BLA enabled)
|
||||||
|
|
||||||
Issue:
|
Issue:
|
||||||
* BLA backbone nodes receive the frame multiple times on bat0,
|
* BLA backbone nodes receive the frame multiple times on bat0
|
||||||
once from mesh->bat0 and once from each backbone_gw from LAN
|
|
||||||
|
|
||||||
For unicast, a node will send only to the best backbone gateway
|
For multicast frames received via batman-adv broadcast packets the
|
||||||
according to the TQ. However for multicast we currently cannot determine
|
originator of the broadcast packet is checked before decapsulating and
|
||||||
if multiple destination nodes share the same backbone if they don't share
|
forwarding the frame to bat0 (batadv_bla_is_backbone_gw()->
|
||||||
the same backbone with us. So we need to keep sending the unicasts to
|
batadv_recv_bcast_packet()). If it came from a node which shares the
|
||||||
all backbone gateways and let the backbone gateways decide which one
|
same BLA backbone with us then it is not forwarded to bat0 to avoid a
|
||||||
will forward the frame. We can use the CLAIM mechanism to make this
|
loop.
|
||||||
decision.
|
|
||||||
|
|
||||||
One catch: The batman-adv gateway feature for DHCP packets potentially
|
When sending a multicast frame in a non-4-address batman-adv unicast
|
||||||
sends multicast packets in the same batman-adv unicast header as the
|
packet we are currently missing this check - and cannot do so because
|
||||||
multicast optimizations code. And we are not allowed to drop those even
|
the batman-adv unicast packet has no originator address field.
|
||||||
if we did not claim the source address of the sender, as for such
|
|
||||||
packets there is only this one multicast-in-unicast packet.
|
|
||||||
|
|
||||||
How can we distinguish the two cases?
|
However, we can simply fix this on the sender side by only sending the
|
||||||
|
multicast frame via unicasts to interested nodes which do not share the
|
||||||
|
same BLA backbone with us. This also nicely avoids some unnecessary
|
||||||
|
transmissions on mesh side.
|
||||||
|
|
||||||
The gateway feature uses a batman-adv unicast 4 address header. While
|
Note that no infinite loop was observed, probably because of dropping
|
||||||
the multicast-to-unicasts feature uses a simple, 3 address batman-adv
|
via batadv_interface_tx()->batadv_bla_tx(). However the duplicates still
|
||||||
unicast header. So let's use this to distinguish.
|
utterly confuse switches/bridges, ICMPv6 duplicate address detection and
|
||||||
|
neighbor discovery and therefore leads to long delays before being able
|
||||||
|
to establish TCP connections, for instance. And it also leads to the Linux
|
||||||
|
bridge printing messages like:
|
||||||
|
"br-lan: received packet on eth1 with own address as source address ..."
|
||||||
|
|
||||||
Fixes: e32470167379 ("batman-adv: check incoming packet type for bla")
|
Fixes: 405cc1e5a81e ("batman-adv: Modified forwarding behaviour for multicast packets")
|
||||||
Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||||
Acked-by: Simon Wunderlich <sw@simonwunderlich.de>
|
Acked-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/d7665cf8a824c41c61c6e2110ab63d37eb7a8ef7
|
Origin: backport, https://git.open-mesh.org/batman-adv.git/commit/3c39a2455a5be02ecceeaf1a15976bddd611392e
|
||||||
|
|
||||||
diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c
|
--- a/net/batman-adv/multicast.c
|
||||||
index fe406c17b2c0aa24f49a7d5dee4264fbca56d72f..ffa44d7f7ee5d221e8f511a446eb079a3686844b 100644
|
+++ b/net/batman-adv/multicast.c
|
||||||
--- a/net/batman-adv/bridge_loop_avoidance.c
|
@@ -50,6 +50,7 @@
|
||||||
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
#include <uapi/linux/batadv_packet.h>
|
||||||
@@ -1814,7 +1814,7 @@ batadv_bla_loopdetect_check(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
#include <uapi/linux/batman_adv.h>
|
||||||
* @bat_priv: the bat priv with all the soft interface information
|
|
||||||
* @skb: the frame to be checked
|
|
||||||
* @vid: the VLAN ID of the frame
|
|
||||||
- * @is_bcast: the packet came in a broadcast packet type.
|
|
||||||
+ * @packet_type: the batman packet type this frame came in
|
|
||||||
*
|
|
||||||
* batadv_bla_rx avoidance checks if:
|
|
||||||
* * we have to race for a claim
|
|
||||||
@@ -1826,7 +1826,7 @@ batadv_bla_loopdetect_check(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
|
||||||
* further process the skb.
|
|
||||||
*/
|
|
||||||
bool batadv_bla_rx(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
|
||||||
- unsigned short vid, bool is_bcast)
|
|
||||||
+ unsigned short vid, int packet_type)
|
|
||||||
{
|
|
||||||
struct batadv_bla_backbone_gw *backbone_gw;
|
|
||||||
struct ethhdr *ethhdr;
|
|
||||||
@@ -1848,9 +1848,24 @@ bool batadv_bla_rx(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
|
||||||
goto handled;
|
|
||||||
|
|
||||||
if (unlikely(atomic_read(&bat_priv->bla.num_requests)))
|
+#include "bridge_loop_avoidance.h"
|
||||||
- /* don't allow broadcasts while requests are in flight */
|
#include "hard-interface.h"
|
||||||
- if (is_multicast_ether_addr(ethhdr->h_dest) && is_bcast)
|
#include "hash.h"
|
||||||
- goto handled;
|
#include "log.h"
|
||||||
+ /* don't allow multicast packets while requests are in flight */
|
@@ -1020,6 +1021,35 @@ batadv_mcast_forw_mode(struct batadv_pri
|
||||||
+ if (is_multicast_ether_addr(ethhdr->h_dest))
|
|
||||||
+ /* Both broadcast flooding or multicast-via-unicasts
|
|
||||||
+ * delivery might send to multiple backbone gateways
|
|
||||||
+ * sharing the same LAN and therefore need to coordinate
|
|
||||||
+ * which backbone gateway forwards into the LAN,
|
|
||||||
+ * by claiming the payload source address.
|
|
||||||
+ *
|
|
||||||
+ * Broadcast flooding and multicast-via-unicasts
|
|
||||||
+ * delivery use the following two batman packet types.
|
|
||||||
+ * Note: explicitly exclude BATADV_UNICAST_4ADDR,
|
|
||||||
+ * as the DHCP gateway feature will send explicitly
|
|
||||||
+ * to only one BLA gateway, so the claiming process
|
|
||||||
+ * should be avoided there.
|
|
||||||
+ */
|
|
||||||
+ if (packet_type == BATADV_BCAST ||
|
|
||||||
+ packet_type == BATADV_UNICAST)
|
|
||||||
+ goto handled;
|
|
||||||
|
|
||||||
ether_addr_copy(search_claim.addr, ethhdr->h_source);
|
|
||||||
search_claim.vid = vid;
|
|
||||||
@@ -1885,13 +1900,14 @@ bool batadv_bla_rx(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
|
||||||
goto allow;
|
|
||||||
}
|
|
||||||
|
|
||||||
- /* if it is a broadcast ... */
|
|
||||||
- if (is_multicast_ether_addr(ethhdr->h_dest) && is_bcast) {
|
|
||||||
+ /* if it is a multicast ... */
|
|
||||||
+ if (is_multicast_ether_addr(ethhdr->h_dest) &&
|
|
||||||
+ (packet_type == BATADV_BCAST || packet_type == BATADV_UNICAST)) {
|
|
||||||
/* ... drop it. the responsible gateway is in charge.
|
|
||||||
*
|
|
||||||
- * We need to check is_bcast because with the gateway
|
|
||||||
+ * We need to check packet type because with the gateway
|
|
||||||
* feature, broadcasts (like DHCP requests) may be sent
|
|
||||||
- * using a unicast packet type.
|
|
||||||
+ * using a unicast 4 address packet type. See comment above.
|
|
||||||
*/
|
|
||||||
goto handled;
|
|
||||||
} else {
|
|
||||||
diff --git a/net/batman-adv/bridge_loop_avoidance.h b/net/batman-adv/bridge_loop_avoidance.h
|
|
||||||
index 012d72c8d06463d64ed2374b0a9963577a5c25ab..f174ec2525d444f544385ce9f11604544573e67f 100644
|
|
||||||
--- a/net/batman-adv/bridge_loop_avoidance.h
|
|
||||||
+++ b/net/batman-adv/bridge_loop_avoidance.h
|
|
||||||
@@ -36,7 +36,7 @@ static inline bool batadv_bla_is_loopdetect_mac(const uint8_t *mac)
|
|
||||||
|
|
||||||
#ifdef CONFIG_BATMAN_ADV_BLA
|
|
||||||
bool batadv_bla_rx(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
|
||||||
- unsigned short vid, bool is_bcast);
|
|
||||||
+ unsigned short vid, int packet_type);
|
|
||||||
bool batadv_bla_tx(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
|
||||||
unsigned short vid);
|
|
||||||
bool batadv_bla_is_backbone_gw(struct sk_buff *skb,
|
|
||||||
@@ -67,7 +67,7 @@ bool batadv_bla_check_claim(struct batadv_priv *bat_priv, u8 *addr,
|
|
||||||
|
|
||||||
static inline bool batadv_bla_rx(struct batadv_priv *bat_priv,
|
|
||||||
struct sk_buff *skb, unsigned short vid,
|
|
||||||
- bool is_bcast)
|
|
||||||
+ int packet_type)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c
|
|
||||||
index 164cc254ef6f621ef7b8fb666821d8997188664f..c99facdbd493e0eb79ee51b1a3212003497e3a32 100644
|
/**
|
||||||
|
+ * batadv_mcast_forw_send_orig() - send a multicast packet to an originator
|
||||||
|
+ * @bat_priv: the bat priv with all the soft interface information
|
||||||
|
+ * @skb: the multicast packet to send
|
||||||
|
+ * @vid: the vlan identifier
|
||||||
|
+ * @orig_node: the originator to send the packet to
|
||||||
|
+ *
|
||||||
|
+ * Return: NET_XMIT_DROP in case of error or NET_XMIT_SUCCESS otherwise.
|
||||||
|
+ */
|
||||||
|
+int batadv_mcast_forw_send_orig(struct batadv_priv *bat_priv,
|
||||||
|
+ struct sk_buff *skb,
|
||||||
|
+ unsigned short vid,
|
||||||
|
+ struct batadv_orig_node *orig_node)
|
||||||
|
+{
|
||||||
|
+ /* Avoid sending multicast-in-unicast packets to other BLA
|
||||||
|
+ * gateways - they already got the frame from the LAN side
|
||||||
|
+ * we share with them.
|
||||||
|
+ * TODO: Refactor to take BLA into account earlier, to avoid
|
||||||
|
+ * reducing the mcast_fanout count.
|
||||||
|
+ */
|
||||||
|
+ if (batadv_bla_is_backbone_gw_orig(bat_priv, orig_node->orig, vid)) {
|
||||||
|
+ dev_kfree_skb(skb);
|
||||||
|
+ return NET_XMIT_SUCCESS;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return batadv_send_skb_unicast(bat_priv, skb, BATADV_UNICAST, 0,
|
||||||
|
+ orig_node, vid);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
* batadv_mcast_forw_tt() - forwards a packet to multicast listeners
|
||||||
|
* @bat_priv: the bat priv with all the soft interface information
|
||||||
|
* @skb: the multicast packet to transmit
|
||||||
|
@@ -1056,8 +1086,8 @@ batadv_mcast_forw_tt(struct batadv_priv
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- batadv_send_skb_unicast(bat_priv, newskb, BATADV_UNICAST, 0,
|
||||||
|
- orig_entry->orig_node, vid);
|
||||||
|
+ batadv_mcast_forw_send_orig(bat_priv, newskb, vid,
|
||||||
|
+ orig_entry->orig_node);
|
||||||
|
}
|
||||||
|
rcu_read_unlock();
|
||||||
|
|
||||||
|
@@ -1098,8 +1128,7 @@ batadv_mcast_forw_want_all_ipv4(struct b
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- batadv_send_skb_unicast(bat_priv, newskb, BATADV_UNICAST, 0,
|
||||||
|
- orig_node, vid);
|
||||||
|
+ batadv_mcast_forw_send_orig(bat_priv, newskb, vid, orig_node);
|
||||||
|
}
|
||||||
|
rcu_read_unlock();
|
||||||
|
return ret;
|
||||||
|
@@ -1136,8 +1165,7 @@ batadv_mcast_forw_want_all_ipv6(struct b
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
- batadv_send_skb_unicast(bat_priv, newskb, BATADV_UNICAST, 0,
|
||||||
|
- orig_node, vid);
|
||||||
|
+ batadv_mcast_forw_send_orig(bat_priv, newskb, vid, orig_node);
|
||||||
|
}
|
||||||
|
rcu_read_unlock();
|
||||||
|
return ret;
|
||||||
|
--- a/net/batman-adv/multicast.h
|
||||||
|
+++ b/net/batman-adv/multicast.h
|
||||||
|
@@ -46,6 +46,11 @@ enum batadv_forw_mode
|
||||||
|
batadv_mcast_forw_mode(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||||
|
struct batadv_orig_node **mcast_single_orig);
|
||||||
|
|
||||||
|
+int batadv_mcast_forw_send_orig(struct batadv_priv *bat_priv,
|
||||||
|
+ struct sk_buff *skb,
|
||||||
|
+ unsigned short vid,
|
||||||
|
+ struct batadv_orig_node *orig_node);
|
||||||
|
+
|
||||||
|
int batadv_mcast_forw_send(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||||
|
unsigned short vid);
|
||||||
|
|
||||||
|
@@ -72,6 +77,16 @@ batadv_mcast_forw_mode(struct batadv_pri
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
+batadv_mcast_forw_send_orig(struct batadv_priv *bat_priv,
|
||||||
|
+ struct sk_buff *skb,
|
||||||
|
+ unsigned short vid,
|
||||||
|
+ struct batadv_orig_node *orig_node)
|
||||||
|
+{
|
||||||
|
+ kfree_skb(skb);
|
||||||
|
+ return NET_XMIT_DROP;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static inline int
|
||||||
|
batadv_mcast_forw_send(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||||
|
unsigned short vid)
|
||||||
|
{
|
||||||
--- a/net/batman-adv/soft-interface.c
|
--- a/net/batman-adv/soft-interface.c
|
||||||
+++ b/net/batman-adv/soft-interface.c
|
+++ b/net/batman-adv/soft-interface.c
|
||||||
@@ -423,10 +423,10 @@ void batadv_interface_rx(struct net_device *soft_iface,
|
@@ -363,9 +363,8 @@ send:
|
||||||
struct vlan_ethhdr *vhdr;
|
goto dropped;
|
||||||
struct ethhdr *ethhdr;
|
ret = batadv_send_skb_via_gw(bat_priv, skb, vid);
|
||||||
unsigned short vid;
|
} else if (mcast_single_orig) {
|
||||||
- bool is_bcast;
|
- ret = batadv_send_skb_unicast(bat_priv, skb,
|
||||||
+ int packet_type;
|
- BATADV_UNICAST, 0,
|
||||||
|
- mcast_single_orig, vid);
|
||||||
batadv_bcast_packet = (struct batadv_bcast_packet *)skb->data;
|
+ ret = batadv_mcast_forw_send_orig(bat_priv, skb, vid,
|
||||||
- is_bcast = (batadv_bcast_packet->packet_type == BATADV_BCAST);
|
+ mcast_single_orig);
|
||||||
+ packet_type = batadv_bcast_packet->packet_type;
|
} else if (forw_mode == BATADV_FORW_SOME) {
|
||||||
|
ret = batadv_mcast_forw_send(bat_priv, skb, vid);
|
||||||
skb_pull_rcsum(skb, hdr_size);
|
} else {
|
||||||
skb_reset_mac_header(skb);
|
|
||||||
@@ -469,7 +469,7 @@ void batadv_interface_rx(struct net_device *soft_iface,
|
|
||||||
/* Let the bridge loop avoidance check the packet. If will
|
|
||||||
* not handle it, we can safely push it up.
|
|
||||||
*/
|
|
||||||
- if (batadv_bla_rx(bat_priv, skb, vid, is_bcast))
|
|
||||||
+ if (batadv_bla_rx(bat_priv, skb, vid, packet_type))
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
if (orig_node)
|
|
||||||
|
|
|
@ -0,0 +1,150 @@
|
||||||
|
From: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||||
|
Date: Tue, 15 Sep 2020 09:54:09 +0200
|
||||||
|
Subject: batman-adv: mcast: fix duplicate mcast packets in BLA backbone from mesh
|
||||||
|
|
||||||
|
Scenario:
|
||||||
|
* Multicast frame send from mesh to a BLA backbone (multiple nodes
|
||||||
|
with their bat0 bridged together, with BLA enabled)
|
||||||
|
|
||||||
|
Issue:
|
||||||
|
* BLA backbone nodes receive the frame multiple times on bat0,
|
||||||
|
once from mesh->bat0 and once from each backbone_gw from LAN
|
||||||
|
|
||||||
|
For unicast, a node will send only to the best backbone gateway
|
||||||
|
according to the TQ. However for multicast we currently cannot determine
|
||||||
|
if multiple destination nodes share the same backbone if they don't share
|
||||||
|
the same backbone with us. So we need to keep sending the unicasts to
|
||||||
|
all backbone gateways and let the backbone gateways decide which one
|
||||||
|
will forward the frame. We can use the CLAIM mechanism to make this
|
||||||
|
decision.
|
||||||
|
|
||||||
|
One catch: The batman-adv gateway feature for DHCP packets potentially
|
||||||
|
sends multicast packets in the same batman-adv unicast header as the
|
||||||
|
multicast optimizations code. And we are not allowed to drop those even
|
||||||
|
if we did not claim the source address of the sender, as for such
|
||||||
|
packets there is only this one multicast-in-unicast packet.
|
||||||
|
|
||||||
|
How can we distinguish the two cases?
|
||||||
|
|
||||||
|
The gateway feature uses a batman-adv unicast 4 address header. While
|
||||||
|
the multicast-to-unicasts feature uses a simple, 3 address batman-adv
|
||||||
|
unicast header. So let's use this to distinguish.
|
||||||
|
|
||||||
|
Fixes: e32470167379 ("batman-adv: check incoming packet type for bla")
|
||||||
|
Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||||
|
Acked-by: Simon Wunderlich <sw@simonwunderlich.de>
|
||||||
|
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/d7665cf8a824c41c61c6e2110ab63d37eb7a8ef7
|
||||||
|
|
||||||
|
--- a/net/batman-adv/bridge_loop_avoidance.c
|
||||||
|
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
||||||
|
@@ -1814,7 +1814,7 @@ batadv_bla_loopdetect_check(struct batad
|
||||||
|
* @bat_priv: the bat priv with all the soft interface information
|
||||||
|
* @skb: the frame to be checked
|
||||||
|
* @vid: the VLAN ID of the frame
|
||||||
|
- * @is_bcast: the packet came in a broadcast packet type.
|
||||||
|
+ * @packet_type: the batman packet type this frame came in
|
||||||
|
*
|
||||||
|
* batadv_bla_rx avoidance checks if:
|
||||||
|
* * we have to race for a claim
|
||||||
|
@@ -1826,7 +1826,7 @@ batadv_bla_loopdetect_check(struct batad
|
||||||
|
* further process the skb.
|
||||||
|
*/
|
||||||
|
bool batadv_bla_rx(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||||
|
- unsigned short vid, bool is_bcast)
|
||||||
|
+ unsigned short vid, int packet_type)
|
||||||
|
{
|
||||||
|
struct batadv_bla_backbone_gw *backbone_gw;
|
||||||
|
struct ethhdr *ethhdr;
|
||||||
|
@@ -1848,9 +1848,24 @@ bool batadv_bla_rx(struct batadv_priv *b
|
||||||
|
goto handled;
|
||||||
|
|
||||||
|
if (unlikely(atomic_read(&bat_priv->bla.num_requests)))
|
||||||
|
- /* don't allow broadcasts while requests are in flight */
|
||||||
|
- if (is_multicast_ether_addr(ethhdr->h_dest) && is_bcast)
|
||||||
|
- goto handled;
|
||||||
|
+ /* don't allow multicast packets while requests are in flight */
|
||||||
|
+ if (is_multicast_ether_addr(ethhdr->h_dest))
|
||||||
|
+ /* Both broadcast flooding or multicast-via-unicasts
|
||||||
|
+ * delivery might send to multiple backbone gateways
|
||||||
|
+ * sharing the same LAN and therefore need to coordinate
|
||||||
|
+ * which backbone gateway forwards into the LAN,
|
||||||
|
+ * by claiming the payload source address.
|
||||||
|
+ *
|
||||||
|
+ * Broadcast flooding and multicast-via-unicasts
|
||||||
|
+ * delivery use the following two batman packet types.
|
||||||
|
+ * Note: explicitly exclude BATADV_UNICAST_4ADDR,
|
||||||
|
+ * as the DHCP gateway feature will send explicitly
|
||||||
|
+ * to only one BLA gateway, so the claiming process
|
||||||
|
+ * should be avoided there.
|
||||||
|
+ */
|
||||||
|
+ if (packet_type == BATADV_BCAST ||
|
||||||
|
+ packet_type == BATADV_UNICAST)
|
||||||
|
+ goto handled;
|
||||||
|
|
||||||
|
ether_addr_copy(search_claim.addr, ethhdr->h_source);
|
||||||
|
search_claim.vid = vid;
|
||||||
|
@@ -1885,13 +1900,14 @@ bool batadv_bla_rx(struct batadv_priv *b
|
||||||
|
goto allow;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* if it is a broadcast ... */
|
||||||
|
- if (is_multicast_ether_addr(ethhdr->h_dest) && is_bcast) {
|
||||||
|
+ /* if it is a multicast ... */
|
||||||
|
+ if (is_multicast_ether_addr(ethhdr->h_dest) &&
|
||||||
|
+ (packet_type == BATADV_BCAST || packet_type == BATADV_UNICAST)) {
|
||||||
|
/* ... drop it. the responsible gateway is in charge.
|
||||||
|
*
|
||||||
|
- * We need to check is_bcast because with the gateway
|
||||||
|
+ * We need to check packet type because with the gateway
|
||||||
|
* feature, broadcasts (like DHCP requests) may be sent
|
||||||
|
- * using a unicast packet type.
|
||||||
|
+ * using a unicast 4 address packet type. See comment above.
|
||||||
|
*/
|
||||||
|
goto handled;
|
||||||
|
} else {
|
||||||
|
--- a/net/batman-adv/bridge_loop_avoidance.h
|
||||||
|
+++ b/net/batman-adv/bridge_loop_avoidance.h
|
||||||
|
@@ -36,7 +36,7 @@ static inline bool batadv_bla_is_loopdet
|
||||||
|
|
||||||
|
#ifdef CONFIG_BATMAN_ADV_BLA
|
||||||
|
bool batadv_bla_rx(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||||
|
- unsigned short vid, bool is_bcast);
|
||||||
|
+ unsigned short vid, int packet_type);
|
||||||
|
bool batadv_bla_tx(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
||||||
|
unsigned short vid);
|
||||||
|
bool batadv_bla_is_backbone_gw(struct sk_buff *skb,
|
||||||
|
@@ -67,7 +67,7 @@ bool batadv_bla_check_claim(struct batad
|
||||||
|
|
||||||
|
static inline bool batadv_bla_rx(struct batadv_priv *bat_priv,
|
||||||
|
struct sk_buff *skb, unsigned short vid,
|
||||||
|
- bool is_bcast)
|
||||||
|
+ int packet_type)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
--- a/net/batman-adv/soft-interface.c
|
||||||
|
+++ b/net/batman-adv/soft-interface.c
|
||||||
|
@@ -423,10 +423,10 @@ void batadv_interface_rx(struct net_devi
|
||||||
|
struct vlan_ethhdr *vhdr;
|
||||||
|
struct ethhdr *ethhdr;
|
||||||
|
unsigned short vid;
|
||||||
|
- bool is_bcast;
|
||||||
|
+ int packet_type;
|
||||||
|
|
||||||
|
batadv_bcast_packet = (struct batadv_bcast_packet *)skb->data;
|
||||||
|
- is_bcast = (batadv_bcast_packet->packet_type == BATADV_BCAST);
|
||||||
|
+ packet_type = batadv_bcast_packet->packet_type;
|
||||||
|
|
||||||
|
skb_pull_rcsum(skb, hdr_size);
|
||||||
|
skb_reset_mac_header(skb);
|
||||||
|
@@ -469,7 +469,7 @@ void batadv_interface_rx(struct net_devi
|
||||||
|
/* Let the bridge loop avoidance check the packet. If will
|
||||||
|
* not handle it, we can safely push it up.
|
||||||
|
*/
|
||||||
|
- if (batadv_bla_rx(bat_priv, skb, vid, is_bcast))
|
||||||
|
+ if (batadv_bla_rx(bat_priv, skb, vid, packet_type))
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
if (orig_node)
|
|
@ -32,11 +32,9 @@ Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/c5cb6a670cc3070d9d5c5562f95fa75faac767ba
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/c5cb6a670cc3070d9d5c5562f95fa75faac767ba
|
||||||
|
|
||||||
diff --git a/net/batman-adv/bridge_loop_avoidance.c b/net/batman-adv/bridge_loop_avoidance.c
|
|
||||||
index ffa44d7f7ee5d221e8f511a446eb079a3686844b..a6b26ca5c6973f230284eaa55ad80808593e796b 100644
|
|
||||||
--- a/net/batman-adv/bridge_loop_avoidance.c
|
--- a/net/batman-adv/bridge_loop_avoidance.c
|
||||||
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
||||||
@@ -1581,13 +1581,16 @@ int batadv_bla_init(struct batadv_priv *bat_priv)
|
@@ -1581,13 +1581,16 @@ int batadv_bla_init(struct batadv_priv *
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -44,21 +42,22 @@ index ffa44d7f7ee5d221e8f511a446eb079a3686844b..a6b26ca5c6973f230284eaa55ad80808
|
||||||
+ * batadv_bla_check_duplist() - Check if a frame is in the broadcast dup.
|
+ * batadv_bla_check_duplist() - Check if a frame is in the broadcast dup.
|
||||||
* @bat_priv: the bat priv with all the soft interface information
|
* @bat_priv: the bat priv with all the soft interface information
|
||||||
- * @skb: contains the bcast_packet to be checked
|
- * @skb: contains the bcast_packet to be checked
|
||||||
|
- *
|
||||||
|
- * check if it is on our broadcast list. Another gateway might
|
||||||
|
- * have sent the same packet because it is connected to the same backbone,
|
||||||
|
- * so we have to remove this duplicate.
|
||||||
+ * @skb: contains the multicast packet to be checked
|
+ * @skb: contains the multicast packet to be checked
|
||||||
+ * @payload_ptr: pointer to position inside the head buffer of the skb
|
+ * @payload_ptr: pointer to position inside the head buffer of the skb
|
||||||
+ * marking the start of the data to be CRC'ed
|
+ * marking the start of the data to be CRC'ed
|
||||||
+ * @orig: originator mac address, NULL if unknown
|
+ * @orig: originator mac address, NULL if unknown
|
||||||
*
|
+ *
|
||||||
- * check if it is on our broadcast list. Another gateway might
|
|
||||||
- * have sent the same packet because it is connected to the same backbone,
|
|
||||||
- * so we have to remove this duplicate.
|
|
||||||
+ * Check if it is on our broadcast list. Another gateway might have sent the
|
+ * Check if it is on our broadcast list. Another gateway might have sent the
|
||||||
+ * same packet because it is connected to the same backbone, so we have to
|
+ * same packet because it is connected to the same backbone, so we have to
|
||||||
+ * remove this duplicate.
|
+ * remove this duplicate.
|
||||||
*
|
*
|
||||||
* This is performed by checking the CRC, which will tell us
|
* This is performed by checking the CRC, which will tell us
|
||||||
* with a good chance that it is the same packet. If it is furthermore
|
* with a good chance that it is the same packet. If it is furthermore
|
||||||
@@ -1596,19 +1599,17 @@ int batadv_bla_init(struct batadv_priv *bat_priv)
|
@@ -1596,19 +1599,17 @@ int batadv_bla_init(struct batadv_priv *
|
||||||
*
|
*
|
||||||
* Return: true if a packet is in the duplicate list, false otherwise.
|
* Return: true if a packet is in the duplicate list, false otherwise.
|
||||||
*/
|
*/
|
||||||
|
@ -84,7 +83,7 @@ index ffa44d7f7ee5d221e8f511a446eb079a3686844b..a6b26ca5c6973f230284eaa55ad80808
|
||||||
|
|
||||||
spin_lock_bh(&bat_priv->bla.bcast_duplist_lock);
|
spin_lock_bh(&bat_priv->bla.bcast_duplist_lock);
|
||||||
|
|
||||||
@@ -1627,8 +1628,21 @@ bool batadv_bla_check_bcast_duplist(struct batadv_priv *bat_priv,
|
@@ -1627,8 +1628,21 @@ bool batadv_bla_check_bcast_duplist(stru
|
||||||
if (entry->crc != crc)
|
if (entry->crc != crc)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -108,7 +107,7 @@ index ffa44d7f7ee5d221e8f511a446eb079a3686844b..a6b26ca5c6973f230284eaa55ad80808
|
||||||
|
|
||||||
/* this entry seems to match: same crc, not too old,
|
/* this entry seems to match: same crc, not too old,
|
||||||
* and from another gw. therefore return true to forbid it.
|
* and from another gw. therefore return true to forbid it.
|
||||||
@@ -1644,7 +1658,14 @@ bool batadv_bla_check_bcast_duplist(struct batadv_priv *bat_priv,
|
@@ -1644,7 +1658,14 @@ bool batadv_bla_check_bcast_duplist(stru
|
||||||
entry = &bat_priv->bla.bcast_duplist[curr];
|
entry = &bat_priv->bla.bcast_duplist[curr];
|
||||||
entry->crc = crc;
|
entry->crc = crc;
|
||||||
entry->entrytime = jiffies;
|
entry->entrytime = jiffies;
|
||||||
|
@ -124,11 +123,10 @@ index ffa44d7f7ee5d221e8f511a446eb079a3686844b..a6b26ca5c6973f230284eaa55ad80808
|
||||||
bat_priv->bla.bcast_duplist_curr = curr;
|
bat_priv->bla.bcast_duplist_curr = curr;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
@@ -1653,6 +1674,48 @@ bool batadv_bla_check_bcast_duplist(struct batadv_priv *bat_priv,
|
@@ -1654,6 +1675,48 @@ out:
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
+/**
|
/**
|
||||||
+ * batadv_bla_check_ucast_duplist() - Check if a frame is in the broadcast dup.
|
+ * batadv_bla_check_ucast_duplist() - Check if a frame is in the broadcast dup.
|
||||||
+ * @bat_priv: the bat priv with all the soft interface information
|
+ * @bat_priv: the bat priv with all the soft interface information
|
||||||
+ * @skb: contains the multicast packet to be checked, decapsulated from a
|
+ * @skb: contains the multicast packet to be checked, decapsulated from a
|
||||||
|
@ -170,10 +168,11 @@ index ffa44d7f7ee5d221e8f511a446eb079a3686844b..a6b26ca5c6973f230284eaa55ad80808
|
||||||
+ bcast_packet->orig);
|
+ bcast_packet->orig);
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
/**
|
+/**
|
||||||
* batadv_bla_is_backbone_gw_orig() - Check if the originator is a gateway for
|
* batadv_bla_is_backbone_gw_orig() - Check if the originator is a gateway for
|
||||||
* the VLAN identified by vid.
|
* the VLAN identified by vid.
|
||||||
@@ -1867,6 +1930,14 @@ bool batadv_bla_rx(struct batadv_priv *bat_priv, struct sk_buff *skb,
|
* @bat_priv: the bat priv with all the soft interface information
|
||||||
|
@@ -1867,6 +1930,14 @@ bool batadv_bla_rx(struct batadv_priv *b
|
||||||
packet_type == BATADV_UNICAST)
|
packet_type == BATADV_UNICAST)
|
||||||
goto handled;
|
goto handled;
|
||||||
|
|
|
@ -11,11 +11,9 @@ Signed-off-by: Taehee Yoo <ap420073@gmail.com>
|
||||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/6e2937539a2c9f8a8536515258bc1f08bed19a06
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/6e2937539a2c9f8a8536515258bc1f08bed19a06
|
||||||
|
|
||||||
diff --git a/net/batman-adv/log.c b/net/batman-adv/log.c
|
|
||||||
index 60ce11e16a905e790424a2d7aca81c1f945c1ec2..a51fadeaefb58e75a84820998390acd3759ef3a8 100644
|
|
||||||
--- a/net/batman-adv/log.c
|
--- a/net/batman-adv/log.c
|
||||||
+++ b/net/batman-adv/log.c
|
+++ b/net/batman-adv/log.c
|
||||||
@@ -180,6 +180,7 @@ static const struct file_operations batadv_log_fops = {
|
@@ -180,6 +180,7 @@ static const struct file_operations bata
|
||||||
.read = batadv_log_read,
|
.read = batadv_log_read,
|
||||||
.poll = batadv_log_poll,
|
.poll = batadv_log_poll,
|
||||||
.llseek = no_llseek,
|
.llseek = no_llseek,
|
|
@ -14,11 +14,9 @@ Reported-by: Linus Lüssing <linus.luessing@c0d3.blue>
|
||||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/92064deda9b063ca2d5a53b307c6127a9453357c
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/92064deda9b063ca2d5a53b307c6127a9453357c
|
||||||
|
|
||||||
diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
|
|
||||||
index 62b926dd4aaeffd82da83654c8e568de2c3714fb..e0f70ae28df4e2fb0a7972a1ca9d5fcc986c0d6c 100644
|
|
||||||
--- a/net/batman-adv/hard-interface.c
|
--- a/net/batman-adv/hard-interface.c
|
||||||
+++ b/net/batman-adv/hard-interface.c
|
+++ b/net/batman-adv/hard-interface.c
|
||||||
@@ -553,6 +553,9 @@ static void batadv_hardif_recalc_extra_skbroom(struct net_device *soft_iface)
|
@@ -553,6 +553,9 @@ static void batadv_hardif_recalc_extra_s
|
||||||
needed_headroom = lower_headroom + (lower_header_len - ETH_HLEN);
|
needed_headroom = lower_headroom + (lower_header_len - ETH_HLEN);
|
||||||
needed_headroom += batadv_max_header_len();
|
needed_headroom += batadv_max_header_len();
|
||||||
|
|
|
@ -15,11 +15,9 @@ Fixes: db56e4ecf5c2 ("batman-adv: Fragment and send skbs larger than mtu")
|
||||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/0966d5424bb87e863037301488519ccdd69e4d26
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/0966d5424bb87e863037301488519ccdd69e4d26
|
||||||
|
|
||||||
diff --git a/net/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c
|
|
||||||
index 385fccdcf69d05d63f59d024dfb721b1e8f1c8b9..f1d202ff396cd69949915a9e90e763f3a68255b7 100644
|
|
||||||
--- a/net/batman-adv/fragmentation.c
|
--- a/net/batman-adv/fragmentation.c
|
||||||
+++ b/net/batman-adv/fragmentation.c
|
+++ b/net/batman-adv/fragmentation.c
|
||||||
@@ -391,6 +391,7 @@ bool batadv_frag_skb_fwd(struct sk_buff *skb,
|
@@ -391,6 +391,7 @@ out:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* batadv_frag_create() - create a fragment from skb
|
* batadv_frag_create() - create a fragment from skb
|
||||||
|
@ -27,7 +25,7 @@ index 385fccdcf69d05d63f59d024dfb721b1e8f1c8b9..f1d202ff396cd69949915a9e90e763f3
|
||||||
* @skb: skb to create fragment from
|
* @skb: skb to create fragment from
|
||||||
* @frag_head: header to use in new fragment
|
* @frag_head: header to use in new fragment
|
||||||
* @fragment_size: size of new fragment
|
* @fragment_size: size of new fragment
|
||||||
@@ -401,22 +402,25 @@ bool batadv_frag_skb_fwd(struct sk_buff *skb,
|
@@ -401,22 +402,25 @@ out:
|
||||||
*
|
*
|
||||||
* Return: the new fragment, NULL on error.
|
* Return: the new fragment, NULL on error.
|
||||||
*/
|
*/
|
||||||
|
@ -56,7 +54,7 @@ index 385fccdcf69d05d63f59d024dfb721b1e8f1c8b9..f1d202ff396cd69949915a9e90e763f3
|
||||||
skb_split(skb, skb_fragment, skb->len - fragment_size);
|
skb_split(skb, skb_fragment, skb->len - fragment_size);
|
||||||
|
|
||||||
/* Add the header */
|
/* Add the header */
|
||||||
@@ -439,11 +443,12 @@ int batadv_frag_send_packet(struct sk_buff *skb,
|
@@ -439,11 +443,12 @@ int batadv_frag_send_packet(struct sk_bu
|
||||||
struct batadv_orig_node *orig_node,
|
struct batadv_orig_node *orig_node,
|
||||||
struct batadv_neigh_node *neigh_node)
|
struct batadv_neigh_node *neigh_node)
|
||||||
{
|
{
|
||||||
|
@ -70,7 +68,7 @@ index 385fccdcf69d05d63f59d024dfb721b1e8f1c8b9..f1d202ff396cd69949915a9e90e763f3
|
||||||
unsigned int header_size = sizeof(frag_header);
|
unsigned int header_size = sizeof(frag_header);
|
||||||
unsigned int max_fragment_size, num_fragments;
|
unsigned int max_fragment_size, num_fragments;
|
||||||
int ret;
|
int ret;
|
||||||
@@ -503,7 +508,7 @@ int batadv_frag_send_packet(struct sk_buff *skb,
|
@@ -503,7 +508,7 @@ int batadv_frag_send_packet(struct sk_bu
|
||||||
goto put_primary_if;
|
goto put_primary_if;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,11 +15,9 @@ Fixes: db56e4ecf5c2 ("batman-adv: Fragment and send skbs larger than mtu")
|
||||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/3e3ff987876d3be70d928561acbefe5a48ab1654
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/3e3ff987876d3be70d928561acbefe5a48ab1654
|
||||||
|
|
||||||
diff --git a/net/batman-adv/fragmentation.c b/net/batman-adv/fragmentation.c
|
|
||||||
index f1d202ff396cd69949915a9e90e763f3a68255b7..0da90e73c79bffe86072f0d704f0777d76b35f4c 100644
|
|
||||||
--- a/net/batman-adv/fragmentation.c
|
--- a/net/batman-adv/fragmentation.c
|
||||||
+++ b/net/batman-adv/fragmentation.c
|
+++ b/net/batman-adv/fragmentation.c
|
||||||
@@ -527,13 +527,14 @@ int batadv_frag_send_packet(struct sk_buff *skb,
|
@@ -527,13 +527,14 @@ int batadv_frag_send_packet(struct sk_bu
|
||||||
frag_header.no++;
|
frag_header.no++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,11 +15,9 @@ Fixes: 29b9256e6631 ("batman-adv: consider outgoing interface in OGM sending")
|
||||||
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/5061f9c502d7101912089d8f4a7866e0a926a49a
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/5061f9c502d7101912089d8f4a7866e0a926a49a
|
||||||
|
|
||||||
diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c
|
|
||||||
index bd4138ddf7e09a0020d9842d603dc98f21e225c7..2d398ac762aa612b6da2f64874bd07a6d84d5220 100644
|
|
||||||
--- a/net/batman-adv/bat_iv_ogm.c
|
--- a/net/batman-adv/bat_iv_ogm.c
|
||||||
+++ b/net/batman-adv/bat_iv_ogm.c
|
+++ b/net/batman-adv/bat_iv_ogm.c
|
||||||
@@ -373,8 +373,10 @@ static void batadv_iv_ogm_emit(struct batadv_forw_packet *forw_packet)
|
@@ -409,8 +409,10 @@ static void batadv_iv_ogm_emit(struct ba
|
||||||
if (WARN_ON(!forw_packet->if_outgoing))
|
if (WARN_ON(!forw_packet->if_outgoing))
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -0,0 +1,162 @@
|
||||||
|
From: Pavel Skripkin <paskripkin@gmail.com>
|
||||||
|
Date: Sun, 24 Oct 2021 16:13:56 +0300
|
||||||
|
Subject: batman-adv: fix error handling
|
||||||
|
|
||||||
|
Syzbot reported ODEBUG warning in batadv_nc_mesh_free(). The problem was
|
||||||
|
in wrong error handling in batadv_mesh_init().
|
||||||
|
|
||||||
|
Before this patch batadv_mesh_init() was calling batadv_mesh_free() in case
|
||||||
|
of any batadv_*_init() calls failure. This approach may work well, when
|
||||||
|
there is some kind of indicator, which can tell which parts of batadv are
|
||||||
|
initialized; but there isn't any.
|
||||||
|
|
||||||
|
All written above lead to cleaning up uninitialized fields. Even if we hide
|
||||||
|
ODEBUG warning by initializing bat_priv->nc.work, syzbot was able to hit
|
||||||
|
GPF in batadv_nc_purge_paths(), because hash pointer in still NULL. [1]
|
||||||
|
|
||||||
|
To fix these bugs we can unwind batadv_*_init() calls one by one.
|
||||||
|
It is good approach for 2 reasons: 1) It fixes bugs on error handling
|
||||||
|
path 2) It improves the performance, since we won't call unneeded
|
||||||
|
batadv_*_free() functions.
|
||||||
|
|
||||||
|
So, this patch makes all batadv_*_init() clean up all allocated memory
|
||||||
|
before returning with an error to no call correspoing batadv_*_free()
|
||||||
|
and open-codes batadv_mesh_free() with proper order to avoid touching
|
||||||
|
uninitialized fields.
|
||||||
|
|
||||||
|
Link: https://lore.kernel.org/netdev/000000000000c87fbd05cef6bcb0@google.com/ [1]
|
||||||
|
Reported-and-tested-by: syzbot+28b0702ada0bf7381f58@syzkaller.appspotmail.com
|
||||||
|
Fixes: 21e838760727 ("[batman-adv] fix various race conditions during startup & shutdown")
|
||||||
|
Signed-off-by: Pavel Skripkin <paskripkin@gmail.com>
|
||||||
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||||
|
Signed-off-by: Sven Eckelmann <sven@narfation.org>
|
||||||
|
Origin: upstream, https://git.open-mesh.org/batman-adv.git/commit/0631e0825c8129cd3896926da62a09ac00bf13a0
|
||||||
|
|
||||||
|
--- a/net/batman-adv/bridge_loop_avoidance.c
|
||||||
|
+++ b/net/batman-adv/bridge_loop_avoidance.c
|
||||||
|
@@ -1561,10 +1561,14 @@ int batadv_bla_init(struct batadv_priv *
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
bat_priv->bla.claim_hash = batadv_hash_new(128);
|
||||||
|
- bat_priv->bla.backbone_hash = batadv_hash_new(32);
|
||||||
|
+ if (!bat_priv->bla.claim_hash)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
|
||||||
|
- if (!bat_priv->bla.claim_hash || !bat_priv->bla.backbone_hash)
|
||||||
|
+ bat_priv->bla.backbone_hash = batadv_hash_new(32);
|
||||||
|
+ if (!bat_priv->bla.backbone_hash) {
|
||||||
|
+ batadv_hash_destroy(bat_priv->bla.claim_hash);
|
||||||
|
return -ENOMEM;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
batadv_hash_set_lock_class(bat_priv->bla.claim_hash,
|
||||||
|
&batadv_claim_hash_lock_class_key);
|
||||||
|
--- a/net/batman-adv/main.c
|
||||||
|
+++ b/net/batman-adv/main.c
|
||||||
|
@@ -197,29 +197,41 @@ int batadv_mesh_init(struct net_device *
|
||||||
|
|
||||||
|
bat_priv->gw.generation = 0;
|
||||||
|
|
||||||
|
- ret = batadv_v_mesh_init(bat_priv);
|
||||||
|
- if (ret < 0)
|
||||||
|
- goto err;
|
||||||
|
-
|
||||||
|
ret = batadv_originator_init(bat_priv);
|
||||||
|
- if (ret < 0)
|
||||||
|
- goto err;
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
|
||||||
|
+ goto err_orig;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
ret = batadv_tt_init(bat_priv);
|
||||||
|
- if (ret < 0)
|
||||||
|
- goto err;
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
|
||||||
|
+ goto err_tt;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ ret = batadv_v_mesh_init(bat_priv);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
|
||||||
|
+ goto err_v;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
ret = batadv_bla_init(bat_priv);
|
||||||
|
- if (ret < 0)
|
||||||
|
- goto err;
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
|
||||||
|
+ goto err_bla;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
ret = batadv_dat_init(bat_priv);
|
||||||
|
- if (ret < 0)
|
||||||
|
- goto err;
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
|
||||||
|
+ goto err_dat;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
ret = batadv_nc_mesh_init(bat_priv);
|
||||||
|
- if (ret < 0)
|
||||||
|
- goto err;
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ atomic_set(&bat_priv->mesh_state, BATADV_MESH_DEACTIVATING);
|
||||||
|
+ goto err_nc;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
batadv_gw_init(bat_priv);
|
||||||
|
batadv_mcast_init(bat_priv);
|
||||||
|
@@ -229,8 +241,20 @@ int batadv_mesh_init(struct net_device *
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
-err:
|
||||||
|
- batadv_mesh_free(soft_iface);
|
||||||
|
+err_nc:
|
||||||
|
+ batadv_dat_free(bat_priv);
|
||||||
|
+err_dat:
|
||||||
|
+ batadv_bla_free(bat_priv);
|
||||||
|
+err_bla:
|
||||||
|
+ batadv_v_mesh_free(bat_priv);
|
||||||
|
+err_v:
|
||||||
|
+ batadv_tt_free(bat_priv);
|
||||||
|
+err_tt:
|
||||||
|
+ batadv_originator_free(bat_priv);
|
||||||
|
+err_orig:
|
||||||
|
+ batadv_purge_outstanding_packets(bat_priv, NULL);
|
||||||
|
+ atomic_set(&bat_priv->mesh_state, BATADV_MESH_INACTIVE);
|
||||||
|
+
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
--- a/net/batman-adv/network-coding.c
|
||||||
|
+++ b/net/batman-adv/network-coding.c
|
||||||
|
@@ -155,8 +155,10 @@ int batadv_nc_mesh_init(struct batadv_pr
|
||||||
|
&batadv_nc_coding_hash_lock_class_key);
|
||||||
|
|
||||||
|
bat_priv->nc.decoding_hash = batadv_hash_new(128);
|
||||||
|
- if (!bat_priv->nc.decoding_hash)
|
||||||
|
+ if (!bat_priv->nc.decoding_hash) {
|
||||||
|
+ batadv_hash_destroy(bat_priv->nc.coding_hash);
|
||||||
|
goto err;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
batadv_hash_set_lock_class(bat_priv->nc.decoding_hash,
|
||||||
|
&batadv_nc_decoding_hash_lock_class_key);
|
||||||
|
--- a/net/batman-adv/translation-table.c
|
||||||
|
+++ b/net/batman-adv/translation-table.c
|
||||||
|
@@ -4405,8 +4405,10 @@ int batadv_tt_init(struct batadv_priv *b
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = batadv_tt_global_init(bat_priv);
|
||||||
|
- if (ret < 0)
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ batadv_tt_local_table_free(bat_priv);
|
||||||
|
return ret;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
batadv_tvlv_handler_register(bat_priv, batadv_tt_tvlv_ogm_handler_v1,
|
||||||
|
batadv_tt_tvlv_unicast_handler_v1,
|
Loading…
Reference in New Issue