ipv6: use jhash2() in rt6_exception_hash()
[linux-2.6-block.git] / net / ipv6 / route.c
index 546088e50815158a81ebe953a3a1ec820243c367..c7a2022e64eb9de9e4300f0311dbff66281ec0a8 100644 (file)
@@ -227,7 +227,7 @@ static void ip6_confirm_neigh(const struct dst_entry *dst, const void *daddr)
        struct net_device *dev = dst->dev;
        struct rt6_info *rt = (struct rt6_info *)dst;
 
-       daddr = choose_neigh_daddr(&rt->rt6i_gateway, NULL, daddr);
+       daddr = choose_neigh_daddr(rt6_nexthop(rt, &in6addr_any), NULL, daddr);
        if (!daddr)
                return;
        if (dev->flags & (IFF_NOARP | IFF_LOOPBACK))
@@ -1475,11 +1475,11 @@ static u32 rt6_exception_hash(const struct in6_addr *dst,
        u32 val;
 
        net_get_random_once(&seed, sizeof(seed));
-       val = jhash(dst, sizeof(*dst), seed);
+       val = jhash2((const u32 *)dst, sizeof(*dst)/sizeof(u32), seed);
 
 #ifdef CONFIG_IPV6_SUBTREES
        if (src)
-               val = jhash(src, sizeof(*src), val);
+               val = jhash2((const u32 *)src, sizeof(*src)/sizeof(u32), val);
 #endif
        return hash_32(val, FIB6_EXCEPTION_BUCKET_SIZE_SHIFT);
 }
@@ -2725,10 +2725,9 @@ static void __ip6_rt_update_pmtu(struct dst_entry *dst, const struct sock *sk,
 
                rcu_read_lock();
                res.f6i = rcu_dereference(rt6->from);
-               if (!res.f6i) {
-                       rcu_read_unlock();
-                       return;
-               }
+               if (!res.f6i)
+                       goto out_unlock;
+
                res.fib6_flags = res.f6i->fib6_flags;
                res.fib6_type = res.f6i->fib6_type;
 
@@ -2744,10 +2743,8 @@ static void __ip6_rt_update_pmtu(struct dst_entry *dst, const struct sock *sk,
                        /* fib6_info uses a nexthop that does not have fib6_nh
                         * using the dst->dev + gw. Should be impossible.
                         */
-                       if (!arg.match) {
-                               rcu_read_unlock();
-                               return;
-                       }
+                       if (!arg.match)
+                               goto out_unlock;
 
                        res.nh = arg.match;
                } else {
@@ -2760,6 +2757,7 @@ static void __ip6_rt_update_pmtu(struct dst_entry *dst, const struct sock *sk,
                        if (rt6_insert_exception(nrt6, &res))
                                dst_release_immediate(&nrt6->dst);
                }
+out_unlock:
                rcu_read_unlock();
        }
 }