|
@@ -1732,23 +1732,18 @@ do_time_wait:
|
|
|
goto discard_it;
|
|
|
}
|
|
|
|
|
|
-static struct inet_peer *tcp_v6_get_peer(struct sock *sk, bool *release_it)
|
|
|
+static struct inet_peer *tcp_v6_get_peer(struct sock *sk)
|
|
|
{
|
|
|
struct rt6_info *rt = (struct rt6_info *) __sk_dst_get(sk);
|
|
|
struct ipv6_pinfo *np = inet6_sk(sk);
|
|
|
- struct net *net = sock_net(sk);
|
|
|
- struct inet_peer *peer;
|
|
|
-
|
|
|
- if (!rt ||
|
|
|
- !ipv6_addr_equal(&np->daddr, &rt->rt6i_dst.addr)) {
|
|
|
- peer = inet_getpeer_v6(net, &np->daddr, 1);
|
|
|
- *release_it = true;
|
|
|
- } else {
|
|
|
- peer = rt6_get_peer_create(rt);
|
|
|
- *release_it = false;
|
|
|
- }
|
|
|
|
|
|
- return peer;
|
|
|
+ /* If we don't have a valid cached route, or we're doing IP
|
|
|
+ * options which make the IPv6 header destination address
|
|
|
+ * different from our peer's, do not bother with this.
|
|
|
+ */
|
|
|
+ if (!rt || !ipv6_addr_equal(&np->daddr, &rt->rt6i_dst.addr))
|
|
|
+ return NULL;
|
|
|
+ return rt6_get_peer_create(rt);
|
|
|
}
|
|
|
|
|
|
static void *tcp_v6_tw_get_peer(struct sock *sk)
|