Skip to content

Commit

Permalink
[BRIDGE]: flush forwarding table when device carrier off
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Stephen Hemminger authored and David S. Miller committed Oct 16, 2006
1 parent 9ea8cfd commit 1a62069
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 4 deletions.
7 changes: 6 additions & 1 deletion net/bridge/br_fdb.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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
Expand Down
4 changes: 2 additions & 2 deletions net/bridge/br_if.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion net/bridge/br_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 2 additions & 0 deletions net/bridge/br_stp_if.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 1a62069

Please sign in to comment.