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