mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	ipv6: Refactor fib6_ignore_linkdown
fib6_ignore_linkdown takes a fib6_info but only looks at the net_device and its IPv6 config. Change it to take a net_device over a fib6_info as its input argument. In addition, move it to a header file to make the check inline and usable later with IPv4 code without going through the ipv6 stub, and rename to ip6_ignore_linkdown since it is only checking the setting based on the ipv6 struct on a device. Signed-off-by: David Ahern <dsahern@gmail.com> Reviewed-by: Ido Schimmel <idosch@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									2b2450ca4a
								
							
						
					
					
						commit
						6d3d07b45c
					
				
					 2 changed files with 11 additions and 18 deletions
				
			
		| 
						 | 
					@ -425,6 +425,14 @@ static inline void in6_dev_hold(struct inet6_dev *idev)
 | 
				
			||||||
	refcount_inc(&idev->refcnt);
 | 
						refcount_inc(&idev->refcnt);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* called with rcu_read_lock held */
 | 
				
			||||||
 | 
					static inline bool ip6_ignore_linkdown(const struct net_device *dev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const struct inet6_dev *idev = __in6_dev_get(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return !!idev->cnf.ignore_routes_with_linkdown;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp);
 | 
					void inet6_ifa_finish_destroy(struct inet6_ifaddr *ifp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void in6_ifa_put(struct inet6_ifaddr *ifp)
 | 
					static inline void in6_ifa_put(struct inet6_ifaddr *ifp)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -639,21 +639,6 @@ static int rt6_score_route(struct fib6_info *rt, int oif, int strict)
 | 
				
			||||||
	return m;
 | 
						return m;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* called with rc_read_lock held */
 | 
					 | 
				
			||||||
static inline bool fib6_ignore_linkdown(const struct fib6_info *f6i)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	const struct net_device *dev = fib6_info_nh_dev(f6i);
 | 
					 | 
				
			||||||
	bool rc = false;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (dev) {
 | 
					 | 
				
			||||||
		const struct inet6_dev *idev = __in6_dev_get(dev);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		rc = !!idev->cnf.ignore_routes_with_linkdown;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return rc;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static struct fib6_info *find_match(struct fib6_info *rt, int oif, int strict,
 | 
					static struct fib6_info *find_match(struct fib6_info *rt, int oif, int strict,
 | 
				
			||||||
				   int *mpri, struct fib6_info *match,
 | 
									   int *mpri, struct fib6_info *match,
 | 
				
			||||||
				   bool *do_rr)
 | 
									   bool *do_rr)
 | 
				
			||||||
| 
						 | 
					@ -664,7 +649,7 @@ static struct fib6_info *find_match(struct fib6_info *rt, int oif, int strict,
 | 
				
			||||||
	if (rt->fib6_nh.nh_flags & RTNH_F_DEAD)
 | 
						if (rt->fib6_nh.nh_flags & RTNH_F_DEAD)
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (fib6_ignore_linkdown(rt) &&
 | 
						if (ip6_ignore_linkdown(rt->fib6_nh.nh_dev) &&
 | 
				
			||||||
	    rt->fib6_nh.nh_flags & RTNH_F_LINKDOWN &&
 | 
						    rt->fib6_nh.nh_flags & RTNH_F_LINKDOWN &&
 | 
				
			||||||
	    !(strict & RT6_LOOKUP_F_IGNORE_LINKSTATE))
 | 
						    !(strict & RT6_LOOKUP_F_IGNORE_LINKSTATE))
 | 
				
			||||||
		goto out;
 | 
							goto out;
 | 
				
			||||||
| 
						 | 
					@ -3875,7 +3860,7 @@ static bool rt6_is_dead(const struct fib6_info *rt)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (rt->fib6_nh.nh_flags & RTNH_F_DEAD ||
 | 
						if (rt->fib6_nh.nh_flags & RTNH_F_DEAD ||
 | 
				
			||||||
	    (rt->fib6_nh.nh_flags & RTNH_F_LINKDOWN &&
 | 
						    (rt->fib6_nh.nh_flags & RTNH_F_LINKDOWN &&
 | 
				
			||||||
	     fib6_ignore_linkdown(rt)))
 | 
						     ip6_ignore_linkdown(rt->fib6_nh.nh_dev)))
 | 
				
			||||||
		return true;
 | 
							return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return false;
 | 
						return false;
 | 
				
			||||||
| 
						 | 
					@ -4608,7 +4593,7 @@ static int rt6_nexthop_info(struct sk_buff *skb, struct fib6_info *rt,
 | 
				
			||||||
		*flags |= RTNH_F_LINKDOWN;
 | 
							*flags |= RTNH_F_LINKDOWN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		rcu_read_lock();
 | 
							rcu_read_lock();
 | 
				
			||||||
		if (fib6_ignore_linkdown(rt))
 | 
							if (ip6_ignore_linkdown(rt->fib6_nh.nh_dev))
 | 
				
			||||||
			*flags |= RTNH_F_DEAD;
 | 
								*flags |= RTNH_F_DEAD;
 | 
				
			||||||
		rcu_read_unlock();
 | 
							rcu_read_unlock();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue