2005-09-13 jrandom
* More careful error handling with introductions (thanks dust!) * Fix the forceIntroducers checkbox on config.jsp (thanks Complication!) * Hide the shitlist on the summary so it doesn't confuse new users.
This commit is contained in:
@ -5,6 +5,7 @@ import net.i2p.router.RouterContext;
|
|||||||
import net.i2p.router.CommSystemFacade;
|
import net.i2p.router.CommSystemFacade;
|
||||||
import net.i2p.data.RouterAddress;
|
import net.i2p.data.RouterAddress;
|
||||||
import net.i2p.router.transport.udp.UDPAddress;
|
import net.i2p.router.transport.udp.UDPAddress;
|
||||||
|
import net.i2p.router.transport.udp.UDPTransport;
|
||||||
|
|
||||||
public class ConfigNetHelper {
|
public class ConfigNetHelper {
|
||||||
private RouterContext _context;
|
private RouterContext _context;
|
||||||
@ -66,11 +67,15 @@ public class ConfigNetHelper {
|
|||||||
short status = _context.commSystem().getReachabilityStatus();
|
short status = _context.commSystem().getReachabilityStatus();
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case CommSystemFacade.STATUS_OK:
|
case CommSystemFacade.STATUS_OK:
|
||||||
|
if ("true".equalsIgnoreCase(_context.getProperty(UDPTransport.PROP_FORCE_INTRODUCERS, "false")))
|
||||||
|
return "checked=\"true\"";
|
||||||
return "";
|
return "";
|
||||||
case CommSystemFacade.STATUS_DIFFERENT:
|
case CommSystemFacade.STATUS_DIFFERENT:
|
||||||
case CommSystemFacade.STATUS_REJECT_UNSOLICITED:
|
case CommSystemFacade.STATUS_REJECT_UNSOLICITED:
|
||||||
return "checked=\"true\"";
|
return "checked=\"true\"";
|
||||||
case CommSystemFacade.STATUS_UNKNOWN:
|
case CommSystemFacade.STATUS_UNKNOWN:
|
||||||
|
if ("true".equalsIgnoreCase(_context.getProperty(UDPTransport.PROP_FORCE_INTRODUCERS, "false")))
|
||||||
|
return "checked=\"true\"";
|
||||||
return "";
|
return "";
|
||||||
default:
|
default:
|
||||||
return "checked=\"true\"";
|
return "checked=\"true\"";
|
||||||
|
@ -40,7 +40,7 @@
|
|||||||
<b>High capacity:</b> <jsp:getProperty name="helper" property="highCapacityPeers" /><br />
|
<b>High capacity:</b> <jsp:getProperty name="helper" property="highCapacityPeers" /><br />
|
||||||
<b>Well integrated:</b> <jsp:getProperty name="helper" property="wellIntegratedPeers" /><br />
|
<b>Well integrated:</b> <jsp:getProperty name="helper" property="wellIntegratedPeers" /><br />
|
||||||
<b>Failing:</b> <jsp:getProperty name="helper" property="failingPeers" /><br />
|
<b>Failing:</b> <jsp:getProperty name="helper" property="failingPeers" /><br />
|
||||||
<b>Shitlisted:</b> <jsp:getProperty name="helper" property="shitlistedPeers" /><br />
|
<!-- <b>Shitlisted:</b> <jsp:getProperty name="helper" property="shitlistedPeers" /><br /> -->
|
||||||
<b>Known:</b> <jsp:getProperty name="helper" property="allPeers" /><br /><%
|
<b>Known:</b> <jsp:getProperty name="helper" property="allPeers" /><br /><%
|
||||||
if (helper.getActivePeers() <= 0) {
|
if (helper.getActivePeers() <= 0) {
|
||||||
%><b><a href="config.jsp">check your NAT/firewall</a></b><br /><%
|
%><b><a href="config.jsp">check your NAT/firewall</a></b><br /><%
|
||||||
|
@ -1,4 +1,9 @@
|
|||||||
$Id: history.txt,v 1.247 2005/09/12 22:32:30 jrandom Exp $
|
$Id: history.txt,v 1.248 2005/09/13 04:06:07 comwiz Exp $
|
||||||
|
|
||||||
|
2005-09-13 jrandom
|
||||||
|
* More careful error handling with introductions (thanks dust!)
|
||||||
|
* Fix the forceIntroducers checkbox on config.jsp (thanks Complication!)
|
||||||
|
* Hide the shitlist on the summary so it doesn't confuse new users.
|
||||||
|
|
||||||
2005-09-12 comwiz
|
2005-09-12 comwiz
|
||||||
* Migrated the router tests to junit
|
* Migrated the router tests to junit
|
||||||
|
@ -15,9 +15,9 @@ import net.i2p.CoreVersion;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class RouterVersion {
|
public class RouterVersion {
|
||||||
public final static String ID = "$Revision: 1.233 $ $Date: 2005/09/12 20:12:43 $";
|
public final static String ID = "$Revision: 1.234 $ $Date: 2005/09/12 22:32:30 $";
|
||||||
public final static String VERSION = "0.6.0.5";
|
public final static String VERSION = "0.6.0.5";
|
||||||
public final static long BUILD = 8;
|
public final static long BUILD = 9;
|
||||||
public static void main(String args[]) {
|
public static void main(String args[]) {
|
||||||
System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
|
System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
|
||||||
System.out.println("Router ID: " + RouterVersion.ID);
|
System.out.println("Router ID: " + RouterVersion.ID);
|
||||||
|
@ -764,36 +764,46 @@ public class EstablishmentManager {
|
|||||||
private class Establisher implements Runnable {
|
private class Establisher implements Runnable {
|
||||||
public void run() {
|
public void run() {
|
||||||
while (_alive) {
|
while (_alive) {
|
||||||
_activity = 0;
|
try {
|
||||||
long now = _context.clock().now();
|
doPass();
|
||||||
long nextSendTime = -1;
|
} catch (OutOfMemoryError oom) {
|
||||||
long nextSendInbound = handleInbound();
|
throw oom;
|
||||||
long nextSendOutbound = handleOutbound();
|
} catch (RuntimeException re) {
|
||||||
if (nextSendInbound > 0)
|
_log.log(Log.CRIT, "Error in the establisher", re);
|
||||||
nextSendTime = nextSendInbound;
|
|
||||||
if ( (nextSendTime < 0) || (nextSendOutbound < nextSendTime) )
|
|
||||||
nextSendTime = nextSendOutbound;
|
|
||||||
|
|
||||||
long delay = nextSendTime - now;
|
|
||||||
if ( (nextSendTime == -1) || (delay > 0) ) {
|
|
||||||
boolean interrupted = false;
|
|
||||||
try {
|
|
||||||
synchronized (_activityLock) {
|
|
||||||
if (_activity > 0)
|
|
||||||
continue;
|
|
||||||
if (nextSendTime == -1)
|
|
||||||
_activityLock.wait();
|
|
||||||
else
|
|
||||||
_activityLock.wait(delay);
|
|
||||||
}
|
|
||||||
} catch (InterruptedException ie) {
|
|
||||||
interrupted = true;
|
|
||||||
}
|
|
||||||
if (_log.shouldLog(Log.DEBUG))
|
|
||||||
_log.debug("After waiting w/ nextSend=" + nextSendTime
|
|
||||||
+ " and delay=" + delay + " and interrupted=" + interrupted);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void doPass() {
|
||||||
|
_activity = 0;
|
||||||
|
long now = _context.clock().now();
|
||||||
|
long nextSendTime = -1;
|
||||||
|
long nextSendInbound = handleInbound();
|
||||||
|
long nextSendOutbound = handleOutbound();
|
||||||
|
if (nextSendInbound > 0)
|
||||||
|
nextSendTime = nextSendInbound;
|
||||||
|
if ( (nextSendTime < 0) || (nextSendOutbound < nextSendTime) )
|
||||||
|
nextSendTime = nextSendOutbound;
|
||||||
|
|
||||||
|
long delay = nextSendTime - now;
|
||||||
|
if ( (nextSendTime == -1) || (delay > 0) ) {
|
||||||
|
boolean interrupted = false;
|
||||||
|
try {
|
||||||
|
synchronized (_activityLock) {
|
||||||
|
if (_activity > 0)
|
||||||
|
return;
|
||||||
|
if (nextSendTime == -1)
|
||||||
|
_activityLock.wait();
|
||||||
|
else
|
||||||
|
_activityLock.wait(delay);
|
||||||
|
}
|
||||||
|
} catch (InterruptedException ie) {
|
||||||
|
interrupted = true;
|
||||||
|
}
|
||||||
|
if (_log.shouldLog(Log.DEBUG))
|
||||||
|
_log.debug("After waiting w/ nextSend=" + nextSendTime
|
||||||
|
+ " and delay=" + delay + " and interrupted=" + interrupted);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -641,11 +641,20 @@ public class PacketBuilder {
|
|||||||
|
|
||||||
public UDPPacket buildRelayRequest(OutboundEstablishState state, SessionKey ourIntroKey) {
|
public UDPPacket buildRelayRequest(OutboundEstablishState state, SessionKey ourIntroKey) {
|
||||||
UDPAddress addr = state.getRemoteAddress();
|
UDPAddress addr = state.getRemoteAddress();
|
||||||
int index = _context.random().nextInt(UDPAddress.MAX_INTRODUCERS) % addr.getIntroducerCount();
|
int count = addr.getIntroducerCount();
|
||||||
|
if (count <= 0)
|
||||||
|
return null;
|
||||||
|
int index = _context.random().nextInt(count);
|
||||||
InetAddress iaddr = addr.getIntroducerHost(index);
|
InetAddress iaddr = addr.getIntroducerHost(index);
|
||||||
int iport = addr.getIntroducerPort(index);
|
int iport = addr.getIntroducerPort(index);
|
||||||
byte ikey[] = addr.getIntroducerKey(index);
|
byte ikey[] = addr.getIntroducerKey(index);
|
||||||
long tag = addr.getIntroducerTag(index);
|
long tag = addr.getIntroducerTag(index);
|
||||||
|
if ( (ikey == null) || (iport <= 0) || (iaddr == null) || (tag <= 0) ) {
|
||||||
|
if (_log.shouldLog(_log.ERROR))
|
||||||
|
_log.error("Cannot build a relay request to " + state.getRemoteIdentity().calculateHash().toBase64()
|
||||||
|
+ ", as their UDP address is invalid: addr=" + addr + " index=" + index);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
return buildRelayRequest(iaddr, iport, ikey, tag, ourIntroKey, state.getIntroNonce(), true);
|
return buildRelayRequest(iaddr, iport, ikey, tag, ourIntroKey, state.getIntroNonce(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -422,7 +422,7 @@ class PeerTestManager {
|
|||||||
aliceIP = InetAddress.getByAddress(from.getIP());
|
aliceIP = InetAddress.getByAddress(from.getIP());
|
||||||
aliceIntroKey = new SessionKey(new byte[SessionKey.KEYSIZE_BYTES]);
|
aliceIntroKey = new SessionKey(new byte[SessionKey.KEYSIZE_BYTES]);
|
||||||
testInfo.readIntroKey(aliceIntroKey.getData(), 0);
|
testInfo.readIntroKey(aliceIntroKey.getData(), 0);
|
||||||
|
|
||||||
UDPAddress addr = new UDPAddress(charlieInfo.getTargetAddress(UDPTransport.STYLE));
|
UDPAddress addr = new UDPAddress(charlieInfo.getTargetAddress(UDPTransport.STYLE));
|
||||||
SessionKey charlieIntroKey = new SessionKey(addr.getIntroKey());
|
SessionKey charlieIntroKey = new SessionKey(addr.getIntroKey());
|
||||||
|
|
||||||
|
@ -61,6 +61,7 @@ public class UDPAddress {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void parse(RouterAddress addr) {
|
private void parse(RouterAddress addr) {
|
||||||
|
if (addr == null) return;
|
||||||
Properties opts = addr.getOptions();
|
Properties opts = addr.getOptions();
|
||||||
_host = opts.getProperty(PROP_HOST);
|
_host = opts.getProperty(PROP_HOST);
|
||||||
if (_host != null) _host = _host.trim();
|
if (_host != null) _host = _host.trim();
|
||||||
|
@ -1173,7 +1173,12 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
|
|||||||
PeerState peer = (PeerState)peers.get(i);
|
PeerState peer = (PeerState)peers.get(i);
|
||||||
if ( (dontInclude != null) && (dontInclude.equals(peer.getRemoteHostId())) )
|
if ( (dontInclude != null) && (dontInclude.equals(peer.getRemoteHostId())) )
|
||||||
continue;
|
continue;
|
||||||
return peer;
|
RouterInfo peerInfo = _context.netDb().lookupRouterInfoLocally(peer.getRemotePeer());
|
||||||
|
if (peerInfo == null)
|
||||||
|
continue;
|
||||||
|
RouterAddress addr = peerInfo.getTargetAddress(STYLE);
|
||||||
|
if (addr != null)
|
||||||
|
return peer;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -90,6 +90,8 @@ public class FragmentHandler {
|
|||||||
}
|
}
|
||||||
offset = off;
|
offset = off;
|
||||||
}
|
}
|
||||||
|
} catch (ArrayIndexOutOfBoundsException aioobe) {
|
||||||
|
_context.statManager().addRateData("tunnel.corruptMessage", 1, 1);
|
||||||
} catch (RuntimeException e) {
|
} catch (RuntimeException e) {
|
||||||
if (_log.shouldLog(Log.ERROR))
|
if (_log.shouldLog(Log.ERROR))
|
||||||
_log.error("Corrupt fragment received: offset = " + offset, e);
|
_log.error("Corrupt fragment received: offset = " + offset, e);
|
||||||
@ -216,17 +218,23 @@ public class FragmentHandler {
|
|||||||
long messageId = -1;
|
long messageId = -1;
|
||||||
|
|
||||||
if (type == TYPE_TUNNEL) {
|
if (type == TYPE_TUNNEL) {
|
||||||
|
if (offset + 4 >= preprocessed.length)
|
||||||
|
return -1;
|
||||||
long id = DataHelper.fromLong(preprocessed, offset, 4);
|
long id = DataHelper.fromLong(preprocessed, offset, 4);
|
||||||
tunnelId = new TunnelId(id);
|
tunnelId = new TunnelId(id);
|
||||||
offset += 4;
|
offset += 4;
|
||||||
}
|
}
|
||||||
if ( (type == TYPE_ROUTER) || (type == TYPE_TUNNEL) ) {
|
if ( (type == TYPE_ROUTER) || (type == TYPE_TUNNEL) ) {
|
||||||
byte h[] = new byte[Hash.HASH_LENGTH];
|
byte h[] = new byte[Hash.HASH_LENGTH];
|
||||||
|
if (offset + Hash.HASH_LENGTH >= preprocessed.length)
|
||||||
|
return -1;
|
||||||
System.arraycopy(preprocessed, offset, h, 0, Hash.HASH_LENGTH);
|
System.arraycopy(preprocessed, offset, h, 0, Hash.HASH_LENGTH);
|
||||||
router = new Hash(h);
|
router = new Hash(h);
|
||||||
offset += Hash.HASH_LENGTH;
|
offset += Hash.HASH_LENGTH;
|
||||||
}
|
}
|
||||||
if (fragmented) {
|
if (fragmented) {
|
||||||
|
if (offset + 4 >= preprocessed.length)
|
||||||
|
return -1;
|
||||||
messageId = DataHelper.fromLong(preprocessed, offset, 4);
|
messageId = DataHelper.fromLong(preprocessed, offset, 4);
|
||||||
if (_log.shouldLog(Log.DEBUG))
|
if (_log.shouldLog(Log.DEBUG))
|
||||||
_log.debug("reading messageId " + messageId + " at offset "+ offset
|
_log.debug("reading messageId " + messageId + " at offset "+ offset
|
||||||
@ -241,6 +249,8 @@ public class FragmentHandler {
|
|||||||
offset += extendedSize; // we don't interpret these yet, but skip them for now
|
offset += extendedSize; // we don't interpret these yet, but skip them for now
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (offset + 2 >= preprocessed.length)
|
||||||
|
return -1;
|
||||||
int size = (int)DataHelper.fromLong(preprocessed, offset, 2);
|
int size = (int)DataHelper.fromLong(preprocessed, offset, 2);
|
||||||
offset += 2;
|
offset += 2;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user