diff options
Diffstat (limited to 'net/ipv4/fib_semantics.c')
| -rw-r--r-- | net/ipv4/fib_semantics.c | 11 | 
1 files changed, 7 insertions, 4 deletions
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c index e9a7f70a54df..ce9ff3c62e84 100644 --- a/net/ipv4/fib_semantics.c +++ b/net/ipv4/fib_semantics.c @@ -423,6 +423,7 @@ static struct fib_info *fib_find_info(struct fib_info *nfi)  		    nfi->fib_prefsrc == fi->fib_prefsrc &&  		    nfi->fib_priority == fi->fib_priority &&  		    nfi->fib_type == fi->fib_type && +		    nfi->fib_tb_id == fi->fib_tb_id &&  		    memcmp(nfi->fib_metrics, fi->fib_metrics,  			   sizeof(u32) * RTAX_MAX) == 0 &&  		    !((nfi->fib_flags ^ fi->fib_flags) & ~RTNH_COMPARE_MASK) && @@ -888,9 +889,11 @@ int fib_nh_match(struct net *net, struct fib_config *cfg, struct fib_info *fi,  		return 1;  	} -	/* cannot match on nexthop object attributes */ -	if (fi->nh) -		return 1; +	if (fi->nh) { +		if (cfg->fc_oif || cfg->fc_gw_family || cfg->fc_mp) +			return 1; +		return 0; +	}  	if (cfg->fc_oif || cfg->fc_gw_family) {  		struct fib_nh *nh; @@ -1231,7 +1234,7 @@ static int fib_check_nh_nongw(struct net *net, struct fib_nh *nh,  	nh->fib_nh_dev = in_dev->dev;  	netdev_hold(nh->fib_nh_dev, &nh->fib_nh_dev_tracker, GFP_ATOMIC); -	nh->fib_nh_scope = RT_SCOPE_LINK; +	nh->fib_nh_scope = RT_SCOPE_HOST;  	if (!netif_carrier_ok(nh->fib_nh_dev))  		nh->fib_nh_flags |= RTNH_F_LINKDOWN;  	err = 0;  |