diff options
author | Ilpo Järvinen <ilpo.jarvinen@helsinki.fi> | 2007-06-15 18:08:43 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2007-06-15 18:08:43 -0400 |
commit | b9ce204f0a265f819d10c943a607746abb62f245 (patch) | |
tree | 45078d076bcd952d8820c590653939b312d06ac2 /net/ipv4/tcp_input.c | |
parent | 22b1a9203ea634ac0ee5240e021613da3328275f (diff) |
[TCP]: Congestion control API RTT sampling fix
Commit 164891aadf1721fca4dce473bb0e0998181537c6 broke RTT
sampling of congestion control modules. Inaccurate timestamps
could be fed to them without providing any way for them to
identify such cases. Previously RTT sampler was called only if
FLAG_RETRANS_DATA_ACKED was not set filtering inaccurate
timestamps nicely. In addition, the new behavior could give an
invalid timestamp (zero) to RTT sampler if only skbs with
TCPCB_RETRANS were ACKed. This solves both problems.
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp_input.c')
-rw-r--r-- | net/ipv4/tcp_input.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index d6d0f9b6cdc6..aaf6f66677f9 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -2409,7 +2409,7 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p) | |||
2409 | int acked = 0; | 2409 | int acked = 0; |
2410 | int prior_packets = tp->packets_out; | 2410 | int prior_packets = tp->packets_out; |
2411 | __s32 seq_rtt = -1; | 2411 | __s32 seq_rtt = -1; |
2412 | ktime_t last_ackt = ktime_set(0,0); | 2412 | ktime_t last_ackt = net_invalid_timestamp(); |
2413 | 2413 | ||
2414 | while ((skb = tcp_write_queue_head(sk)) && | 2414 | while ((skb = tcp_write_queue_head(sk)) && |
2415 | skb != tcp_send_head(sk)) { | 2415 | skb != tcp_send_head(sk)) { |
@@ -2487,6 +2487,10 @@ static int tcp_clean_rtx_queue(struct sock *sk, __s32 *seq_rtt_p) | |||
2487 | tcp_ack_update_rtt(sk, acked, seq_rtt); | 2487 | tcp_ack_update_rtt(sk, acked, seq_rtt); |
2488 | tcp_ack_packets_out(sk); | 2488 | tcp_ack_packets_out(sk); |
2489 | 2489 | ||
2490 | /* Is the ACK triggering packet unambiguous? */ | ||
2491 | if (acked & FLAG_RETRANS_DATA_ACKED) | ||
2492 | last_ackt = net_invalid_timestamp(); | ||
2493 | |||
2490 | if (ca_ops->pkts_acked) | 2494 | if (ca_ops->pkts_acked) |
2491 | ca_ops->pkts_acked(sk, pkts_acked, last_ackt); | 2495 | ca_ops->pkts_acked(sk, pkts_acked, last_ackt); |
2492 | } | 2496 | } |