diff options
| author | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2012-03-21 11:26:18 +0400 |
|---|---|---|
| committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2012-03-21 11:26:18 +0400 |
| commit | 3d04d42312eacc68fbcddea337f7eb34bc035dfb (patch) | |
| tree | 7211df5704b743a7667159748c670a9744164482 /net/ipv6/route.c | |
| parent | c98291ee1ceac03912e24b3219fa6e7dc0d52f5e (diff) | |
| parent | 69a7aebcf019ab3ff5764525ad6858fbe23bb86d (diff) | |
| download | linux-3d04d42312eacc68fbcddea337f7eb34bc035dfb.tar.xz | |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'net/ipv6/route.c')
| -rw-r--r-- | net/ipv6/route.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 22b766407de1..24c456e8aa1d 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -121,9 +121,22 @@ static u32 *ipv6_cow_metrics(struct dst_entry *dst, unsigned long old) return p; } +static inline const void *choose_neigh_daddr(struct rt6_info *rt, const void *daddr) +{ + struct in6_addr *p = &rt->rt6i_gateway; + + if (!ipv6_addr_any(p)) + return (const void *) p; + return daddr; +} + static struct neighbour *ip6_neigh_lookup(const struct dst_entry *dst, const void *daddr) { - struct neighbour *n = __ipv6_neigh_lookup(&nd_tbl, dst->dev, daddr); + struct rt6_info *rt = (struct rt6_info *) dst; + struct neighbour *n; + + daddr = choose_neigh_daddr(rt, daddr); + n = __ipv6_neigh_lookup(&nd_tbl, dst->dev, daddr); if (n) return n; return neigh_create(&nd_tbl, daddr, dst->dev); |
