diff options
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
| -rw-r--r-- | net/ipv6/tcp_ipv6.c | 25 | 
1 files changed, 13 insertions, 12 deletions
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index bb9ce2b2f37..a3e60cc04a8 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -94,6 +94,18 @@ static struct tcp_md5sig_key *tcp_v6_md5_do_lookup(struct sock *sk,  }  #endif +static void inet6_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb) +{ +	struct dst_entry *dst = skb_dst(skb); +	const struct rt6_info *rt = (const struct rt6_info *)dst; + +	dst_hold(dst); +	sk->sk_rx_dst = dst; +	inet_sk(sk)->rx_dst_ifindex = skb->skb_iif; +	if (rt->rt6i_node) +		inet6_sk(sk)->rx_dst_cookie = rt->rt6i_node->fn_sernum; +} +  static void tcp_v6_hash(struct sock *sk)  {  	if (sk->sk_state != TCP_CLOSE) { @@ -1270,6 +1282,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,  	newsk->sk_gso_type = SKB_GSO_TCPV6;  	__ip6_dst_store(newsk, dst, NULL, NULL); +	inet6_sk_rx_dst_set(newsk, skb);  	newtcp6sk = (struct tcp6_sock *)newsk;  	inet_sk(newsk)->pinet6 = &newtcp6sk->inet6; @@ -1729,18 +1742,6 @@ static struct timewait_sock_ops tcp6_timewait_sock_ops = {  	.twsk_destructor= tcp_twsk_destructor,  }; -static void inet6_sk_rx_dst_set(struct sock *sk, const struct sk_buff *skb) -{ -	struct dst_entry *dst = skb_dst(skb); -	const struct rt6_info *rt = (const struct rt6_info *)dst; - -	dst_hold(dst); -	sk->sk_rx_dst = dst; -	inet_sk(sk)->rx_dst_ifindex = skb->skb_iif; -	if (rt->rt6i_node) -		inet6_sk(sk)->rx_dst_cookie = rt->rt6i_node->fn_sernum; -} -  static const struct inet_connection_sock_af_ops ipv6_specific = {  	.queue_xmit	   = inet6_csk_xmit,  	.send_check	   = tcp_v6_send_check,  |