[BRIDGE]: flush forwarding table when device carrier off
Flush the forwarding table when carrier is lost. This helps for availability because we don't want to forward to a downed device and new packets may come in on other links. Signed-off-by: Stephen Hemminger <shemminger@osdl.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
9ea8cfd6aa
commit
1a620698c2
|
@ -128,7 +128,10 @@ void br_fdb_cleanup(unsigned long _data)
|
|||
mod_timer(&br->gc_timer, jiffies + HZ/10);
|
||||
}
|
||||
|
||||
void br_fdb_delete_by_port(struct net_bridge *br, struct net_bridge_port *p)
|
||||
|
||||
void br_fdb_delete_by_port(struct net_bridge *br,
|
||||
const struct net_bridge_port *p,
|
||||
int do_all)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -142,6 +145,8 @@ void br_fdb_delete_by_port(struct net_bridge *br, struct net_bridge_port *p)
|
|||
if (f->dst != p)
|
||||
continue;
|
||||
|
||||
if (f->is_static && !do_all)
|
||||
continue;
|
||||
/*
|
||||
* if multiple ports all have the same device address
|
||||
* then when one port is deleted, assign
|
||||
|
|
|
@ -163,7 +163,7 @@ static void del_nbp(struct net_bridge_port *p)
|
|||
br_stp_disable_port(p);
|
||||
spin_unlock_bh(&br->lock);
|
||||
|
||||
br_fdb_delete_by_port(br, p);
|
||||
br_fdb_delete_by_port(br, p, 1);
|
||||
|
||||
list_del_rcu(&p->list);
|
||||
|
||||
|
@ -448,7 +448,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
|
|||
|
||||
return 0;
|
||||
err2:
|
||||
br_fdb_delete_by_port(br, p);
|
||||
br_fdb_delete_by_port(br, p, 1);
|
||||
err1:
|
||||
kobject_del(&p->kobj);
|
||||
err0:
|
||||
|
|
|
@ -143,7 +143,7 @@ extern void br_fdb_changeaddr(struct net_bridge_port *p,
|
|||
const unsigned char *newaddr);
|
||||
extern void br_fdb_cleanup(unsigned long arg);
|
||||
extern void br_fdb_delete_by_port(struct net_bridge *br,
|
||||
struct net_bridge_port *p);
|
||||
const struct net_bridge_port *p, int do_all);
|
||||
extern struct net_bridge_fdb_entry *__br_fdb_get(struct net_bridge *br,
|
||||
const unsigned char *addr);
|
||||
extern struct net_bridge_fdb_entry *br_fdb_get(struct net_bridge *br,
|
||||
|
|
|
@ -113,6 +113,8 @@ void br_stp_disable_port(struct net_bridge_port *p)
|
|||
del_timer(&p->forward_delay_timer);
|
||||
del_timer(&p->hold_timer);
|
||||
|
||||
br_fdb_delete_by_port(br, p, 0);
|
||||
|
||||
br_configuration_update(br);
|
||||
|
||||
br_port_state_selection(br);
|
||||
|
|
Loading…
Reference in a new issue