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 7d935530263069a1cd67a087d8afbd7f987e96b9..b7cb7d6cbe6034a15451dd7c772e11ce0ad4b798 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 61d415ccbb1dab1fb50e64f449b8229e96e2643c..bc625bea417a9d4e10b6e1d4d54a36b3263d69cb 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 baf87e3b498a04f9c75b97709ad7597dd01389bd..22a92f22eb595a82c381886e5bca642e9cb25e0c 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 9aea7a101088875005148509dfd31de6c75f525e..d956642b55179ea40a31341e2a5d74c5140462df 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) {