From f248a33eaad81ee096df0f3411de2cc8d6b6fee0 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Sun, 14 Sep 2014 18:54:46 +0000
Subject: [PATCH] SSU: - Fix IB ACKBitfield.highestReceived() - More efficient
 OMS.acked() - Log tweaks

---
 .../i2p/router/transport/udp/ACKSender.java    |  2 +-
 .../transport/udp/OutboundMessageState.java    |  3 ++-
 .../i2p/router/transport/udp/PeerState.java    |  2 +-
 .../router/transport/udp/UDPPacketReader.java  | 18 ++++++++----------
 4 files changed, 12 insertions(+), 13 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 7d93553026..b7cb7d6cbe 100644
--- a/router/java/src/net/i2p/router/transport/udp/ACKSender.java
+++ b/router/java/src/net/i2p/router/transport/udp/ACKSender.java
@@ -177,7 +177,7 @@ class ACKSender implements Runnable {
                     ack.setMessageType(PacketBuilder.TYPE_ACK);
                     
                     if (_log.shouldLog(Log.INFO))
-                        _log.info("Sending ACK for " + ackBitfields);
+                        _log.info("Sending " + ackBitfields + " to " + peer);
                     // locking issues, we ignore the result, and acks are small,
                     // so don't even bother allocating
                     //peer.allocateSendingBytes(ack.getPacket().getLength(), true);
diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java
index 61d415ccbb..bc625bea41 100644
--- a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java
+++ b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java
@@ -151,7 +151,8 @@ class OutboundMessageState implements CDPQEntry {
      */
     public synchronized boolean acked(ACKBitfield bitfield) {
         // stupid brute force, but the cardinality should be trivial
-        for (int i = 0; i < bitfield.fragmentCount() && i < _numFragments; i++) {
+        int highest = bitfield.highestReceived();
+        for (int i = 0; i <= highest && i < _numFragments; i++) {
             if (bitfield.received(i))
                 _fragmentAcks &= ~mask(i);
         }
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 baf87e3b49..22a92f22eb 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerState.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerState.java
@@ -1089,7 +1089,7 @@ class PeerState {
             return _msgId == ((ACKBitfield)o).getMessageId();
         }
         @Override
-        public String toString() { return "Full ACK of " + _msgId; }
+        public String toString() { return "Full ACK " + _msgId; }
     }
         
     /**
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java b/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java
index 9aea7a1010..d956642b55 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java
@@ -558,19 +558,17 @@ class UDPPacketReader {
          */
         public int highestReceived() {
             int count = fragmentCount();
-            int rv = -1;
-            for (int i = 0; i < _bitfieldSize; i++) {
+            for (int i = _bitfieldSize - 1; i >= 0; i--) {
                 byte b = _message[_bitfieldStart + i];
-                b &= 0x7f;
-                int j = 0;
-                while (b != 0 && j++ < 7) {
-                    if ((b & 0x01) != 0)
-                        rv = (7 * i) + j;
-                    b >>= 1;
-                    b &= 0x7f;
+                if ((b & 0x7f) == 0)
+                    continue;
+                for (int j = 6; j >= 0; j--) {
+                    if ((b & 0x40) != 0)
+                        return (7 * i) + j;
+                    b <<= 1;
                 }
             }
-            return rv;
+            return -1;
         }
 
         public boolean received(int fragmentNum) {
-- 
GitLab