From b9aceb895d38fdf1ef6c6ef8268ee096f7122fe9 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Wed, 12 Sep 2012 21:55:15 +0000
Subject: [PATCH]   * SSU:     - Increase initial and max RTO     - Don't count
 ack-only packets in bandwidth allocation     - Unused method cleanup

---
 .../i2p/router/transport/udp/ACKSender.java   |  4 +-
 .../i2p/router/transport/udp/PeerState.java   | 72 +++++++++++--------
 2 files changed, 46 insertions(+), 30 deletions(-)

diff --git a/router/java/src/net/i2p/router/transport/udp/ACKSender.java b/router/java/src/net/i2p/router/transport/udp/ACKSender.java
index 003eacbc82..8cb4f2f47d 100644
--- a/router/java/src/net/i2p/router/transport/udp/ACKSender.java
+++ b/router/java/src/net/i2p/router/transport/udp/ACKSender.java
@@ -178,7 +178,9 @@ class ACKSender implements Runnable {
                     
                     if (_log.shouldLog(Log.INFO))
                         _log.info("Sending ACK for " + ackBitfields);
-                    peer.allocateSendingBytes(ack.getPacket().getLength(), true);
+                    // locking issues, we ignore the result, and acks are small,
+                    // so don't even bother allocating
+                    //peer.allocateSendingBytes(ack.getPacket().getLength(), true);
                     // ignore whether its ok or not, its a bloody ack.  this should be fixed, probably.
                     _transport.send(ack);
                     
diff --git a/router/java/src/net/i2p/router/transport/udp/PeerState.java b/router/java/src/net/i2p/router/transport/udp/PeerState.java
index 46557950b9..694a2740a4 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerState.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerState.java
@@ -55,13 +55,15 @@ class PeerState {
      * of rekeying.
      */
     private SessionKey _nextCipherKey;
+
     /**
      * The keying material used for the rekeying, or null if we are not in
      * the process of rekeying.
      */
-    private byte[] _nextKeyingMaterial;
+    //private byte[] _nextKeyingMaterial;
     /** true if we began the current rekeying, false otherwise */
-    private boolean _rekeyBeganLocally;
+    //private boolean _rekeyBeganLocally;
+
     /** when were the current cipher and MAC keys established/rekeyed? */
     private long _keyEstablishedTime;
 
@@ -81,6 +83,7 @@ class PeerState {
     private long _lastReceiveTime;
     /** how many consecutive messages have we sent and not received an ACK to */
     private int _consecutiveFailedSends;
+
     /** when did we last have a failed send (beginning of period) */
     // private long _lastFailedSendPeriod;
 
@@ -109,7 +112,7 @@ class PeerState {
      * have all of the packets received in the current second requested that
      * the previous second's ACKs be sent?
      */
-    private boolean _remoteWantsPreviousACKs;
+    //private boolean _remoteWantsPreviousACKs;
     /** how many bytes should we send to the peer in a second */
     private volatile int _sendWindowBytes;
     /** how many bytes can we send to the peer in the current second */
@@ -141,7 +144,8 @@ class PeerState {
     private final RemoteHostId _remoteHostId;
 
     /** if we need to contact them, do we need to talk to an introducer? */
-    private boolean _remoteRequiresIntroduction;
+    //private boolean _remoteRequiresIntroduction;
+
     /** 
      * if we are serving as an introducer to them, this is the the tag that
      * they can publish that, when presented to us, will cause us to send
@@ -179,10 +183,12 @@ class PeerState {
     private long _packetsTransmitted;
     /** how many packets were retransmitted within the last RETRANSMISSION_PERIOD_WIDTH packets */
     private long _packetsRetransmitted;
+
     /** how many packets were transmitted within the last RETRANSMISSION_PERIOD_WIDTH packets */
-    private long _packetsPeriodTransmitted;
-    private int _packetsPeriodRetransmitted;
-    private int _packetRetransmissionRate;
+    //private long _packetsPeriodTransmitted;
+    //private int _packetsPeriodRetransmitted;
+    //private int _packetRetransmissionRate;
+
     /** how many dup packets were received within the last RETRANSMISSION_PERIOD_WIDTH packets */
     private long _packetsReceivedDuplicate;
     private long _packetsReceived;
@@ -279,7 +285,8 @@ class PeerState {
     public static final int LARGE_MTU = 1484;
     
     private static final int MIN_RTO = 100 + ACKSender.ACK_FREQUENCY;
-    private static final int MAX_RTO = 3000; // 5000;
+    private static final int INIT_RTO = 4*1000;
+    private static final int MAX_RTO = 15*1000;
     
     public PeerState(RouterContext ctx, UDPTransport transport,
                      byte[] remoteIP, int remotePort, Hash remotePeer, boolean isInbound) {
@@ -301,12 +308,12 @@ class PeerState {
         _lastCongestionOccurred = -1;
         _remotePort = remotePort;
         _mtu = DEFAULT_MTU;
-        _mtuReceive = _mtu;
+        _mtuReceive = DEFAULT_MTU;
         _largeMTU = transport.getMTU();
         //_mtuLastChecked = -1;
         _lastACKSend = -1;
-        _rto = MIN_RTO;
-        _rtt = _rto/2;
+        _rto = INIT_RTO;
+        _rtt = INIT_RTO / 2;
         _rttDeviation = _rtt;
         _inboundMessages = new HashMap(8);
         _outboundMessages = new ArrayList(32);
@@ -351,12 +358,13 @@ class PeerState {
     /**
      * The keying material used for the rekeying, or null if we are not in
      * the process of rekeying.
-     * @deprecated unused
+     * deprecated unused
      */
-    public byte[] getNextKeyingMaterial() { return _nextKeyingMaterial; }
+    //public byte[] getNextKeyingMaterial() { return _nextKeyingMaterial; }
 
     /** true if we began the current rekeying, false otherwise */
-    public boolean getRekeyBeganLocally() { return _rekeyBeganLocally; }
+    //public boolean getRekeyBeganLocally() { return _rekeyBeganLocally; }
+
     /** when were the current cipher and MAC keys established/rekeyed? */
     public long getKeyEstablishedTime() { return _keyEstablishedTime; }
 
@@ -382,7 +390,7 @@ class PeerState {
      * have all of the packets received in the current second requested that
      * the previous second's ACKs be sent?
      */
-    public boolean getRemoteWantsPreviousACKs() { return _remoteWantsPreviousACKs; }
+    //public boolean getRemoteWantsPreviousACKs() { return _remoteWantsPreviousACKs; }
     /** how many bytes should we send to the peer in a second */
     public int getSendWindowBytes() { return _sendWindowBytes; }
     /** how many bytes can we send to the peer in the current second */
@@ -409,7 +417,7 @@ class PeerState {
     public int getRemotePort() { return _remotePort; }
 
     /** if we need to contact them, do we need to talk to an introducer? */
-    public boolean getRemoteRequiresIntroduction() { return _remoteRequiresIntroduction; }
+    //public boolean getRemoteRequiresIntroduction() { return _remoteRequiresIntroduction; }
 
     /** 
      * if we are serving as an introducer to them, this is the the tag that
@@ -475,13 +483,13 @@ class PeerState {
      * the process of rekeying.
      * @deprecated unused
      */
-    public void setNextKeyingMaterial(byte data[]) { _nextKeyingMaterial = data; }
+    //public void setNextKeyingMaterial(byte data[]) { _nextKeyingMaterial = data; }
 
     /**
      * @param local true if we began the current rekeying, false otherwise
      * @deprecated unused
      */
-    public void setRekeyBeganLocally(boolean local) { _rekeyBeganLocally = local; }
+    //public void setRekeyBeganLocally(boolean local) { _rekeyBeganLocally = local; }
 
     /**
      * when were the current cipher and MAC keys established/rekeyed?
@@ -536,7 +544,7 @@ class PeerState {
      * have all of the packets received in the current second requested that
      * the previous second's ACKs be sent?
      */
-    public void remoteDoesNotWantPreviousACKs() { _remoteWantsPreviousACKs = false; }
+    //public void remoteDoesNotWantPreviousACKs() { _remoteWantsPreviousACKs = false; }
     
     /** should we ignore the peer state's congestion window, and let anything through? */
     private static final boolean IGNORE_CWIN = false;
@@ -550,7 +558,12 @@ class PeerState {
      * not adjusted at all.
      */
     public boolean allocateSendingBytes(int size, int messagePushCount) { return allocateSendingBytes(size, false, messagePushCount); }
+
     public boolean allocateSendingBytes(int size, boolean isForACK) { return allocateSendingBytes(size, isForACK, -1); }
+
+    /**
+     *  Caller should synch
+     */
     public boolean allocateSendingBytes(int size, boolean isForACK, int messagePushCount) { 
         long now = _context.clock().now();
         long duration = now - _lastSendRefill;
@@ -591,7 +604,7 @@ class PeerState {
     }
     
     /** if we need to contact them, do we need to talk to an introducer? */
-    public void setRemoteRequiresIntroduction(boolean required) { _remoteRequiresIntroduction = required; }
+    //public void setRemoteRequiresIntroduction(boolean required) { _remoteRequiresIntroduction = required; }
 
     /** 
      * if we are serving as an introducer to them, this is the the tag that
@@ -1038,7 +1051,7 @@ class PeerState {
                        + " rttDev=" + _rttDeviation + " rto=" + _rto);
         if (_rto < minRTO())
             _rto = minRTO();
-        if (_rto > MAX_RTO)
+        else if (_rto > MAX_RTO)
             _rto = MAX_RTO;
     }
     
@@ -1124,10 +1137,11 @@ class PeerState {
     public long getMessagesReceived() { return _messagesReceived; }
     public long getPacketsTransmitted() { return _packetsTransmitted; }
     public long getPacketsRetransmitted() { return _packetsRetransmitted; }
-    public long getPacketsPeriodTransmitted() { return _packetsPeriodTransmitted; }
-    public int getPacketsPeriodRetransmitted() { return _packetsPeriodRetransmitted; }
+    //public long getPacketsPeriodTransmitted() { return _packetsPeriodTransmitted; }
+    //public int getPacketsPeriodRetransmitted() { return _packetsPeriodRetransmitted; }
+
     /** avg number of packets retransmitted for every 100 packets */
-    public long getPacketRetransmissionRate() { return _packetRetransmissionRate; }
+    //public long getPacketRetransmissionRate() { return _packetRetransmissionRate; }
     public long getPacketsReceived() { return _packetsReceived; }
     public long getPacketsReceivedDuplicate() { return _packetsReceivedDuplicate; }
 
@@ -1191,12 +1205,12 @@ class PeerState {
     }
 
     private int minRTO() {
-        if (_packetRetransmissionRate < 10)
+        //if (_packetRetransmissionRate < 10)
             return MIN_RTO;
-        else if (_packetRetransmissionRate < 50)
-            return 2*MIN_RTO;
-        else
-            return MAX_RTO;
+        //else if (_packetRetransmissionRate < 50)
+        //    return 2*MIN_RTO;
+        //else
+        //    return MAX_RTO;
     }
     
     RemoteHostId getRemoteHostId() { return _remoteHostId; }
-- 
GitLab