Skip to content

Commit

Permalink
[BRIDGE]: allow setting hardware address of bridge pseudo-dev
Browse files Browse the repository at this point in the history
Some people are using bridging to hide multiple machines from an ISP
that restricts by MAC address. So in that case allow the bridge mac
address to be set to any of the existing interfaces.  I don't want to
allow any arbitrary value and confuse STP.

Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Stephen Hemminger authored and David S. Miller committed Jan 3, 2006
1 parent fbe9cc4 commit 4505a3e
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 4 deletions.
28 changes: 26 additions & 2 deletions net/bridge/br_device.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@

#include <linux/kernel.h>
#include <linux/netdevice.h>
#include <linux/module.h>
#include <linux/etherdevice.h>

#include <asm/uaccess.h>
#include "br_private.h"

Expand Down Expand Up @@ -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);
Expand All @@ -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;
}
1 change: 1 addition & 0 deletions net/bridge/br_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
3 changes: 1 addition & 2 deletions net/bridge/br_stp_if.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 4505a3e

Please sign in to comment.