Skip to content

Commit

Permalink
bridge: make bridge address settings sticky
Browse files Browse the repository at this point in the history
Normally, the bridge just chooses the smallest mac address as the
bridge id and mac address of bridge device. But if the administrator
has explictly set the interface address then don't change it.

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Stephen Hemminger authored and davem330 committed Jun 17, 2008
1 parent 43aa192 commit 92c0574
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 0 deletions.
1 change: 1 addition & 0 deletions net/bridge/br_device.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ static int br_set_mac_address(struct net_device *dev, void *p)
spin_lock_bh(&br->lock);
memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
br_stp_change_bridge_id(br, addr->sa_data);
br->flags |= BR_SET_MAC_ADDR;
spin_unlock_bh(&br->lock);

return 0;
Expand Down
2 changes: 2 additions & 0 deletions net/bridge/br_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ struct net_bridge
struct hlist_head hash[BR_HASH_SIZE];
struct list_head age_list;
unsigned long feature_mask;
unsigned long flags;
#define BR_SET_MAC_ADDR 0x00000001

/* STP */
bridge_id designated_root;
Expand Down
4 changes: 4 additions & 0 deletions net/bridge/br_stp_if.c
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,10 @@ void br_stp_recalculate_bridge_id(struct net_bridge *br)
const unsigned char *addr = br_mac_zero;
struct net_bridge_port *p;

/* user has chosen a value so keep it */
if (br->flags & BR_SET_MAC_ADDR)
return;

list_for_each_entry(p, &br->port_list, list) {
if (addr == br_mac_zero ||
memcmp(p->dev->dev_addr, addr, ETH_ALEN) < 0)
Expand Down

0 comments on commit 92c0574

Please sign in to comment.