summaryrefslogtreecommitdiffstats
path: root/target/linux
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux')
-rw-r--r--target/linux/generic-2.4/patches/228-bridge-preferred.patch61
1 files changed, 61 insertions, 0 deletions
diff --git a/target/linux/generic-2.4/patches/228-bridge-preferred.patch b/target/linux/generic-2.4/patches/228-bridge-preferred.patch
new file mode 100644
index 000000000..c7a479836
--- /dev/null
+++ b/target/linux/generic-2.4/patches/228-bridge-preferred.patch
@@ -0,0 +1,61 @@
+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;