mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-08 15:04:45 +00:00
[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);
|
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;
|
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)
|
if (f->dst != p)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (f->is_static && !do_all)
|
||||||
|
continue;
|
||||||
/*
|
/*
|
||||||
* if multiple ports all have the same device address
|
* if multiple ports all have the same device address
|
||||||
* then when one port is deleted, assign
|
* 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);
|
br_stp_disable_port(p);
|
||||||
spin_unlock_bh(&br->lock);
|
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);
|
list_del_rcu(&p->list);
|
||||||
|
|
||||||
@ -448,7 +448,7 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
err2:
|
err2:
|
||||||
br_fdb_delete_by_port(br, p);
|
br_fdb_delete_by_port(br, p, 1);
|
||||||
err1:
|
err1:
|
||||||
kobject_del(&p->kobj);
|
kobject_del(&p->kobj);
|
||||||
err0:
|
err0:
|
||||||
|
@ -143,7 +143,7 @@ extern void br_fdb_changeaddr(struct net_bridge_port *p,
|
|||||||
const unsigned char *newaddr);
|
const unsigned char *newaddr);
|
||||||
extern void br_fdb_cleanup(unsigned long arg);
|
extern void br_fdb_cleanup(unsigned long arg);
|
||||||
extern void br_fdb_delete_by_port(struct net_bridge *br,
|
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,
|
extern struct net_bridge_fdb_entry *__br_fdb_get(struct net_bridge *br,
|
||||||
const unsigned char *addr);
|
const unsigned char *addr);
|
||||||
extern struct net_bridge_fdb_entry *br_fdb_get(struct net_bridge *br,
|
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->forward_delay_timer);
|
||||||
del_timer(&p->hold_timer);
|
del_timer(&p->hold_timer);
|
||||||
|
|
||||||
|
br_fdb_delete_by_port(br, p, 0);
|
||||||
|
|
||||||
br_configuration_update(br);
|
br_configuration_update(br);
|
||||||
|
|
||||||
br_port_state_selection(br);
|
br_port_state_selection(br);
|
||||||
|
Loading…
Reference in New Issue
Block a user