diff --git a/apps/routerconsole/jsp/configlogging.jsp b/apps/routerconsole/jsp/configlogging.jsp index 8f4c069e07ab43c9e2979ec8074db6583018dfc4..11db8e8b7fe055f8c5b90e7b9d86992a1464e315 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()+""); %> <input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigLoggingHandler.nonce")%>" /> <input type="hidden" name="action" value="blah" /> - <b>Logging filename:</b> - <input type="text" name="logfilename" size="40" value="<jsp:getProperty name="logginghelper" property="logFilePattern" />" /><br /> - <i>(the symbol '@' will be replaced during log rotation)</i><br /> - <b>Log record format:</b> - <input type="text" name="logformat" size="20" value="<jsp:getProperty name="logginghelper" property="recordPattern" />" /><br /> - <i>(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)</i><br /> - <b>Log date format:</b> - <input type="text" name="logdateformat" size="20" value="<jsp:getProperty name="logginghelper" property="datePattern" />" /><br /> - <i>('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)</i><br /> - <b>Max log file size:</b> - <input type="text" name="logfilesize" size="4" value="<jsp:getProperty name="logginghelper" property="maxFileSize" />" /><br /> - <hr /> - <b>Log levels:</b> <br /> - <b>Default log level:</b> - <jsp:getProperty name="logginghelper" property="defaultLogLevelBox" /> - <i>(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)</i> - <br /> - <jsp:getProperty name="logginghelper" property="logLevelTable" /> - <hr /> + <table border="0" cellspacing="5"> + <tr><td valign="top"><b>Logging filename:</b> + <td><input type="text" name="logfilename" size="40" value="<jsp:getProperty name="logginghelper" property="logFilePattern" />" /><br /> + <i>(the symbol '@' will be replaced during log rotation)</i> + <tr><td valign="top"><b>Log record format:</b> + <td><input type="text" name="logformat" size="20" value="<jsp:getProperty name="logginghelper" property="recordPattern" />" /><br /> + <i>(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)</i> + <tr><td valign="top"><b>Log date format:</b> + <td><input type="text" name="logdateformat" size="20" value="<jsp:getProperty name="logginghelper" property="datePattern" />" /><br /> + <i>('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)</i> + <tr><td valign="top"><b>Max log file size:</b> + <td><input type="text" name="logfilesize" size="4" value="<jsp:getProperty name="logginghelper" property="maxFileSize" />" /><br /> + <tr><td valign="top"><b>Default log level:</b> + <td><jsp:getProperty name="logginghelper" property="defaultLogLevelBox" /> + <br /><i>(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)</i> + <tr><td valign="top"><b>Log level overrides:</b> + <td><jsp:getProperty name="logginghelper" property="logLevelTable" /> + <tr><td><td> <input type="submit" name="shouldsave" value="Save changes" /> <input type="reset" value="Cancel" /> + </table> </form> </div> 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 30d849ba4411de595c149ebaaf12e56b2bf4820a..d989a23671a938c3597ab517ae77f7c78f0845c8 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 1f2b3590246bab54092a00853c68f7d90972929b..1d26d7b8c1061acd3e24e28ffe4a78ec32a5b64d 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 e8e0a01f102212832cd5ba92f5fe17dc8cbf6476..b03ea1473415ae4fc3332a50e878bd2bef640877 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 049140397fc4127a8cbe7adc501a2475ea89f68e..d051460a29d349138b3d6862f2ac1ec49b6804e4 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 c88897a127031dcc818d5d5302ca5ef1e19cdaaa..acf533bf787325acc02bb71b2b55cc00b3e5f46a 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 6f89551e2f796a98ab9a28c15370fec22bbda622..282b67e0cdc0973045144633a4cac6a29ac17914 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 161f2900128e32e9c6c92a9675535b2445a7ab95..d26ac1a5e4c2d3963692e84a9c69dc2669ec011b 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 a0531fffb06603bcf860bf62e3121a74985b5808..464fbd836e5f678a932695bbc8f2abf4db0b5066 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("<h2>Peer Profiles</h2>\n"); + buf.append("<p>Showing ").append(order.size()).append(" recent profiles, hiding ").append(peers.size()-order.size()).append(" older profiles</p>"); buf.append("<table border=\"1\">"); buf.append("<tr>"); - buf.append("<td><b>Peer</b> (").append(order.size()).append(", hiding ").append(peers.size()-order.size()).append(")</td>"); + buf.append("<td><b>Peer</b></td>"); buf.append("<td><b>Groups (Caps)</b></td>"); buf.append("<td><b>Speed</b></td>"); buf.append("<td><b>Capacity</b></td>"); @@ -97,7 +98,7 @@ class ProfileOrganizerRenderer { buf.append("<tr><td colspan=\"7\"><hr /></td></tr>\n"); prevTier = tier; - buf.append("<tr><td>"); + buf.append("<tr><td nowrap>"); buf.append(_context.commSystem().renderPeerHTML(peer)); buf.append("</td><td>"); @@ -179,7 +180,7 @@ class ProfileOrganizerRenderer { PeerProfile prof = (PeerProfile)iter.next(); Hash peer = prof.getPeer(); - buf.append("<tr><td>"); + buf.append("<tr><td nowrap>"); buf.append(_context.commSystem().renderPeerHTML(peer)); buf.append("</td>"); 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 2bddc3982c222d2e284a2a8af97446b2e9344f88..a798e0c18d90fe63af9ded7b62ab4b1fda198270 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,24 +437,24 @@ public class CommSystemFacadeImpl extends CommSystemFacade { public String renderPeerHTML(Hash peer) { String h = peer.toBase64().substring(0, 4); StringBuffer buf = new StringBuffer(128); - buf.append("<tt><font size=\"+1\">"); - boolean found = _context.netDb().lookupRouterInfoLocally(peer) != null; - if (found) - buf.append("<a title=\"NetDb entry\" href=\"netdb.jsp?r=").append(h).append("\">"); - buf.append(h); - if (found) - buf.append("</a>"); - buf.append("</font></tt>"); String c = getCountry(peer); if (c != null) { - buf.append(" <img alt=\"").append(c.toUpperCase()).append("\" title=\""); + buf.append("<img alt=\"").append(c.toUpperCase()).append("\" title=\""); String n = _geoIP.fullName(c); if (n != null) buf.append(n); else buf.append(c); - buf.append("\" src=\"/flags.jsp?c=").append(c).append("\">"); + buf.append("\" src=\"/flags.jsp?c=").append(c).append("\"> "); } + buf.append("<tt><font size=\"+1\">"); + boolean found = _context.netDb().lookupRouterInfoLocally(peer) != null; + if (found) + buf.append("<a title=\"NetDb entry\" href=\"netdb.jsp?r=").append(h).append("\">"); + buf.append(h); + if (found) + buf.append("</a>"); + buf.append("</font></tt>"); 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 d2f2f8bc4744fd3f28b50a65736a37d95ac7e92f..8b3f5f9e6162317e3c64f8a1a4062d242a029c53 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("<tr><td>"); + buf.append("<tr><td nowrap>"); 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 b438d115ff0b0796278236e206fc7002c6027a0c..877a0a9aa4cd376aa262361ccfb7d6eb5f1a3bc4 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("<tr>"); - buf.append("<td>"); + buf.append("<td nowrap>"); buf.append(_context.commSystem().renderPeerHTML(peer.getRemotePeer())); //byte ip[] = peer.getRemoteIP(); //if (ip != null)