mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-04 10:12:16 +09:00
tcp: don't apply tsoffset if rcv_tsecr is zero
[ Upstream commit e3e1202831 ]
The zero value means that tsecr is not valid, so it's a special case.
tsoffset is used to customize tcp_time_stamp for one socket.
tsoffset is usually zero, it's used when a socket was moved from one
host to another host.
Currently this issue affects logic of tcp_rcv_rtt_measure_ts. Due to
incorrect value of rcv_tsecr, tcp_rcv_rtt_measure_ts sets rto to
TCP_RTO_MAX.
Reported-by: Cyrill Gorcunov <gorcunov@openvz.org>
Cc: Pavel Emelyanov <xemul@parallels.com>
Cc: Eric Dumazet <eric.dumazet@gmail.com>
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>
Signed-off-by: Andrey Vagin <avagin@openvz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
6f198dcab7
commit
6fe6efd941
@@ -3598,7 +3598,10 @@ static bool tcp_parse_aligned_timestamp(struct tcp_sock *tp, const struct tcphdr
|
||||
++ptr;
|
||||
tp->rx_opt.rcv_tsval = ntohl(*ptr);
|
||||
++ptr;
|
||||
tp->rx_opt.rcv_tsecr = ntohl(*ptr) - tp->tsoffset;
|
||||
if (*ptr)
|
||||
tp->rx_opt.rcv_tsecr = ntohl(*ptr) - tp->tsoffset;
|
||||
else
|
||||
tp->rx_opt.rcv_tsecr = 0;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -3623,7 +3626,7 @@ static bool tcp_fast_parse_options(const struct sk_buff *skb,
|
||||
}
|
||||
|
||||
tcp_parse_options(skb, &tp->rx_opt, 1, NULL);
|
||||
if (tp->rx_opt.saw_tstamp)
|
||||
if (tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr)
|
||||
tp->rx_opt.rcv_tsecr -= tp->tsoffset;
|
||||
|
||||
return true;
|
||||
@@ -5376,7 +5379,7 @@ static int tcp_rcv_synsent_state_process(struct sock *sk, struct sk_buff *skb,
|
||||
int saved_clamp = tp->rx_opt.mss_clamp;
|
||||
|
||||
tcp_parse_options(skb, &tp->rx_opt, 0, &foc);
|
||||
if (tp->rx_opt.saw_tstamp)
|
||||
if (tp->rx_opt.saw_tstamp && tp->rx_opt.rcv_tsecr)
|
||||
tp->rx_opt.rcv_tsecr -= tp->tsoffset;
|
||||
|
||||
if (th->ack) {
|
||||
|
||||
Reference in New Issue
Block a user