I2P Address: [http://git.idk.i2p]

Skip to content
Snippets Groups Projects
Commit 8633ef95 authored by zzz's avatar zzz
Browse files

* Streaming: Don't send a RST to an hour/day limited peer,

    or blacklisted, or non-whitelisted, to not waste outbound bandwidth
parent 46664544
No related branches found
No related tags found
No related merge requests found
...@@ -38,7 +38,9 @@ class ConnThrottler { ...@@ -38,7 +38,9 @@ class ConnThrottler {
SimpleScheduler.getInstance().addPeriodicEvent(new Cleaner(), period); SimpleScheduler.getInstance().addPeriodicEvent(new Cleaner(), period);
} }
/** increments before checking */ /**
* Checks both individual and total. Increments before checking.
*/
boolean shouldThrottle(Hash h) { boolean shouldThrottle(Hash h) {
if (_totalMax > 0 && _currentTotal.incrementAndGet() > _totalMax) if (_totalMax > 0 && _currentTotal.incrementAndGet() > _totalMax)
return true; return true;
...@@ -47,6 +49,16 @@ class ConnThrottler { ...@@ -47,6 +49,16 @@ class ConnThrottler {
return false; return false;
} }
/**
* Checks individual count only. Does not increment.
* @since 0.9.3
*/
boolean isThrottled(Hash h) {
if (_max > 0)
return this.counter.count(h) > _max;
return false;
}
private class Cleaner implements SimpleTimer.TimedEvent { private class Cleaner implements SimpleTimer.TimedEvent {
public void timeReached() { public void timeReached() {
if (_totalMax > 0) if (_totalMax > 0)
......
...@@ -202,7 +202,26 @@ class ConnectionManager { ...@@ -202,7 +202,26 @@ class ConnectionManager {
_context.statManager().addRateData("stream.receiveActive", active, total); _context.statManager().addRateData("stream.receiveActive", active, total);
if (reject) { if (reject) {
PacketLocal reply = new PacketLocal(_context, synPacket.getOptionalFrom()); Destination from = synPacket.getOptionalFrom();
if (from == null)
return null;
if (_dayThrottler != null || _hourThrottler != null) {
Hash h = from.calculateHash();
if ((_hourThrottler != null && _hourThrottler.isThrottled(h)) ||
(_dayThrottler != null && _dayThrottler.isThrottled(h)) ||
(_defaultOptions.isAccessListEnabled() && !_defaultOptions.getAccessList().contains(h)) ||
(_defaultOptions.isBlacklistEnabled() && _defaultOptions.getBlacklist().contains(h))) {
// A signed RST packet + ElGamal + session tags is fairly expensive, so
// once the hour/day limit is hit for a particular peer, don't even send it.
// Ditto for blacklist / whitelist
// This is a tradeoff, because it will keep retransmitting the SYN for a while,
// thus more inbound, but let's not spend several KB on the outbound.
if (_log.shouldLog(Log.INFO))
_log.info("Dropping RST to " + h);
return null;
}
}
PacketLocal reply = new PacketLocal(_context, from);
reply.setFlag(Packet.FLAG_RESET); reply.setFlag(Packet.FLAG_RESET);
reply.setFlag(Packet.FLAG_SIGNATURE_INCLUDED); reply.setFlag(Packet.FLAG_SIGNATURE_INCLUDED);
reply.setAckThrough(synPacket.getSequenceNum()); reply.setAckThrough(synPacket.getSequenceNum());
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment