* Streaming: New option i2p.streaming.answerPings (default true)
This commit is contained in:
@ -284,6 +284,8 @@ public class ConnectionManager {
|
||||
// exporting non-public type through public API, this is a potential bug.
|
||||
public ConnectionHandler getConnectionHandler() { return _connectionHandler; }
|
||||
public PacketQueue getPacketQueue() { return _outboundQueue; }
|
||||
/** do we respond to pings that aren't on an existing connection? */
|
||||
public boolean answerPings() { return _defaultOptions.getAnswerPings(); }
|
||||
|
||||
/**
|
||||
* Something b0rked hard, so kill all of our connections without mercy.
|
||||
|
@ -9,6 +9,7 @@ import java.util.Properties;
|
||||
public class ConnectionOptions extends I2PSocketOptionsImpl {
|
||||
private int _connectDelay;
|
||||
private boolean _fullySigned;
|
||||
private boolean _answerPings;
|
||||
private volatile int _windowSize;
|
||||
private int _receiveWindow;
|
||||
private int _profile;
|
||||
@ -51,12 +52,15 @@ public class ConnectionOptions extends I2PSocketOptionsImpl {
|
||||
public static final String PROP_MAX_WINDOW_SIZE = "i2p.streaming.maxWindowSize";
|
||||
public static final String PROP_CONGESTION_AVOIDANCE_GROWTH_RATE_FACTOR = "i2p.streaming.congestionAvoidanceGrowthRateFactor";
|
||||
public static final String PROP_SLOW_START_GROWTH_RATE_FACTOR = "i2p.streaming.slowStartGrowthRateFactor";
|
||||
public static final String PROP_ANSWER_PINGS = "i2p.streaming.answerPings";
|
||||
|
||||
private static final int TREND_COUNT = 3;
|
||||
static final int INITIAL_WINDOW_SIZE = 6;
|
||||
static final int DEFAULT_MAX_SENDS = 8;
|
||||
public static final int DEFAULT_INITIAL_RTT = 8*1000;
|
||||
static final int MIN_WINDOW_SIZE = 1;
|
||||
private static final boolean DEFAULT_ANSWER_PINGS = true;
|
||||
|
||||
// Syncronization fix, but doing it this way causes NPE...
|
||||
// private final int _trend[] = new int[TREND_COUNT];
|
||||
private int _trend[];
|
||||
@ -198,6 +202,7 @@ public class ConnectionOptions extends I2PSocketOptionsImpl {
|
||||
setSlowStartGrowthRateFactor(opts.getSlowStartGrowthRateFactor());
|
||||
setWriteTimeout(opts.getWriteTimeout());
|
||||
setReadTimeout(opts.getReadTimeout());
|
||||
setAnswerPings(opts.getAnswerPings());
|
||||
}
|
||||
}
|
||||
|
||||
@ -221,8 +226,8 @@ public class ConnectionOptions extends I2PSocketOptionsImpl {
|
||||
setInboundBufferSize(getMaxMessageSize() * (Connection.MAX_WINDOW_SIZE + 2));
|
||||
setCongestionAvoidanceGrowthRateFactor(getInt(opts, PROP_CONGESTION_AVOIDANCE_GROWTH_RATE_FACTOR, 1));
|
||||
setSlowStartGrowthRateFactor(getInt(opts, PROP_SLOW_START_GROWTH_RATE_FACTOR, 1));
|
||||
|
||||
setConnectTimeout(getInt(opts, PROP_CONNECT_TIMEOUT, Connection.DISCONNECT_TIMEOUT));
|
||||
setAnswerPings(getBool(opts, PROP_ANSWER_PINGS, DEFAULT_ANSWER_PINGS));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -260,9 +265,10 @@ public class ConnectionOptions extends I2PSocketOptionsImpl {
|
||||
setCongestionAvoidanceGrowthRateFactor(getInt(opts, PROP_CONGESTION_AVOIDANCE_GROWTH_RATE_FACTOR, 2));
|
||||
if (opts.contains(PROP_SLOW_START_GROWTH_RATE_FACTOR))
|
||||
setSlowStartGrowthRateFactor(getInt(opts, PROP_SLOW_START_GROWTH_RATE_FACTOR, 2));
|
||||
|
||||
if (opts.containsKey(PROP_CONNECT_TIMEOUT))
|
||||
setConnectTimeout(getInt(opts, PROP_CONNECT_TIMEOUT, Connection.DISCONNECT_TIMEOUT));
|
||||
if (opts.containsKey(PROP_ANSWER_PINGS))
|
||||
setAnswerPings(getBool(opts, PROP_ANSWER_PINGS, DEFAULT_ANSWER_PINGS));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -282,11 +288,22 @@ public class ConnectionOptions extends I2PSocketOptionsImpl {
|
||||
* or can we deal with signatures on the SYN and FIN packets
|
||||
* only?
|
||||
*
|
||||
* There is no property name defined for this, so it's safe to
|
||||
* say this is unused and always false.
|
||||
*
|
||||
* @return if we want signatures on all packets.
|
||||
*/
|
||||
public boolean getRequireFullySigned() { return _fullySigned; }
|
||||
public void setRequireFullySigned(boolean sign) { _fullySigned = sign; }
|
||||
|
||||
/**
|
||||
* Do we respond to a ping?
|
||||
*
|
||||
* @return if we do
|
||||
*/
|
||||
public boolean getAnswerPings() { return _answerPings; }
|
||||
public void setAnswerPings(boolean yes) { _answerPings = yes; }
|
||||
|
||||
/**
|
||||
* How many messages will we send before waiting for an ACK?
|
||||
*
|
||||
@ -492,6 +509,13 @@ public class ConnectionOptions extends I2PSocketOptionsImpl {
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
private static boolean getBool(Properties opts, String name, boolean defaultVal) {
|
||||
if (opts == null) return defaultVal;
|
||||
String val = opts.getProperty(name);
|
||||
if (val == null) return defaultVal;
|
||||
return Boolean.valueOf(val).booleanValue();
|
||||
}
|
||||
|
||||
public static void main(String args[]) {
|
||||
Properties p = new Properties();
|
||||
|
||||
|
@ -129,7 +129,10 @@ public class PacketHandler {
|
||||
private void receiveKnownCon(Connection con, Packet packet) {
|
||||
if (packet.isFlagSet(Packet.FLAG_ECHO)) {
|
||||
if (packet.getSendStreamId() > 0) {
|
||||
receivePing(packet);
|
||||
if (con.getOptions().getAnswerPings())
|
||||
receivePing(packet);
|
||||
else if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Dropping Echo packet on existing con: " + packet);
|
||||
} else if (packet.getReceiveStreamId() > 0) {
|
||||
receivePong(packet);
|
||||
} else {
|
||||
@ -230,7 +233,10 @@ public class PacketHandler {
|
||||
private void receiveUnknownCon(Packet packet, long sendId, boolean queueIfNoConn) {
|
||||
if (packet.isFlagSet(Packet.FLAG_ECHO)) {
|
||||
if (packet.getSendStreamId() > 0) {
|
||||
receivePing(packet);
|
||||
if (_manager.answerPings())
|
||||
receivePing(packet);
|
||||
else if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Dropping Echo packet on unknown con: " + packet);
|
||||
} else if (packet.getReceiveStreamId() > 0) {
|
||||
receivePong(packet);
|
||||
} else {
|
||||
|
Reference in New Issue
Block a user