diff options
Diffstat (limited to 'include/net/ip6_route.h')
| -rw-r--r-- | include/net/ip6_route.h | 23 | 
1 files changed, 20 insertions, 3 deletions
| diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index 54c779416eec..d97305d0e71f 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h @@ -18,6 +18,7 @@ struct route_info {  	__u8			prefix[0];	/* 0,8 or 16 */  }; +#include <net/addrconf.h>  #include <net/flow.h>  #include <net/ip6_fib.h>  #include <net/sock.h> @@ -76,6 +77,8 @@ static inline struct dst_entry *ip6_route_output(struct net *net,  struct dst_entry *ip6_route_lookup(struct net *net, struct flowi6 *fl6,  				   int flags); +struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table, +			       int ifindex, struct flowi6 *fl6, int flags);  int ip6_route_init(void);  void ip6_route_cleanup(void); @@ -86,9 +89,23 @@ int ip6_route_add(struct fib6_config *cfg);  int ip6_ins_rt(struct rt6_info *);  int ip6_del_rt(struct rt6_info *); -int ip6_route_get_saddr(struct net *net, struct rt6_info *rt, -			const struct in6_addr *daddr, unsigned int prefs, -			struct in6_addr *saddr); +static inline int ip6_route_get_saddr(struct net *net, struct rt6_info *rt, +				      const struct in6_addr *daddr, +				      unsigned int prefs, +				      struct in6_addr *saddr) +{ +	struct inet6_dev *idev = +			rt ? ip6_dst_idev((struct dst_entry *)rt) : NULL; +	int err = 0; + +	if (rt && rt->rt6i_prefsrc.plen) +		*saddr = rt->rt6i_prefsrc.addr; +	else +		err = ipv6_dev_get_saddr(net, idev ? idev->dev : NULL, +					 daddr, prefs, saddr); + +	return err; +}  struct rt6_info *rt6_lookup(struct net *net, const struct in6_addr *daddr,  			    const struct in6_addr *saddr, int oif, int flags); |