forked from I2P_Developers/i2p.i2p
* SSU: Fixes for i2np.udp.allowLocal, log tweaks, sender/receiver thread name tweaks
* Limit tunnel GW pumper threads when testing
This commit is contained in:
@ -687,7 +687,8 @@ public abstract class TransportImpl implements Transport {
|
||||
else
|
||||
_wasUnreachableEntries.remove(peer);
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info(this.getStyle() + " setting wasUnreachable to " + yes + " for " + peer);
|
||||
_log.info(this.getStyle() + " setting wasUnreachable to " + yes + " for " + peer,
|
||||
yes ? new Exception() : null);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -249,7 +249,7 @@ class EstablishmentManager {
|
||||
maybeTo = new RemoteHostId(remAddr.getAddress(), port);
|
||||
|
||||
if ((!_transport.isValid(maybeTo.getIP())) ||
|
||||
Arrays.equals(maybeTo.getIP(), _transport.getExternalIP())) {
|
||||
(Arrays.equals(maybeTo.getIP(), _transport.getExternalIP()) && !_transport.allowLocal())) {
|
||||
_transport.failed(msg, "Remote peer's IP isn't valid");
|
||||
_transport.markUnreachable(toHash);
|
||||
//_context.banlist().banlistRouter(msg.getTarget().getIdentity().calculateHash(), "Invalid SSU address", UDPTransport.STYLE);
|
||||
|
@ -309,8 +309,8 @@ class OutboundMessageFragments {
|
||||
// use max of 1 second so finishMessages() and/or PeerState.finishMessages()
|
||||
// gets called regularly
|
||||
int toWait = Math.min(Math.max(nextSendDelay, 10), MAX_WAIT);
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("wait for " + toWait);
|
||||
//if (_log.shouldLog(Log.DEBUG))
|
||||
// _log.debug("wait for " + toWait);
|
||||
// wait.. or somethin'
|
||||
synchronized (_activePeers) {
|
||||
try {
|
||||
|
@ -6,6 +6,7 @@ import java.net.InetAddress;
|
||||
import java.net.Inet4Address;
|
||||
import java.net.Inet6Address;
|
||||
import java.net.SocketException;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import net.i2p.router.RouterContext;
|
||||
import net.i2p.util.Log;
|
||||
@ -24,6 +25,7 @@ class UDPEndpoint {
|
||||
private DatagramSocket _socket;
|
||||
private final InetAddress _bindAddress;
|
||||
private final boolean _isIPv4, _isIPv6;
|
||||
private static final AtomicInteger _counter = new AtomicInteger();
|
||||
|
||||
/**
|
||||
* @param transport may be null for unit testing ONLY
|
||||
@ -50,10 +52,11 @@ class UDPEndpoint {
|
||||
_log.log(Log.CRIT, "UDP Unable to open a port");
|
||||
throw new SocketException("SSU Unable to bind to a port on " + _bindAddress);
|
||||
}
|
||||
_sender = new UDPSender(_context, _socket, "UDPSender");
|
||||
int count = _counter.incrementAndGet();
|
||||
_sender = new UDPSender(_context, _socket, "UDPSender " + count);
|
||||
_sender.startup();
|
||||
if (_transport != null) {
|
||||
_receiver = new UDPReceiver(_context, _transport, _socket, "UDPReceiver");
|
||||
_receiver = new UDPReceiver(_context, _transport, _socket, "UDPReceiver " + count);
|
||||
_receiver.startup();
|
||||
}
|
||||
}
|
||||
|
@ -31,15 +31,12 @@ class UDPReceiver {
|
||||
private final Runner _runner;
|
||||
private final UDPTransport _transport;
|
||||
private final PacketHandler _handler;
|
||||
private static int __id;
|
||||
private final int _id;
|
||||
|
||||
private static final boolean _isAndroid = SystemVersion.isAndroid();
|
||||
|
||||
public UDPReceiver(RouterContext ctx, UDPTransport transport, DatagramSocket socket, String name) {
|
||||
_context = ctx;
|
||||
_log = ctx.logManager().getLog(UDPReceiver.class);
|
||||
_id = ++__id;
|
||||
_name = name;
|
||||
_socket = socket;
|
||||
_transport = transport;
|
||||
@ -57,7 +54,7 @@ class UDPReceiver {
|
||||
public synchronized void startup() {
|
||||
//adjustDropProbability();
|
||||
_keepRunning = true;
|
||||
I2PThread t = new I2PThread(_runner, _name + '.' + _id, true);
|
||||
I2PThread t = new I2PThread(_runner, _name, true);
|
||||
t.start();
|
||||
}
|
||||
|
||||
@ -154,7 +151,7 @@ class UDPReceiver {
|
||||
}
|
||||
|
||||
// drop anything apparently from our IP (any port)
|
||||
if (Arrays.equals(from.getIP(), _transport.getExternalIP())) {
|
||||
if (Arrays.equals(from.getIP(), _transport.getExternalIP()) && !_transport.allowLocal()) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Dropping (spoofed?) packet from ourselves");
|
||||
packet.release();
|
||||
|
@ -888,6 +888,15 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
|
||||
if (isPubliclyRoutable(addr) &&
|
||||
(addr.length != 16 || _haveIPv6Address))
|
||||
return true;
|
||||
return allowLocal();
|
||||
}
|
||||
|
||||
/**
|
||||
* Are we allowed to connect to local addresses?
|
||||
*
|
||||
* @since IPv6
|
||||
*/
|
||||
boolean allowLocal() {
|
||||
return _context.getBooleanProperty("i2np.udp.allowLocal");
|
||||
}
|
||||
|
||||
@ -1522,7 +1531,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
|
||||
int port = addr.getPort();
|
||||
if (ip == null || port < MIN_PEER_PORT ||
|
||||
(!isValid(ip)) ||
|
||||
Arrays.equals(ip, getExternalIP())) {
|
||||
(Arrays.equals(ip, getExternalIP()) && !allowLocal())) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@ -1960,6 +1969,9 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
|
||||
// dropPeer(msg.getPeer(), false);
|
||||
//else if (consecutive > 2 * MAX_CONSECUTIVE_FAILED) // they're sending us data, but we cant reply?
|
||||
// dropPeer(msg.getPeer(), false);
|
||||
} else {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("Failed sending " + msg + " to " + msg.getPeer());
|
||||
}
|
||||
noteSend(msg, false);
|
||||
if (m != null)
|
||||
|
@ -42,10 +42,14 @@ class TunnelGatewayPumper implements Runnable {
|
||||
_context = ctx;
|
||||
_wantsPumping = new LinkedHashSet(16);
|
||||
_backlogged = new HashSet(16);
|
||||
long maxMemory = Runtime.getRuntime().maxMemory();
|
||||
if (maxMemory == Long.MAX_VALUE)
|
||||
maxMemory = 96*1024*1024l;
|
||||
_pumpers = (int) Math.max(MIN_PUMPERS, Math.min(MAX_PUMPERS, 1 + (maxMemory / (32*1024*1024))));
|
||||
if (ctx.getBooleanProperty("i2p.dummyTunnelManager")) {
|
||||
_pumpers = 1;
|
||||
} else {
|
||||
long maxMemory = Runtime.getRuntime().maxMemory();
|
||||
if (maxMemory == Long.MAX_VALUE)
|
||||
maxMemory = 96*1024*1024l;
|
||||
_pumpers = (int) Math.max(MIN_PUMPERS, Math.min(MAX_PUMPERS, 1 + (maxMemory / (32*1024*1024))));
|
||||
}
|
||||
for (int i = 0; i < _pumpers; i++)
|
||||
new I2PThread(this, "Tunnel GW pumper " + (i+1) + '/' + _pumpers, true).start();
|
||||
}
|
||||
|
@ -234,7 +234,7 @@ public class SSUDemo {
|
||||
// we know its a FooMessage, since thats the type of message that the handler
|
||||
// is registered as
|
||||
FooMessage m = (FooMessage)_msg;
|
||||
System.out.println("RECV: " + Base64.encode(m.getData()) + " from " + _from);
|
||||
System.out.println("RECV FooMessage: " + Base64.encode(m.getData()) + " from " + _from);
|
||||
}
|
||||
public String getName() { return "Handle Foo message"; }
|
||||
}
|
||||
@ -301,6 +301,7 @@ public class SSUDemo {
|
||||
// we know its a DatabaseStoreMessage, since thats the type of message that the handler
|
||||
// is registered as
|
||||
DatabaseStoreMessage m = (DatabaseStoreMessage)_msg;
|
||||
System.out.println("RECV: " + m);
|
||||
try {
|
||||
_us.netDb().store(m.getKey(), (RouterInfo) m.getEntry());
|
||||
} catch (IllegalArgumentException iae) {
|
||||
|
Reference in New Issue
Block a user