diff options
Diffstat (limited to 'net/ipv4/fib_semantics.c')
| -rw-r--r-- | net/ipv4/fib_semantics.c | 8 | 
1 files changed, 6 insertions, 2 deletions
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index 539fa264e67d..e9f56225e53f 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c @@ -1057,6 +1057,7 @@ struct fib_info *fib_create_info(struct fib_config *cfg)  	fi->fib_priority = cfg->fc_priority;  	fi->fib_prefsrc = cfg->fc_prefsrc;  	fi->fib_type = cfg->fc_type; +	fi->fib_tb_id = cfg->fc_table;  	fi->fib_nhs = nhs;  	change_nexthops(fi) { @@ -1337,18 +1338,21 @@ nla_put_failure:   *   referring to it.   * - device went down -> we must shutdown all nexthops going via it.   */ -int fib_sync_down_addr(struct net *net, __be32 local) +int fib_sync_down_addr(struct net_device *dev, __be32 local)  {  	int ret = 0;  	unsigned int hash = fib_laddr_hashfn(local);  	struct hlist_head *head = &fib_info_laddrhash[hash]; +	struct net *net = dev_net(dev); +	int tb_id = l3mdev_fib_table(dev);  	struct fib_info *fi;  	if (!fib_info_laddrhash || local == 0)  		return 0;  	hlist_for_each_entry(fi, head, fib_lhash) { -		if (!net_eq(fi->fib_net, net)) +		if (!net_eq(fi->fib_net, net) || +		    fi->fib_tb_id != tb_id)  			continue;  		if (fi->fib_prefsrc == local) {  			fi->fib_flags |= RTNH_F_DEAD;  | 
