--- zzzz-none-000/linux-2.6.28.10/net/bridge/br_stp_if.c 2009-05-02 18:54:43.000000000 +0000 +++ puma5-6360-529/linux-2.6.28.10/net/bridge/br_stp_if.c 2009-10-23 13:23:35.000000000 +0000 @@ -10,10 +10,29 @@ * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ +/*---------------------------------------------------------------------------- +// Copyright 2007, Texas Instruments Incorporated +// +// This program has been modified from its original operation by Texas Instruments +// to do the following: +// +// 1. HIL Event generation to support TI Packet Processor +// +// THIS MODIFIED SOFTWARE AND DOCUMENTATION ARE PROVIDED +// "AS IS," AND TEXAS INSTRUMENTS MAKES NO REPRESENTATIONS +// OR WARRENTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +// TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY +// PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR +// DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, +// COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. +// +// These changes are covered as per original license +//-----------------------------------------------------------------------------*/ #include #include #include +#include #include "br_private.h" #include "br_private_stp.h" @@ -113,6 +132,9 @@ br_port_state_selection(br); + /* Generate the event indicating that the port has been disabled. */ + ti_hil_pp_event(TI_BRIDGE_PORT_DISABLED, (void *)p->dev); + if (br_is_root_bridge(br) && !wasroot) br_become_root_bridge(br); } @@ -203,6 +225,25 @@ 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. gehoert + */ + 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); + } +} + + /* should be aligned on 2 bytes for compare_ether_addr() */ static const unsigned short br_mac_zero_aligned[ETH_ALEN >> 1]; @@ -225,9 +266,12 @@ } - if (compare_ether_addr(br->bridge_id.addr, addr)) + 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 */ void br_stp_set_bridge_priority(struct net_bridge *br, u16 newprio)