--- zzzz-none-000/linux-2.6.13.1/net/bridge/br_stp_if.c 2005-09-10 02:42:58.000000000 +0000 +++ ohio-7170-487/linux-2.6.13.1/net/bridge/br_stp_if.c 2006-05-10 09:04:45.000000000 +0000 @@ -15,6 +15,7 @@ #include #include +#include #include "br_private.h" #include "br_private_stp.h" @@ -133,10 +134,10 @@ memcpy(br->dev->dev_addr, addr, ETH_ALEN); list_for_each_entry(p, &br->port_list, list) { - if (!memcmp(p->designated_bridge.addr, oldaddr, ETH_ALEN)) + if (!compare_ether_addr(p->designated_bridge.addr, oldaddr)) memcpy(p->designated_bridge.addr, addr, ETH_ALEN); - if (!memcmp(p->designated_root.addr, oldaddr, ETH_ALEN)) + if (!compare_ether_addr(p->designated_root.addr, oldaddr)) memcpy(p->designated_root.addr, addr, ETH_ALEN); } @@ -147,6 +148,19 @@ br_become_root_bridge(br); } +/* AVM */ +void br_stp_set_bridge_id(struct net_bridge *br, void *addr) +{ + if (memcmp(br->bridge_id.addr, addr, ETH_ALEN)) { + /* alte mac aus der fdb loeschen, wenn sie nicht zu einem port der br. gehört */ + br_fdb_delete_by_mac_if_local_without_port(br, br->bridge_id.addr); + /* hier wird im fdb entry der port nicht ueberschrieben, wenn die mac zu einem + port der bridge gehoert */ + br_fdb_insert(br, 0/*no attached port*/, addr); + br_stp_change_bridge_id(br, addr); + } +} + static const unsigned char br_mac_zero[6]; /* called under bridge lock */ @@ -157,13 +171,16 @@ list_for_each_entry(p, &br->port_list, list) { if (addr == br_mac_zero || - memcmp(p->dev->dev_addr, addr, ETH_ALEN) < 0) + compare_ether_addr(p->dev->dev_addr, addr) < 0) addr = p->dev->dev_addr; } - if (memcmp(br->bridge_id.addr, addr, ETH_ALEN)) + if (compare_ether_addr(br->bridge_id.addr, addr)) { + /* alte mac aus der fdb loeschen, wenn sie nicht zu einem port der br. gehört */ + br_fdb_delete_by_mac_if_local_without_port(br, br->bridge_id.addr); br_stp_change_bridge_id(br, addr); + } } /* called under bridge lock */