diff options
| -rw-r--r-- | include/net/inet_timewait_sock.h | 1 | ||||
| -rw-r--r-- | net/ipv4/tcp_minisocks.c | 1 | ||||
| -rw-r--r-- | net/ipv6/tcp_ipv6.c | 13 | 
3 files changed, 12 insertions, 3 deletions
diff --git a/include/net/inet_timewait_sock.h b/include/net/inet_timewait_sock.h index c2f756aedc54..aef38c140014 100644 --- a/include/net/inet_timewait_sock.h +++ b/include/net/inet_timewait_sock.h @@ -70,6 +70,7 @@ struct inet_timewait_sock {  				tw_flowlabel	: 20,  				tw_pad		: 2,	/* 2 bits hole */  				tw_tos		: 8; +	u32			tw_txhash;  	struct timer_list	tw_timer;  	struct inet_bind_bucket	*tw_tb;  }; diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index 7c35731816e2..11011e8386dc 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c @@ -283,6 +283,7 @@ void tcp_time_wait(struct sock *sk, int state, int timeo)  			tw->tw_v6_rcv_saddr = sk->sk_v6_rcv_saddr;  			tw->tw_tclass = np->tclass;  			tw->tw_flowlabel = be32_to_cpu(np->flow_label & IPV6_FLOWLABEL_MASK); +			tw->tw_txhash = sk->sk_txhash;  			tw->tw_ipv6only = sk->sk_ipv6only;  		}  #endif diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index c1da52c7f990..ad7039137a20 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -883,9 +883,16 @@ static void tcp_v6_send_response(const struct sock *sk, struct sk_buff *skb, u32  		fl6.flowi6_oif = oif;  	} -	if (sk) -		mark = (sk->sk_state == TCP_TIME_WAIT) ? -			inet_twsk(sk)->tw_mark : sk->sk_mark; +	if (sk) { +		if (sk->sk_state == TCP_TIME_WAIT) { +			mark = inet_twsk(sk)->tw_mark; +			/* autoflowlabel relies on buff->hash */ +			skb_set_hash(buff, inet_twsk(sk)->tw_txhash, +				     PKT_HASH_TYPE_L4); +		} else { +			mark = sk->sk_mark; +		} +	}  	fl6.flowi6_mark = IP6_REPLY_MARK(net, skb->mark) ?: mark;  	fl6.fl6_dport = t1->dest;  	fl6.fl6_sport = t1->source;  | 
