diff --git a/openwrt/target/linux/generic-2.4/patches/228-bridge-preferred.patch b/openwrt/target/linux/generic-2.4/patches/228-bridge-preferred.patch new file mode 100644 index 0000000000..c7a479836b --- /dev/null +++ b/openwrt/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;