Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1a620698 authored by Stephen Hemminger's avatar Stephen Hemminger Committed by David S. Miller
Browse files

[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: default avatarStephen Hemminger <shemminger@osdl.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9ea8cfd6
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -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
+2 −2
Original line number Diff line number Diff line
@@ -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:
+1 −1
Original line number Diff line number Diff line
@@ -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,
+2 −0
Original line number Diff line number Diff line
@@ -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);