bridge: allow changing hardware address to any valid address
authorStephen Hemminger <shemminger@linux-foundation.org>
Mon, 9 Apr 2007 18:49:58 +0000 (11:49 -0700)
committerDavid S. Miller <davem@sunset.davemloft.net>
Thu, 26 Apr 2007 05:28:50 +0000 (22:28 -0700)
For case of bridging pseudo devices, the get created/destroyed (Xen)
need to allow setting address to any valid value.

Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
net/bridge/br_device.c

index b22ada529cc3dba1209ee966b464c9ee51fee897..39b87dad35b7daed54d45b059896cff80cbb19f0 100644 (file)
@@ -83,27 +83,22 @@ static int br_change_mtu(struct net_device *dev, int new_mtu)
        return 0;
 }
 
-/* Allow setting mac address of pseudo-bridge to be same as
- * any of the bound interfaces
- */
+/* Allow setting mac address to any valid ethernet address. */
 static int br_set_mac_address(struct net_device *dev, void *p)
 {
        struct net_bridge *br = netdev_priv(dev);
        struct sockaddr *addr = p;
        struct net_bridge_port *port;
-       int err = -EADDRNOTAVAIL;
+
+       if (!is_valid_ether_addr(addr->sa_data))
+               return -EINVAL;
 
        spin_lock_bh(&br->lock);
-       list_for_each_entry(port, &br->port_list, list) {
-               if (!compare_ether_addr(port->dev->dev_addr, addr->sa_data)) {
-                       br_stp_change_bridge_id(br, addr->sa_data);
-                       err = 0;
-                       break;
-               }
-       }
+       memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
+       br_stp_change_bridge_id(br, addr->sa_data);
        spin_unlock_bh(&br->lock);
 
-       return err;
+       return 0;
 }
 
 static void br_getinfo(struct net_device *dev, struct ethtool_drvinfo *info)