Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 15551
b: refs/heads/master
c: 4505a3e
h: refs/heads/master
i:
  15549: 73a882d
  15547: 1a6c50f
  15543: daeab9d
  15535: 355813d
  15519: d157876
  15487: 30c37ef
v: v3
  • Loading branch information
Stephen Hemminger authored and David S. Miller committed Jan 3, 2006
1 parent 5df0a6e commit e7d900b
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 5 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: fbe9cc4a87030d5cad5f944ffaef6af7efd119e4
refs/heads/master: 4505a3ef720845b5db3ddb440de13cd4800fd508
28 changes: 26 additions & 2 deletions trunk/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 trunk/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 trunk/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 e7d900b

Please sign in to comment.