aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_input.c
diff options
context:
space:
mode:
authorIlpo Järvinen <ilpo.jarvinen@helsinki.fi>2007-06-15 18:08:43 -0400
committerDavid S. Miller <davem@davemloft.net>2007-06-15 18:08:43 -0400
commitb9ce204f0a265f819d10c943a607746abb62f245 (patch)
tree45078d076bcd952d8820c590653939b312d06ac2 /net/ipv4/tcp_input.c
parent22b1a9203ea634ac0ee5240e021613da3328275f (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.c6
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 }