8d0fbf6d72
SVN-Revision: 4305
61 lines
2 KiB
Diff
61 lines
2 KiB
Diff
diff -rup linux-rb24/net/bridge/br_device.c linux-rb24bpatch/net/bridge/br_device.c
|
|
--- linux-rb24/net/bridge/br_device.c 2002-02-25 11:38:14.000000000 -0800
|
|
+++ linux-rb24bpatch/net/bridge/br_device.c 2005-07-05 02:09:17.000000000 -0700
|
|
@@ -121,6 +121,23 @@ static int br_dev_accept_fastpath(struct
|
|
return -1;
|
|
}
|
|
|
|
+static int
|
|
+br_set_mac_address(struct net_device *dev, void *addr)
|
|
+{
|
|
+ struct net_bridge *br = dev->priv;
|
|
+ struct sockaddr *sa = (struct sockaddr *) addr;
|
|
+
|
|
+ write_lock_bh(&br->lock);
|
|
+
|
|
+ memcpy(br->preferred_id.addr, sa->sa_data, ETH_ALEN);
|
|
+
|
|
+ br_stp_recalculate_bridge_id(br);
|
|
+
|
|
+ write_unlock_bh(&br->lock);
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
void br_dev_setup(struct net_device *dev)
|
|
{
|
|
memset(dev->dev_addr, 0, ETH_ALEN);
|
|
@@ -133,5 +150,5 @@ void br_dev_setup(struct net_device *dev
|
|
dev->stop = br_dev_stop;
|
|
dev->accept_fastpath = br_dev_accept_fastpath;
|
|
dev->tx_queue_len = 0;
|
|
- dev->set_mac_address = NULL;
|
|
+ dev->set_mac_address = br_set_mac_address;
|
|
}
|
|
diff -rup linux-rb24/net/bridge/br_private.h linux-rb24bpatch/net/bridge/br_private.h
|
|
--- linux-rb24/net/bridge/br_private.h 2004-08-07 16:26:06.000000000 -0700
|
|
+++ linux-rb24bpatch/net/bridge/br_private.h 2005-07-05 02:12:56.000000000 -0700
|
|
@@ -95,6 +95,7 @@ struct net_bridge
|
|
int hello_time;
|
|
int forward_delay;
|
|
bridge_id bridge_id;
|
|
+ bridge_id preferred_id;
|
|
int bridge_max_age;
|
|
int bridge_hello_time;
|
|
int bridge_forward_delay;
|
|
diff -rup linux-rb24/net/bridge/br_stp_if.c linux-rb24bpatch/net/bridge/br_stp_if.c
|
|
--- linux-rb24/net/bridge/br_stp_if.c 2001-04-19 08:38:50.000000000 -0700
|
|
+++ linux-rb24bpatch/net/bridge/br_stp_if.c 2005-07-05 02:22:11.000000000 -0700
|
|
@@ -162,6 +162,12 @@ void br_stp_recalculate_bridge_id(struct
|
|
|
|
p = br->port_list;
|
|
while (p != NULL) {
|
|
+ /* match against preferred address first */
|
|
+ if (memcmp(p->dev->dev_addr,br->preferred_id.addr,ETH_ALEN) == 0) {
|
|
+ addr = p->dev->dev_addr;
|
|
+ break;
|
|
+ }
|
|
+
|
|
if (addr == br_mac_zero ||
|
|
memcmp(p->dev->dev_addr, addr, ETH_ALEN) < 0)
|
|
addr = p->dev->dev_addr;
|