tcp: use SACK RTTs for CC
authorKenneth Klette Jonassen <kennetkl@ifi.uio.no>
Thu, 29 Jan 2015 19:08:03 +0000 (20:08 +0100)
committerDavid S. Miller <davem@davemloft.net>
Sun, 1 Feb 2015 01:25:37 +0000 (17:25 -0800)
Current behavior only passes RTTs from sequentially acked data to CC.

If sender gets a combined ACK for segment 1 and SACK for segment 3, then the
computed RTT for CC is the time between sending segment 1 and receiving SACK
for segment 3.

Pass the minimum computed RTT from any acked data to CC, i.e. time between
sending segment 3 and receiving SACK for segment 3.

Signed-off-by: Kenneth Klette Jonassen <kennetkl@ifi.uio.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/tcp_input.c

index 71fb37c70581efea67f564af699870fbf3844a18..ed11931f340f21e7ac4650eebe3d3066f4386bd6 100644 (file)
@@ -3183,8 +3183,10 @@ static int tcp_clean_rtx_queue(struct sock *sk, int prior_fackets,
 
                tp->fackets_out -= min(pkts_acked, tp->fackets_out);
 
-               if (ca_ops->pkts_acked)
-                       ca_ops->pkts_acked(sk, pkts_acked, ca_seq_rtt_us);
+               if (ca_ops->pkts_acked) {
+                       long rtt_us = min_t(ulong, ca_seq_rtt_us, sack_rtt_us);
+                       ca_ops->pkts_acked(sk, pkts_acked, rtt_us);
+               }
 
        } else if (skb && rtt_update && sack_rtt_us >= 0 &&
                   sack_rtt_us > skb_mstamp_us_delta(&now, &skb->skb_mstamp)) {