diff --git a/history.txt b/history.txt index 96a31763f..dfa3b27d5 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,7 @@ -$Id: history.txt,v 1.202 2005/04/30 18:26:19 jrandom Exp $ +$Id: history.txt,v 1.203 2005/04/30 19:48:15 jrandom Exp $ + +2005-05-01 jrandom + * Cleaned up the peers page a bit more. 2005-04-30 jrandom * Added a small new page to the web console (/peers.jsp) which contains diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index ec294afe0..e88e85531 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -15,9 +15,9 @@ import net.i2p.CoreVersion; * */ public class RouterVersion { - public final static String ID = "$Revision: 1.193 $ $Date: 2005/04/30 18:26:19 $"; + public final static String ID = "$Revision: 1.194 $ $Date: 2005/04/30 19:48:15 $"; public final static String VERSION = "0.5.0.7"; - public final static long BUILD = 5; + public final static long BUILD = 6; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION); System.out.println("Router ID: " + RouterVersion.ID); 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 ff9fc431d..b52a3a37a 100644 --- a/router/java/src/net/i2p/router/transport/udp/ACKSender.java +++ b/router/java/src/net/i2p/router/transport/udp/ACKSender.java @@ -102,6 +102,13 @@ public class ACKSender implements Runnable { if (_log.shouldLog(Log.INFO)) _log.info("Sending ACK for " + acks); _transport.send(ack); + + if (wanted == peer.getWantedACKSendSince()) { + // still packets left to be ACKed, since wanted time + // is reset by retrieveACKs when all of the IDs are + // removed + ackPeer(peer); + } } } } diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java b/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java index d411df370..32571eab4 100644 --- a/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java +++ b/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java @@ -129,11 +129,12 @@ public class OutboundMessageFragments { synchronized (_activeMessages) { for (int i = 0; i < _activeMessages.size(); i++) { OutboundMessageState state = (OutboundMessageState)_activeMessages.get(i); + PeerState peer = state.getPeer(); if (state.isComplete()) { _activeMessages.remove(i); _transport.succeeded(state.getMessage()); - if (state.getPeer().getSendWindowBytesRemaining() > 0) - _throttle.unchoke(state.getPeer().getRemotePeer()); + if ( (peer != null) && (peer.getSendWindowBytesRemaining() > 0) ) + _throttle.unchoke(peer.getRemotePeer()); state.releaseResources(); if (i < _nextPacketMessage) { _nextPacketMessage--; @@ -153,8 +154,8 @@ public class OutboundMessageFragments { if (_log.shouldLog(Log.WARN)) _log.warn("Unable to send an expired direct message: " + state); } - if (state.getPeer().getSendWindowBytesRemaining() > 0) - _throttle.unchoke(state.getPeer().getRemotePeer()); + if ( (peer != null) && (peer.getSendWindowBytesRemaining() > 0) ) + _throttle.unchoke(peer.getRemotePeer()); state.releaseResources(); if (i < _nextPacketMessage) { _nextPacketMessage--; @@ -176,8 +177,8 @@ public class OutboundMessageFragments { if (_log.shouldLog(Log.WARN)) _log.warn("Unable to send a direct message after too many volleys: " + state); } - if (state.getPeer().getSendWindowBytesRemaining() > 0) - _throttle.unchoke(state.getPeer().getRemotePeer()); + if ( (peer != null) && (peer.getSendWindowBytesRemaining() > 0) ) + _throttle.unchoke(peer.getRemotePeer()); state.releaseResources(); if (i < _nextPacketMessage) { _nextPacketMessage--; @@ -226,8 +227,8 @@ public class OutboundMessageFragments { _transport.failed(state); if (_log.shouldLog(Log.WARN)) _log.warn("Peer disconnected for " + state); - if (state.getPeer().getSendWindowBytesRemaining() > 0) - _throttle.unchoke(state.getPeer().getRemotePeer()); + if ( (peer != null) && (peer.getSendWindowBytesRemaining() > 0) ) + _throttle.unchoke(peer.getRemotePeer()); state.releaseResources(); i--; } diff --git a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java index 0380df72d..e980e6d2c 100644 --- a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java +++ b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java @@ -258,8 +258,8 @@ public class PacketHandler { receivePacket(reader, packet); } - /** let packets be up to 5s slow */ - private static final long GRACE_PERIOD = Router.CLOCK_FUDGE_FACTOR + 5*1000; + /** let packets be up to 30s slow */ + private static final long GRACE_PERIOD = Router.CLOCK_FUDGE_FACTOR + 30*1000; /** * Parse out the interesting bits and honor what it says @@ -279,8 +279,11 @@ public class PacketHandler { return; } - if (state != null) + if (state != null) { + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Received packet from " + state.getRemoteHostString() + " with skew " + skew); state.adjustClockSkew((short)skew); + } _context.statManager().addRateData("udp.receivePacketSkew", skew, packet.getLifetime()); diff --git a/router/java/src/net/i2p/router/transport/udp/PacketPusher.java b/router/java/src/net/i2p/router/transport/udp/PacketPusher.java index b4e620983..3f9074ce7 100644 --- a/router/java/src/net/i2p/router/transport/udp/PacketPusher.java +++ b/router/java/src/net/i2p/router/transport/udp/PacketPusher.java @@ -39,7 +39,7 @@ public class PacketPusher implements Runnable { if (packets != null) { for (int i = 0; i < packets.length; i++) { if (packets[i] != null) // null for ACKed fragments - _sender.add(packets[i], 1000); // blocks for up to a second + _sender.add(packets[i], 100); // blocks for up to 100ms } } } 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 43f878660..8b8bf8160 100644 --- a/router/java/src/net/i2p/router/transport/udp/PeerState.java +++ b/router/java/src/net/i2p/router/transport/udp/PeerState.java @@ -135,7 +135,12 @@ public class PeerState { private static final int DEFAULT_SEND_WINDOW_BYTES = 8*1024; private static final int MINIMUM_WINDOW_BYTES = DEFAULT_SEND_WINDOW_BYTES; private static final int MAX_SEND_WINDOW_BYTES = 1024*1024; - private static final int DEFAULT_MTU = 1472; + /* + * 576 gives us 568 IP byes, 548 UDP bytes, and with an SSU data message, + * 502 fragment bytes, which is enough to send a tunnel data message in 2 + * packets. + */ + private static final int DEFAULT_MTU = 576; private static final int MIN_RTO = 600; private static final int MAX_RTO = 5000; @@ -150,7 +155,7 @@ public class PeerState { _nextKeyingMaterial = null; _rekeyBeganLocally = false; _keyEstablishedTime = -1; - _clockSkew = Short.MIN_VALUE; + _clockSkew = 0; _currentReceiveSecond = -1; _lastSendTime = -1; _lastReceiveTime = -1; diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java index bc0715291..4a67df913 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -70,6 +70,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority private TransportBid _fastBid; /** shared slow bid for unconnected peers */ private TransportBid _slowBid; + /** shared slow bid for unconnected peers when we want to prefer UDP */ + private TransportBid _slowPreferredBid; public static final String STYLE = "SSUv1"; public static final String PROP_INTERNAL_PORT = "i2np.udp.internalPort"; @@ -78,6 +80,13 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority public static final String PROP_EXTERNAL_HOST = "i2np.udp.host"; /** define this to explicitly set an external port */ public static final String PROP_EXTERNAL_PORT = "i2np.udp.port"; + /** + * If i2np.udp.alwaysPreferred is set, the UDP bids will always be under + * the bid from the TCP transport - even if a TCP connection already + * exists. The default is to prefer UDP unless no UDP session exists and + * a TCP connection already exists. + */ + public static final String PROP_ALWAYS_PREFER_UDP = "i2np.udp.alwaysPreferred"; /** how many relays offered to us will we use at a time? */ @@ -109,6 +118,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority _fastBid = new SharedBid(50); _slowBid = new SharedBid(1000); + _slowPreferredBid = new SharedBid(75); _fragments = new OutboundMessageFragments(_context, this, _activeThrottle); _inboundFragments = new InboundMessageFragments(_context, _fragments, this); @@ -371,9 +381,17 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority if (_log.shouldLog(Log.DEBUG)) _log.debug("bidding on a message to an unestablished peer: " + to.toBase64()); - return _slowBid; + if (alwaysPreferUDP()) + return _slowPreferredBid; + else + return _slowBid; } } + + private boolean alwaysPreferUDP() { + String pref = _context.getProperty(PROP_ALWAYS_PREFER_UDP); + return (pref != null) && "true".equals(pref); + } public String getStyle() { return STYLE; } public void send(OutNetMessage msg) { @@ -561,10 +579,12 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority buf.append(""); + String name = peer.getRemotePeer().toBase64().substring(0,6); buf.append(""); - buf.append(""); + buf.append(name).append("@"); byte ip[] = peer.getRemoteIP(); for (int j = 0; j < ip.length; j++) { buf.append(ip[j] & 0xFF);