diff options
| author | Andrey Vagin <avagin@openvz.org> | 2013-02-11 05:50:19 +0000 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2013-02-13 13:22:16 -0500 | 
| commit | ee684b6f2830047d19877e5547989740f18b1a5d (patch) | |
| tree | 0fc416746eeca68bbba228958636dd919fc3785f /net/ipv6/tcp_ipv6.c | |
| parent | 93be6ce0e91b6a94783e012b1857a347a5e6e9f2 (diff) | |
| download | olio-linux-3.10-ee684b6f2830047d19877e5547989740f18b1a5d.tar.xz olio-linux-3.10-ee684b6f2830047d19877e5547989740f18b1a5d.zip  | |
tcp: send packets with a socket timestamp
A socket timestamp is a sum of the global tcp_time_stamp and
a per-socket offset.
A socket offset is added in places where externally visible
tcp timestamp option is parsed/initialized.
Connections in the SYN_RECV state are not supported, global
tcp_time_stamp is used for them, because repair mode doesn't support
this state. In a future it can be implemented by the similar way
as for TIME_WAIT sockets.
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
Cc: James Morris <jmorris@namei.org>
Cc: Hideaki YOSHIFUJI <yoshfuji@linux-ipv6.org>
Cc: Patrick McHardy <kaber@trash.net>
Cc: Eric Dumazet <edumazet@google.com>
Cc: Pavel Emelyanov <xemul@parallels.com>
Signed-off-by: Andrey Vagin <avagin@openvz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
| -rw-r--r-- | net/ipv6/tcp_ipv6.c | 22 | 
1 files changed, 13 insertions, 9 deletions
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index bbb28ae7e5f..9b6460055df 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -713,7 +713,8 @@ static const struct tcp_request_sock_ops tcp_request_sock_ipv6_ops = {  #endif  static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win, -				 u32 ts, struct tcp_md5sig_key *key, int rst, u8 tclass) +				 u32 tsval, u32 tsecr, +				 struct tcp_md5sig_key *key, int rst, u8 tclass)  {  	const struct tcphdr *th = tcp_hdr(skb);  	struct tcphdr *t1; @@ -725,7 +726,7 @@ static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win,  	struct dst_entry *dst;  	__be32 *topt; -	if (ts) +	if (tsecr)  		tot_len += TCPOLEN_TSTAMP_ALIGNED;  #ifdef CONFIG_TCP_MD5SIG  	if (key) @@ -755,11 +756,11 @@ static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win,  	topt = (__be32 *)(t1 + 1); -	if (ts) { +	if (tsecr) {  		*topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |  				(TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP); -		*topt++ = htonl(tcp_time_stamp); -		*topt++ = htonl(ts); +		*topt++ = htonl(tsval); +		*topt++ = htonl(tsecr);  	}  #ifdef CONFIG_TCP_MD5SIG @@ -860,7 +861,7 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb)  		ack_seq = ntohl(th->seq) + th->syn + th->fin + skb->len -  			  (th->doff << 2); -	tcp_v6_send_response(skb, seq, ack_seq, 0, 0, key, 1, 0); +	tcp_v6_send_response(skb, seq, ack_seq, 0, 0, 0, key, 1, 0);  #ifdef CONFIG_TCP_MD5SIG  release_sk1: @@ -871,10 +872,11 @@ release_sk1:  #endif  } -static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32 ts, +static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, +			    u32 win, u32 tsval, u32 tsecr,  			    struct tcp_md5sig_key *key, u8 tclass)  { -	tcp_v6_send_response(skb, seq, ack, win, ts, key, 0, tclass); +	tcp_v6_send_response(skb, seq, ack, win, tsval, tsecr, key, 0, tclass);  }  static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb) @@ -884,6 +886,7 @@ static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)  	tcp_v6_send_ack(skb, tcptw->tw_snd_nxt, tcptw->tw_rcv_nxt,  			tcptw->tw_rcv_wnd >> tw->tw_rcv_wscale, +			tcp_time_stamp + tcptw->tw_ts_offset,  			tcptw->tw_ts_recent, tcp_twsk_md5_key(tcptw),  			tw->tw_tclass); @@ -893,7 +896,8 @@ static void tcp_v6_timewait_ack(struct sock *sk, struct sk_buff *skb)  static void tcp_v6_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,  				  struct request_sock *req)  { -	tcp_v6_send_ack(skb, tcp_rsk(req)->snt_isn + 1, tcp_rsk(req)->rcv_isn + 1, req->rcv_wnd, req->ts_recent, +	tcp_v6_send_ack(skb, tcp_rsk(req)->snt_isn + 1, tcp_rsk(req)->rcv_isn + 1, +			req->rcv_wnd, tcp_time_stamp, req->ts_recent,  			tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr), 0);  }  |