From e7d900b2103772023ce3f24b16426f76aa1b799a Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Wed, 21 Dec 2005 18:51:49 -0800 Subject: [PATCH] --- yaml --- r: 15551 b: refs/heads/master c: 4505a3ef720845b5db3ddb440de13cd4800fd508 h: refs/heads/master i: 15549: 73a882d433dfd6a755e746bd5a5ae7a619f917b2 15547: 1a6c50fa0ca41fb0716d1c3c95d0035d2f2f135c 15543: daeab9db31b5dfb01bf4cc4a467eb61682fc6229 15535: 355813dfa442c00b90eb458c8f47a1adaf44ce5a 15519: d1578767165ecb4d82897b2d9a48d91697d0fa85 15487: 30c37efe9a49266212301b8e8d6b0c4ec6a228bf v: v3 --- [refs] | 2 +- trunk/net/bridge/br_device.c | 28 ++++++++++++++++++++++++++-- trunk/net/bridge/br_private.h | 1 + trunk/net/bridge/br_stp_if.c | 3 +-- 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 0203e76169c7..dce0d8a56c95 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: fbe9cc4a87030d5cad5f944ffaef6af7efd119e4 +refs/heads/master: 4505a3ef720845b5db3ddb440de13cd4800fd508 diff --git a/trunk/net/bridge/br_device.c b/trunk/net/bridge/br_device.c index f564ee99782d..f7a66abf5def 100644 --- a/trunk/net/bridge/br_device.c +++ b/trunk/net/bridge/br_device.c @@ -15,7 +15,8 @@ #include #include -#include +#include + #include #include "br_private.h" @@ -82,6 +83,29 @@ 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 + */ +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; + + 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; + } + } + spin_unlock_bh(&br->lock); + + return err; +} + void br_dev_setup(struct net_device *dev) { memset(dev->dev_addr, 0, ETH_ALEN); @@ -98,6 +122,6 @@ void br_dev_setup(struct net_device *dev) SET_MODULE_OWNER(dev); dev->stop = br_dev_stop; dev->tx_queue_len = 0; - dev->set_mac_address = NULL; + dev->set_mac_address = br_set_mac_address; dev->priv_flags = IFF_EBRIDGE; } diff --git a/trunk/net/bridge/br_private.h b/trunk/net/bridge/br_private.h index bdf95a74d8cd..2c249486476f 100644 --- a/trunk/net/bridge/br_private.h +++ b/trunk/net/bridge/br_private.h @@ -201,6 +201,7 @@ extern void br_stp_disable_bridge(struct net_bridge *br); extern void br_stp_enable_port(struct net_bridge_port *p); extern void br_stp_disable_port(struct net_bridge_port *p); extern void br_stp_recalculate_bridge_id(struct net_bridge *br); +extern void br_stp_change_bridge_id(struct net_bridge *br, const unsigned char *a); extern void br_stp_set_bridge_priority(struct net_bridge *br, u16 newprio); extern void br_stp_set_port_priority(struct net_bridge_port *p, diff --git a/trunk/net/bridge/br_stp_if.c b/trunk/net/bridge/br_stp_if.c index ac09b6a23523..2d2e969ae25d 100644 --- a/trunk/net/bridge/br_stp_if.c +++ b/trunk/net/bridge/br_stp_if.c @@ -120,8 +120,7 @@ void br_stp_disable_port(struct net_bridge_port *p) } /* called under bridge lock */ -static void br_stp_change_bridge_id(struct net_bridge *br, - const unsigned char *addr) +void br_stp_change_bridge_id(struct net_bridge *br, const unsigned char *addr) { unsigned char oldaddr[6]; struct net_bridge_port *p;