forked from I2P_Developers/i2p.i2p
- Hash IPv6 addresses in IPThrottler
- CSFI: Pass TransportManager instead of CSFI to GetBidsJob; remove unused methods - Add i2np.disable property for testing
This commit is contained in:
@ -44,6 +44,12 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
|
|||||||
private final GeoIP _geoIP;
|
private final GeoIP _geoIP;
|
||||||
private volatile boolean _netMonitorStatus;
|
private volatile boolean _netMonitorStatus;
|
||||||
private boolean _wasStarted;
|
private boolean _wasStarted;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable connections for testing
|
||||||
|
* @since IPv6
|
||||||
|
*/
|
||||||
|
private static final String PROP_DISABLED = "i2np.disable";
|
||||||
|
|
||||||
public CommSystemFacadeImpl(RouterContext context) {
|
public CommSystemFacadeImpl(RouterContext context) {
|
||||||
_context = context;
|
_context = context;
|
||||||
@ -124,23 +130,17 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
|
|||||||
return sum * 1000 / frameSize;
|
return sum * 1000 / frameSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<TransportBid> getBids(OutNetMessage msg) {
|
|
||||||
return _manager.getBids(msg);
|
|
||||||
}
|
|
||||||
public TransportBid getBid(OutNetMessage msg) {
|
|
||||||
return _manager.getBid(msg);
|
|
||||||
}
|
|
||||||
public TransportBid getNextBid(OutNetMessage msg) {
|
|
||||||
return _manager.getNextBid(msg);
|
|
||||||
}
|
|
||||||
int getTransportCount() { return _manager.getTransportCount(); }
|
|
||||||
|
|
||||||
/** Send the message out */
|
/** Send the message out */
|
||||||
public void processMessage(OutNetMessage msg) {
|
public void processMessage(OutNetMessage msg) {
|
||||||
|
if (isDummy()) {
|
||||||
|
// testing
|
||||||
|
GetBidsJob.fail(_context, msg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
//GetBidsJob j = new GetBidsJob(_context, this, msg);
|
//GetBidsJob j = new GetBidsJob(_context, this, msg);
|
||||||
//j.runJob();
|
//j.runJob();
|
||||||
//long before = _context.clock().now();
|
//long before = _context.clock().now();
|
||||||
GetBidsJob.getBids(_context, this, msg);
|
GetBidsJob.getBids(_context, _manager, msg);
|
||||||
// < 0.4 ms
|
// < 0.4 ms
|
||||||
//_context.statManager().addRateData("transport.getBidsJobTime", _context.clock().now() - before);
|
//_context.statManager().addRateData("transport.getBidsJobTime", _context.clock().now() - before);
|
||||||
}
|
}
|
||||||
@ -569,9 +569,14 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
|
|||||||
return buf.toString();
|
return buf.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @since 0.8.13 */
|
/**
|
||||||
|
* Is everything disabled for testing?
|
||||||
|
* @since 0.8.13
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean isDummy() { return false; }
|
public boolean isDummy() {
|
||||||
|
return _context.getBooleanProperty(PROP_DISABLED);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Translate
|
* Translate
|
||||||
|
@ -23,22 +23,25 @@ import net.i2p.util.Log;
|
|||||||
*/
|
*/
|
||||||
class GetBidsJob extends JobImpl {
|
class GetBidsJob extends JobImpl {
|
||||||
private final Log _log;
|
private final Log _log;
|
||||||
private final CommSystemFacadeImpl _facade;
|
private final TransportManager _tmgr;
|
||||||
private final OutNetMessage _msg;
|
private final OutNetMessage _msg;
|
||||||
|
|
||||||
public GetBidsJob(RouterContext ctx, CommSystemFacadeImpl facade, OutNetMessage msg) {
|
/**
|
||||||
|
* @deprecated unused, see static getBids()
|
||||||
|
*/
|
||||||
|
public GetBidsJob(RouterContext ctx, TransportManager tmgr, OutNetMessage msg) {
|
||||||
super(ctx);
|
super(ctx);
|
||||||
_log = ctx.logManager().getLog(GetBidsJob.class);
|
_log = ctx.logManager().getLog(GetBidsJob.class);
|
||||||
_facade = facade;
|
_tmgr = tmgr;
|
||||||
_msg = msg;
|
_msg = msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getName() { return "Fetch bids for a message to be delivered"; }
|
public String getName() { return "Fetch bids for a message to be delivered"; }
|
||||||
public void runJob() {
|
public void runJob() {
|
||||||
getBids(getContext(), _facade, _msg);
|
getBids(getContext(), _tmgr, _msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getBids(RouterContext context, CommSystemFacadeImpl facade, OutNetMessage msg) {
|
static void getBids(RouterContext context, TransportManager tmgr, OutNetMessage msg) {
|
||||||
Log log = context.logManager().getLog(GetBidsJob.class);
|
Log log = context.logManager().getLog(GetBidsJob.class);
|
||||||
Hash to = msg.getTarget().getIdentity().getHash();
|
Hash to = msg.getTarget().getIdentity().getHash();
|
||||||
msg.timestamp("bid");
|
msg.timestamp("bid");
|
||||||
@ -61,14 +64,14 @@ class GetBidsJob extends JobImpl {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
TransportBid bid = facade.getNextBid(msg);
|
TransportBid bid = tmgr.getNextBid(msg);
|
||||||
if (bid == null) {
|
if (bid == null) {
|
||||||
int failedCount = msg.getFailedTransports().size();
|
int failedCount = msg.getFailedTransports().size();
|
||||||
if (failedCount == 0) {
|
if (failedCount == 0) {
|
||||||
context.statManager().addRateData("transport.bidFailNoTransports", msg.getLifetime());
|
context.statManager().addRateData("transport.bidFailNoTransports", msg.getLifetime());
|
||||||
// This used to be "no common transports" but it is almost always no transports at all
|
// This used to be "no common transports" but it is almost always no transports at all
|
||||||
context.banlist().banlistRouter(to, _x("No transports (hidden or starting up?)"));
|
context.banlist().banlistRouter(to, _x("No transports (hidden or starting up?)"));
|
||||||
} else if (failedCount >= facade.getTransportCount()) {
|
} else if (failedCount >= tmgr.getTransportCount()) {
|
||||||
context.statManager().addRateData("transport.bidFailAllTransports", msg.getLifetime());
|
context.statManager().addRateData("transport.bidFailAllTransports", msg.getLifetime());
|
||||||
// fail after all transports were unsuccessful
|
// fail after all transports were unsuccessful
|
||||||
context.netDb().fail(to);
|
context.netDb().fail(to);
|
||||||
@ -82,7 +85,7 @@ class GetBidsJob extends JobImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static void fail(RouterContext context, OutNetMessage msg) {
|
static void fail(RouterContext context, OutNetMessage msg) {
|
||||||
if (msg.getOnFailedSendJob() != null) {
|
if (msg.getOnFailedSendJob() != null) {
|
||||||
context.jobQueue().addJob(msg.getOnFailedSendJob());
|
context.jobQueue().addJob(msg.getOnFailedSendJob());
|
||||||
}
|
}
|
||||||
|
@ -123,6 +123,9 @@ public abstract class TransportImpl implements Transport {
|
|||||||
|
|
||||||
/** Per-transport connection limit */
|
/** Per-transport connection limit */
|
||||||
public int getMaxConnections() {
|
public int getMaxConnections() {
|
||||||
|
if (_context.commSystem().isDummy())
|
||||||
|
// testing
|
||||||
|
return 0;
|
||||||
String style = getStyle();
|
String style = getStyle();
|
||||||
// object churn
|
// object churn
|
||||||
String maxProp;
|
String maxProp;
|
||||||
|
@ -3,6 +3,7 @@ package net.i2p.router.transport.udp;
|
|||||||
import net.i2p.util.ObjectCounter;
|
import net.i2p.util.ObjectCounter;
|
||||||
import net.i2p.util.SimpleScheduler;
|
import net.i2p.util.SimpleScheduler;
|
||||||
import net.i2p.util.SimpleTimer;
|
import net.i2p.util.SimpleTimer;
|
||||||
|
import net.i2p.util.SipHash;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Count IPs
|
* Count IPs
|
||||||
@ -21,12 +22,16 @@ class IPThrottler {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Increments before checking
|
* Increments before checking
|
||||||
* @return true if ip.length != 4
|
|
||||||
*/
|
*/
|
||||||
public boolean shouldThrottle(byte[] ip) {
|
public boolean shouldThrottle(byte[] ip) {
|
||||||
if (ip.length != 4)
|
// for IPv4 we simply use the IP;
|
||||||
return true;
|
// for IPv6 we use a secure hash as an attacker could select the lower bytes
|
||||||
return _counter.increment(toInt(ip)) > _max;
|
Integer key;
|
||||||
|
if (ip.length == 4)
|
||||||
|
key = toInt(ip);
|
||||||
|
else
|
||||||
|
key = Integer.valueOf(SipHash.hashCode(ip));
|
||||||
|
return _counter.increment(key) > _max;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Integer toInt(byte ip[]) {
|
private static Integer toInt(byte ip[]) {
|
||||||
|
@ -253,7 +253,10 @@ class UDPReceiver {
|
|||||||
// DatagramSocket javadocs: If the message is longer than the packet's length, the message is truncated.
|
// DatagramSocket javadocs: If the message is longer than the packet's length, the message is truncated.
|
||||||
throw new IOException("packet too large! truncated and dropped from: " + packet.getRemoteHost());
|
throw new IOException("packet too large! truncated and dropped from: " + packet.getRemoteHost());
|
||||||
}
|
}
|
||||||
if (size > 0) {
|
if (_context.commSystem().isDummy()) {
|
||||||
|
// testing
|
||||||
|
packet.release();
|
||||||
|
} else if (size > 0) {
|
||||||
//FIFOBandwidthLimiter.Request req = _context.bandwidthLimiter().requestInbound(size, "UDP receiver");
|
//FIFOBandwidthLimiter.Request req = _context.bandwidthLimiter().requestInbound(size, "UDP receiver");
|
||||||
//_context.bandwidthLimiter().requestInbound(req, size, "UDP receiver");
|
//_context.bandwidthLimiter().requestInbound(req, size, "UDP receiver");
|
||||||
FIFOBandwidthLimiter.Request req =
|
FIFOBandwidthLimiter.Request req =
|
||||||
|
@ -179,6 +179,12 @@ class UDPSender {
|
|||||||
_log.error("Dropping large UDP packet " + psz + " bytes: " + packet);
|
_log.error("Dropping large UDP packet " + psz + " bytes: " + packet);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (_context.commSystem().isDummy()) {
|
||||||
|
// testing
|
||||||
|
// back to the cache
|
||||||
|
packet.release();
|
||||||
|
return;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
_outboundQueue.put(packet);
|
_outboundQueue.put(packet);
|
||||||
} catch (InterruptedException ie) {
|
} catch (InterruptedException ie) {
|
||||||
|
Reference in New Issue
Block a user