From 6812dc1db81268d5ee17696538f1fbb4c4fcc061 Mon Sep 17 00:00:00 2001
From: zab2 <zab2@mail.i2p>
Date: Sat, 31 Aug 2013 18:39:29 +0000
Subject: [PATCH] Ticket #1007 use only non-retransmitted packets in RTT 
 sampling.  (RFC 6298)

---
 .../streaming/ConnectionPacketHandler.java     | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionPacketHandler.java b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionPacketHandler.java
index 2bc867c475..333a4086b9 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionPacketHandler.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionPacketHandler.java
@@ -290,17 +290,21 @@ class ConnectionPacketHandler {
                 _log.debug(acked.size() + " of our packets acked with " + packet);
             // use the highest RTT, since these would likely be bunched together,
             // and the highest rtt lets us set our resend delay properly
+            // RFC 6298 part 3 dictates only use packets that haven't been re-sent.
             int highestRTT = -1;
             for (int i = 0; i < acked.size(); i++) {
                 PacketLocal p = acked.get(i);
-                if (p.getAckTime() > highestRTT) {
-                    //if (p.getNumSends() <= 1)
-                    highestRTT = p.getAckTime();
-                }
-                _context.statManager().addRateData("stream.sendsBeforeAck", p.getNumSends(), p.getAckTime());
                 
-                if (p.getNumSends() > 1)
+                final int numSends = p.getNumSends();
+                final int ackTime = p.getAckTime();
+                
+                if (numSends > 1)
                     numResends++;
+                else if (ackTime > highestRTT) 
+                    highestRTT = ackTime;
+                
+                _context.statManager().addRateData("stream.sendsBeforeAck", numSends, ackTime);
+                
                 
                 // ACK the tags we delivered so we can use them
                 //if ( (p.getKeyUsed() != null) && (p.getTagsSent() != null) 
@@ -310,7 +314,7 @@ class ConnectionPacketHandler {
                 //                                               p.getTagsSent());
                 //}
                 if (_log.shouldLog(Log.DEBUG))
-                    _log.debug("Packet acked after " + p.getAckTime() + "ms: " + p);
+                    _log.debug("Packet acked after " + ackTime + "ms: " + p);
             }
             if (highestRTT > 0) {
                 int oldrtt = con.getOptions().getRTT();
-- 
GitLab