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/ipv4/tcp_ipv4.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/ipv4/tcp_ipv4.c')
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 12 | 
1 files changed, 7 insertions, 5 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 0eaf685bddc..77f5050efc8 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -726,7 +726,7 @@ release_sk1:   */  static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack, -			    u32 win, u32 ts, int oif, +			    u32 win, u32 tsval, u32 tsecr, int oif,  			    struct tcp_md5sig_key *key,  			    int reply_flags, u8 tos)  { @@ -747,12 +747,12 @@ static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack,  	arg.iov[0].iov_base = (unsigned char *)&rep;  	arg.iov[0].iov_len  = sizeof(rep.th); -	if (ts) { +	if (tsecr) {  		rep.opt[0] = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |  				   (TCPOPT_TIMESTAMP << 8) |  				   TCPOLEN_TIMESTAMP); -		rep.opt[1] = htonl(tcp_time_stamp); -		rep.opt[2] = htonl(ts); +		rep.opt[1] = htonl(tsval); +		rep.opt[2] = htonl(tsecr);  		arg.iov[0].iov_len += TCPOLEN_TSTAMP_ALIGNED;  	} @@ -767,7 +767,7 @@ static void tcp_v4_send_ack(struct sk_buff *skb, u32 seq, u32 ack,  #ifdef CONFIG_TCP_MD5SIG  	if (key) { -		int offset = (ts) ? 3 : 0; +		int offset = (tsecr) ? 3 : 0;  		rep.opt[offset++] = htonl((TCPOPT_NOP << 24) |  					  (TCPOPT_NOP << 16) | @@ -802,6 +802,7 @@ static void tcp_v4_timewait_ack(struct sock *sk, struct sk_buff *skb)  	tcp_v4_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,  			tw->tw_bound_dev_if,  			tcp_twsk_md5_key(tcptw), @@ -821,6 +822,7 @@ static void tcp_v4_reqsk_send_ack(struct sock *sk, struct sk_buff *skb,  	tcp_v4_send_ack(skb, (sk->sk_state == TCP_LISTEN) ?  			tcp_rsk(req)->snt_isn + 1 : tcp_sk(sk)->snd_nxt,  			tcp_rsk(req)->rcv_nxt, req->rcv_wnd, +			tcp_time_stamp,  			req->ts_recent,  			0,  			tcp_md5_do_lookup(sk, (union tcp_md5_addr *)&ip_hdr(skb)->daddr,  |