The following commit has been merged in the master branch:
commit 4d64321c4f6faf90b5a3b9f52ee1e7e0eeeff00c
Merge: e4f349bd6e58051df698b82f94721f18a02a293d
8772cc49e0b8ab782e475ce5ef659eedab601a09
Author: Jakub Kicinski <[email protected]>
Date: Fri May 9 17:09:39 2025 -0700
Merge tag 'batadv-net-pullrequest-20250509' of
git://git.open-mesh.org/linux-merge
Simon Wunderlich says:
====================
Here is a batman-adv bugfix:
- fix duplicate MAC address check, by Matthias Schiffer
* tag 'batadv-net-pullrequest-20250509' of
git://git.open-mesh.org/linux-merge:
batman-adv: fix duplicate MAC address check
====================
Link: https://patch.msgid.link/[email protected]
Signed-off-by: Jakub Kicinski <[email protected]>
diff --combined net/batman-adv/hard-interface.c
index 7cd4bdcee4393,d099434d3dfab..558d39dffc233
--- a/net/batman-adv/hard-interface.c
+++ b/net/batman-adv/hard-interface.c
@@@ -506,28 -506,32 +506,32 @@@ batadv_hardif_is_iface_up(const struct
return false;
}
- static void batadv_check_known_mac_addr(const struct net_device *net_dev)
+ static void batadv_check_known_mac_addr(const struct batadv_hard_iface
*hard_iface)
{
- const struct batadv_hard_iface *hard_iface;
+ const struct net_device *mesh_iface = hard_iface->mesh_iface;
+ const struct batadv_hard_iface *tmp_hard_iface;
- rcu_read_lock();
- list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) {
- if (hard_iface->if_status != BATADV_IF_ACTIVE &&
- hard_iface->if_status != BATADV_IF_TO_BE_ACTIVATED)
+ if (!mesh_iface)
+ return;
+
+ list_for_each_entry(tmp_hard_iface, &batadv_hardif_list, list) {
+ if (tmp_hard_iface == hard_iface)
+ continue;
+
+ if (tmp_hard_iface->mesh_iface != mesh_iface)
continue;
- if (hard_iface->net_dev == net_dev)
+ if (tmp_hard_iface->if_status == BATADV_IF_NOT_IN_USE)
continue;
- if (!batadv_compare_eth(hard_iface->net_dev->dev_addr,
- net_dev->dev_addr))
+ if (!batadv_compare_eth(tmp_hard_iface->net_dev->dev_addr,
+ hard_iface->net_dev->dev_addr))
continue;
pr_warn("The newly added mac address (%pM) already exists on:
%s\n",
- net_dev->dev_addr, hard_iface->net_dev->name);
+ hard_iface->net_dev->dev_addr,
tmp_hard_iface->net_dev->name);
pr_warn("It is strongly recommended to keep mac addresses
unique to avoid problems!\n");
}
- rcu_read_unlock();
}
/**
@@@ -725,6 -729,7 +729,6 @@@ int batadv_hardif_enable_interface(stru
kref_get(&hard_iface->refcount);
- dev_hold(mesh_iface);
netdev_hold(mesh_iface, &hard_iface->meshif_dev_tracker, GFP_ATOMIC);
hard_iface->mesh_iface = mesh_iface;
bat_priv = netdev_priv(hard_iface->mesh_iface);
@@@ -763,6 -768,8 +767,8 @@@
hard_iface->net_dev->name, hardif_mtu,
required_mtu);
+ batadv_check_known_mac_addr(hard_iface);
+
if (batadv_hardif_is_iface_up(hard_iface))
batadv_hardif_activate_interface(hard_iface);
else
@@@ -901,7 -908,6 +907,6 @@@ batadv_hardif_add_interface(struct net_
batadv_v_hardif_init(hard_iface);
- batadv_check_known_mac_addr(hard_iface->net_dev);
kref_get(&hard_iface->refcount);
list_add_tail_rcu(&hard_iface->list, &batadv_hardif_list);
batadv_hardif_generation++;
@@@ -988,7 -994,7 +993,7 @@@ static int batadv_hard_if_event(struct
if (hard_iface->if_status == BATADV_IF_NOT_IN_USE)
goto hardif_put;
- batadv_check_known_mac_addr(hard_iface->net_dev);
+ batadv_check_known_mac_addr(hard_iface);
bat_priv = netdev_priv(hard_iface->mesh_iface);
bat_priv->algo_ops->iface.update_mac(hard_iface);
--
LinuxNextTracking