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

Reply via email to