--- zzzz-none-000/linux-2.4.17/net/bridge/br_stp_if.c 2001-04-19 15:38:50.000000000 +0000 +++ sangam-fb-401/linux-2.4.17/net/bridge/br_stp_if.c 2005-09-20 12:59:20.000000000 +0000 @@ -5,7 +5,7 @@ * Authors: * Lennert Buytenhek * - * $Id: br_stp_if.c,v 1.4 2001/04/14 21:14:39 davem Exp $ + * $Id: br_stp_if.c,v 1.1.1.1 2003/06/23 22:18:44 jharrell Exp $ * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -157,20 +157,72 @@ { unsigned char *addr; struct net_bridge_port *p; +#if 1 + char eth_instance = 0; + unsigned char *eth_mac; +#endif addr = br_mac_zero; p = br->port_list; while (p != NULL) { + + if(br->stp_enabled == 1) + goto original; + +#if 1 + /* take mac from the last eth interface or + * numerical lowest mac that is not zero, UDO */ + if (strncmp(p->dev->name, "eth", 3) == 0) { + if (!eth_instance || (eth_instance < p->dev->name[3])) { + eth_instance = p->dev->name[3]; + eth_mac = p->dev->dev_addr; + } + } + original: + if (0 != memcmp(p->dev->dev_addr, br_mac_zero, ETH_ALEN)) { + if (0 == memcmp(addr, br_mac_zero, ETH_ALEN) || + memcmp(p->dev->dev_addr, addr, ETH_ALEN) < 0) + addr = p->dev->dev_addr; + } +#else + if(strcmp(p->dev->name, "eth0") == 0) { + addr = p->dev->dev_addr; + break; + } + + original: if (addr == br_mac_zero || memcmp(p->dev->dev_addr, addr, ETH_ALEN) < 0) addr = p->dev->dev_addr; +#endif p = p->next; } +#if 1 + if (eth_instance) { + addr = eth_mac; + } +#endif - if (memcmp(br->bridge_id.addr, addr, ETH_ALEN)) + 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); br_stp_change_bridge_id(br, addr); + } +} + +/* UDO */ +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, 1/*is local*/); + br_stp_change_bridge_id(br, addr); + } } /* called under bridge lock */