diff --git a/apps/routerconsole/jsp/configlogging.jsp b/apps/routerconsole/jsp/configlogging.jsp index 8f4c069e0..11db8e8b7 100644 --- a/apps/routerconsole/jsp/configlogging.jsp +++ b/apps/routerconsole/jsp/configlogging.jsp @@ -27,27 +27,27 @@ System.setProperty("net.i2p.router.web.ConfigLoggingHandler.nonce", new java.util.Random().nextLong()+""); %> " /> - Logging filename: - " />
- (the symbol '@' will be replaced during log rotation)
- Log record format: - " />
- (use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)
- Log date format: - " />
- ('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)
- Max log file size: - " />
-
- Log levels:
- Default log level: - - (DEBUG and INFO are not recommended defaults, as they will drastically slow down your router) -
- -
+ +
Logging filename: + " />
+ (the symbol '@' will be replaced during log rotation) +
Log record format: + " />
+ (use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message) +
Log date format: + " />
+ ('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond) +
Max log file size: + " />
+
Default log level: + +
(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router) +
Log level overrides: + +
+
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionHandler.java b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionHandler.java index 30d849ba4..d989a2367 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionHandler.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionHandler.java @@ -171,7 +171,9 @@ class ConnectionHandler { // Send it through the packet handler again if (_log.shouldLog(Log.WARN)) _log.warn("Found con for queued non-syn packet: " + packet); - _manager.getPacketHandler().receivePacket(packet); + // false -> don't requeue, fixes a race where a SYN gets dropped + // between here and PacketHandler, causing the packet to loop forever.... + _manager.getPacketHandler().receivePacketDirect(packet, false); } else { // goodbye if (_log.shouldLog(Log.WARN)) diff --git a/apps/streaming/java/src/net/i2p/client/streaming/PacketHandler.java b/apps/streaming/java/src/net/i2p/client/streaming/PacketHandler.java index 1f2b35902..1d26d7b8c 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/PacketHandler.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/PacketHandler.java @@ -90,10 +90,10 @@ public class PacketHandler { void receivePacket(Packet packet) { //boolean ok = choke(packet); //if (ok) - receivePacketDirect(packet); + receivePacketDirect(packet, true); } - private void receivePacketDirect(Packet packet) { + void receivePacketDirect(Packet packet, boolean queueIfNoConn) { //if (_log.shouldLog(Log.DEBUG)) // _log.debug("packet received: " + packet); @@ -105,7 +105,7 @@ public class PacketHandler { if (_log.shouldLog(Log.INFO)) displayPacket(packet, "RECV", "wsize " + con.getOptions().getWindowSize() + " rto " + con.getOptions().getRTO()); } else { - receiveUnknownCon(packet, sendId); + receiveUnknownCon(packet, sendId, queueIfNoConn); displayPacket(packet, "UNKN", null); } } @@ -228,7 +228,7 @@ public class PacketHandler { _manager.getPacketQueue().enqueue(reply); } - private void receiveUnknownCon(Packet packet, long sendId) { + private void receiveUnknownCon(Packet packet, long sendId, boolean queueIfNoConn) { if (packet.isFlagSet(Packet.FLAG_ECHO)) { if (packet.getSendStreamId() > 0) { receivePing(packet); @@ -262,7 +262,7 @@ public class PacketHandler { if (packet.isFlagSet(Packet.FLAG_SYNCHRONIZE)) { _manager.getConnectionHandler().receiveNewSyn(packet); - } else { + } else if (queueIfNoConn) { // We can get here on the 2nd+ packet if the 1st (SYN) packet // is still on the _synQueue in the ConnectionHandler, and // ConnectionManager.receiveConnection() hasn't run yet to put @@ -287,6 +287,10 @@ public class PacketHandler { } //packet.releasePayload(); _manager.getConnectionHandler().receiveNewSyn(packet); + } else { + // don't queue again (infinite loop!) + sendReset(packet); + packet.releasePayload(); } } } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java index e8e0a01f1..b03ea1473 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java @@ -8,7 +8,9 @@ package net.i2p.router.networkdb.kademlia; * */ +import java.util.HashSet; import java.util.List; +import java.util.Set; import net.i2p.data.Hash; import net.i2p.data.TunnelId; @@ -96,7 +98,13 @@ class ExploreJob extends SearchJob { available = MAX_CLOSEST - msg.getDontIncludePeers().size(); if (available > 0) { - List peers = _peerSelector.selectNearestExplicit(getState().getTarget(), available, msg.getDontIncludePeers(), getFacade().getKBuckets()); + // selectNearestExplicit adds our hash to the dontInclude set (3rd param) ... + // And we end up with MAX_CLOSEST+1 entries. + // We don't want our hash in the message's don't-include list though. + // We're just exploring, but this could give things away, and tie our exploratory tunnels to our router, + // so let's not put our hash in there. + Set dontInclude = new HashSet(msg.getDontIncludePeers()); + List peers = _peerSelector.selectNearestExplicit(getState().getTarget(), available, dontInclude, getFacade().getKBuckets()); msg.getDontIncludePeers().addAll(peers); } @@ -106,17 +114,6 @@ class ExploreJob extends SearchJob { return msg; } - - /** - * We're looking for a router, so lets build the lookup message (no need to tunnel route either, so just have - * replies sent back to us directly). This uses the similar overrides as the other buildMessage above. - * - */ - @Override - protected DatabaseLookupMessage buildMessage(long expiration) { - return buildMessage(null, getContext().router().getRouterInfo().getIdentity().getHash(), expiration); - } - /** max # of concurrent searches */ @Override protected int getBredth() { return EXPLORE_BREDTH; } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java index 049140397..d051460a2 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java @@ -44,7 +44,7 @@ class FloodfillPeerSelector extends PeerSelector { public List selectNearestExplicitThin(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets, boolean preferConnected) { if (peersToIgnore == null) peersToIgnore = new HashSet(1); - peersToIgnore.add(_context.router().getRouterInfo().getIdentity().getHash()); + peersToIgnore.add(_context.routerHash()); FloodfillSelectionCollector matches = new FloodfillSelectionCollector(key, peersToIgnore, maxNumRouters); if (kbuckets == null) return new ArrayList(); kbuckets.getAll(matches); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java index c88897a12..acf533bf7 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java @@ -61,7 +61,7 @@ public class PeerSelector { if (peersToIgnore == null) peersToIgnore = new HashSet(1); - peersToIgnore.add(_context.router().getRouterInfo().getIdentity().getHash()); + peersToIgnore.add(_context.routerHash()); Set allHashes = kbuckets.getAll(peersToIgnore); removeFailingPeers(allHashes); Map diffMap = new HashMap(allHashes.size()); @@ -94,7 +94,7 @@ public class PeerSelector { public List selectNearestExplicitThin(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets) { // LINT -- Exporting non-public type through public API if (peersToIgnore == null) peersToIgnore = new HashSet(1); - peersToIgnore.add(_context.router().getRouterInfo().getIdentity().getHash()); + peersToIgnore.add(_context.routerHash()); MatchSelectionCollector matches = new MatchSelectionCollector(key, peersToIgnore); kbuckets.getAll(matches); List rv = matches.get(maxNumRouters); diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java index 6f89551e2..282b67e0c 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java @@ -106,8 +106,10 @@ class PersistentDataStore extends TransientDataStore { */ @Override public DataStructure remove(Hash key, boolean persist) { - if (persist) + if (persist) { + _writer.remove(key); _context.jobQueue().addJob(new RemoveJob(key)); + } return super.remove(key); } @@ -183,6 +185,10 @@ class PersistentDataStore extends TransientDataStore { return _keys.get(key); } + public void remove(Hash key) { + _keys.remove(key); + } + public void run() { _quit = false; Hash key = null; diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java index 161f29001..d26ac1a5e 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java @@ -452,6 +452,7 @@ class SearchJob extends JobImpl { } /** we're searching for a router, so we can just send direct */ +/******* always send through the lease protected void sendRouterSearch(RouterInfo router) { int timeout = _facade.getPeerTimeout(router.getIdentity().getHash()); long expiration = getContext().clock().now() + timeout; @@ -471,6 +472,7 @@ class SearchJob extends JobImpl { j.runJob(); //getContext().jobQueue().addJob(j); } +**********/ /** * what tunnel will we send the search out through? @@ -513,6 +515,7 @@ class SearchJob extends JobImpl { * replies sent back to us directly) * */ +/******* always send through the lease protected DatabaseLookupMessage buildMessage(long expiration) { DatabaseLookupMessage msg = new DatabaseLookupMessage(getContext(), true); msg.setSearchKey(_state.getTarget()); @@ -522,6 +525,7 @@ class SearchJob extends JobImpl { msg.setReplyTunnel(null); return msg; } +*********/ void replyFound(DatabaseSearchReplyMessage message, Hash peer) { long duration = _state.replyFound(peer); diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java index a0531fffb..464fbd836 100644 --- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java +++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java @@ -58,9 +58,10 @@ class ProfileOrganizerRenderer { int failing = 0; StringBuffer buf = new StringBuffer(16*1024); buf.append("

Peer Profiles

\n"); + buf.append("

Showing ").append(order.size()).append(" recent profiles, hiding ").append(peers.size()-order.size()).append(" older profiles

"); buf.append(""); buf.append(""); - buf.append(""); + buf.append(""); buf.append(""); buf.append(""); buf.append(""); @@ -97,7 +98,7 @@ class ProfileOrganizerRenderer { buf.append("\n"); prevTier = tier; - buf.append(""); RouterInfo info = _context.netDb().lookupRouterInfoLocally(peer); diff --git a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java index 2bddc3982..a798e0c18 100644 --- a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java +++ b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java @@ -128,6 +128,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade { } int getTransportCount() { return _manager.getTransportCount(); } + /** Send the message out */ public void processMessage(OutNetMessage msg) { //GetBidsJob j = new GetBidsJob(_context, this, msg); //j.runJob(); @@ -436,6 +437,16 @@ public class CommSystemFacadeImpl extends CommSystemFacade { public String renderPeerHTML(Hash peer) { String h = peer.toBase64().substring(0, 4); StringBuffer buf = new StringBuffer(128); + String c = getCountry(peer); + if (c != null) { + buf.append("\"").append(c.toUpperCase()).append("\" "); + } buf.append(""); boolean found = _context.netDb().lookupRouterInfoLocally(peer) != null; if (found) @@ -444,16 +455,6 @@ public class CommSystemFacadeImpl extends CommSystemFacade { if (found) buf.append(""); buf.append(""); - String c = getCountry(peer); - if (c != null) { - buf.append(" \"").append(c.toUpperCase()).append("\""); - } return buf.toString(); } } diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java index d2f2f8bc4..8b3f5f9e6 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java @@ -265,7 +265,7 @@ public class NTCPTransport extends TransportImpl { boolean established = isEstablished(toAddress.getIdentity()); if (established) { // should we check the queue size? nah, if its valid, use it if (_log.shouldLog(Log.DEBUG)) - _log.debug("fast bid when trying to send to " + toAddress.getIdentity().calculateHash().toBase64() + " as its already established"); + _log.debug("fast bid when trying to send to " + peer.toBase64() + " as its already established"); return _fastBid; } RouterAddress addr = toAddress.getTargetAddress(STYLE); @@ -275,7 +275,7 @@ public class NTCPTransport extends TransportImpl { _context.statManager().addRateData("ntcp.bidRejectedNoNTCPAddress", 1, 0); //_context.shitlist().shitlistRouter(toAddress.getIdentity().calculateHash(), "No NTCP address", STYLE); if (_log.shouldLog(Log.DEBUG)) - _log.debug("no bid when trying to send to " + toAddress.getIdentity().calculateHash().toBase64() + " as they don't have an ntcp address"); + _log.debug("no bid when trying to send to " + peer.toBase64() + " as they don't have an ntcp address"); return null; } NTCPAddress naddr = new NTCPAddress(addr); @@ -284,7 +284,7 @@ public class NTCPTransport extends TransportImpl { markUnreachable(peer); //_context.shitlist().shitlistRouter(toAddress.getIdentity().calculateHash(), "Invalid NTCP address", STYLE); if (_log.shouldLog(Log.DEBUG)) - _log.debug("no bid when trying to send to " + toAddress.getIdentity().calculateHash().toBase64() + " as they don't have a valid ntcp address"); + _log.debug("no bid when trying to send to " + peer.toBase64() + " as they don't have a valid ntcp address"); return null; } if (!naddr.isPubliclyRoutable()) { @@ -292,14 +292,14 @@ public class NTCPTransport extends TransportImpl { _context.statManager().addRateData("ntcp.bidRejectedLocalAddress", 1, 0); markUnreachable(peer); if (_log.shouldLog(Log.DEBUG)) - _log.debug("no bid when trying to send to " + toAddress.getIdentity().calculateHash().toBase64() + " as they have a private ntcp address"); + _log.debug("no bid when trying to send to " + peer.toBase64() + " as they have a private ntcp address"); return null; } } if (!allowConnection()) { if (_log.shouldLog(Log.WARN)) - _log.warn("no bid when trying to send to " + toAddress.getIdentity().calculateHash().toBase64() + ", max connection limit reached"); + _log.warn("no bid when trying to send to " + peer.toBase64() + ", max connection limit reached"); return _transientFail; } @@ -307,7 +307,7 @@ public class NTCPTransport extends TransportImpl { // return null; // dont talk to yourself if (_log.shouldLog(Log.DEBUG)) - _log.debug("slow bid when trying to send to " + toAddress.getIdentity().calculateHash().toBase64()); + _log.debug("slow bid when trying to send to " + peer.toBase64()); return _slowBid; } @@ -655,7 +655,7 @@ public class NTCPTransport extends TransportImpl { buf.setLength(0); for (Iterator iter = peers.iterator(); iter.hasNext(); ) { NTCPConnection con = (NTCPConnection)iter.next(); - buf.append(""); - buf.append("
Peer (").append(order.size()).append(", hiding ").append(peers.size()-order.size()).append(")PeerGroups (Caps)SpeedCapacity

"); + buf.append("
"); buf.append(_context.commSystem().renderPeerHTML(peer)); buf.append(""); @@ -179,7 +180,7 @@ class ProfileOrganizerRenderer { PeerProfile prof = (PeerProfile)iter.next(); Hash peer = prof.getPeer(); - buf.append("
"); + buf.append("
"); buf.append(_context.commSystem().renderPeerHTML(peer)); buf.append("
"); + buf.append("
"); buf.append(_context.commSystem().renderPeerHTML(con.getRemotePeer().calculateHash())); //byte[] ip = getIP(con.getRemotePeer().calculateHash()); //if (ip != null) 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 b438d115f..877a0a9aa 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -1807,7 +1807,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority buf.append("
"); + buf.append(""); buf.append(_context.commSystem().renderPeerHTML(peer.getRemotePeer())); //byte ip[] = peer.getRemoteIP(); //if (ip != null)