diff options
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
| -rw-r--r-- | net/ipv6/tcp_ipv6.c | 13 | 
1 files changed, 7 insertions, 6 deletions
| diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 36131d122a6f..2dea4bb7b54a 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -1255,6 +1255,13 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)  	if (!want_cookie || tmp_opt.tstamp_ok)  		TCP_ECN_create_request(req, tcp_hdr(skb)); +	treq->iif = sk->sk_bound_dev_if; + +	/* So that link locals have meaning */ +	if (!sk->sk_bound_dev_if && +	    ipv6_addr_type(&treq->rmt_addr) & IPV6_ADDR_LINKLOCAL) +		treq->iif = inet6_iif(skb); +  	if (!isn) {  		struct inet_peer *peer = NULL; @@ -1264,12 +1271,6 @@ static int tcp_v6_conn_request(struct sock *sk, struct sk_buff *skb)  			atomic_inc(&skb->users);  			treq->pktopts = skb;  		} -		treq->iif = sk->sk_bound_dev_if; - -		/* So that link locals have meaning */ -		if (!sk->sk_bound_dev_if && -		    ipv6_addr_type(&treq->rmt_addr) & IPV6_ADDR_LINKLOCAL) -			treq->iif = inet6_iif(skb);  		if (want_cookie) {  			isn = cookie_v6_init_sequence(sk, skb, &req->mss); | 
