Compare commits

...

5 Commits

Author SHA1 Message Date
zzz
0328304f04 dont specify i2p.i2p branch so we can release from a different branch 2013-08-10 16:23:23 +00:00
zzz
06d2db0046 0.9.7.1 2013-08-10 16:00:46 +00:00
zzz
170be8f033 Extend IB tunnel expiration
applied changes from 2f2fc980d396aa295ce972afc4298e8f2e763fea
             through c2bc3b29484ec8a689c72f2ab4e823a2a72f6430

New update hosts, thx Meeh and dg
2013-08-08 22:13:38 +00:00
zzz
ca0bb1ab76 Plucks from trunk for 0.9.7.1:
Streaming RTO changes:
 apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java
 apps/streaming/java/src/net/i2p/client/streaming/TCBShare.java
 apps/ministreaming/java/src/net/i2p/client/streaming/I2PSocketOptionsImpl.java

new reseed:
 applied changes from dbfea0ca35dbf9df85b5703db6f97a9579beb364
             through 325a9ed6f0f47eeabb33710073edf973671c63c9

disable RI verifies:
 applied changes from 4ef48b93946923e3371ab62719a474d869520697
             through a77990850b3534101571c88db4704676645914df

i2prouter bashism fix:
 applied changes from b5a0148f96728466561ece9be0e50ac9ad3f1468
             through e301d0499f4c688ed3a5febe30bf8098c7f2cdf9

i2psnark increase max piece size, mime type updates:
 apps/i2psnark/java/src/org/klomp/snark/Storage.java
 apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
 apps/i2psnark/mime.properties

UPnP fix:
 applied changes from 3d4a5cd3d933f75fdff7696f560c569f4674bd73
             through 75e5f5d4e0f0dd44140908bb6e73830e3448bdde
2013-08-08 12:07:16 +00:00
zzz
cdccb51456 * Start of 0.9.7.1 branch
* i2psnark: Increase update-via-torrent to 30%
2013-08-07 17:36:55 +00:00
20 changed files with 230 additions and 57 deletions

View File

@@ -78,8 +78,8 @@ public class Storage
/** The default piece size. */
private static final int DEFAULT_PIECE_SIZE = 256*1024;
/** note that we start reducing max number of peer connections above 1MB */
public static final int MAX_PIECE_SIZE = 2*1024*1024;
/** bigger than this will be rejected */
public static final int MAX_PIECE_SIZE = 4*1024*1024;
/** The maximum number of pieces in a torrent. */
public static final int MAX_PIECES = 10*1024;
public static final long MAX_TOTAL_SIZE = MAX_PIECE_SIZE * (long) MAX_PIECES;

View File

@@ -1542,7 +1542,7 @@ public class I2PSnarkServlet extends BasicServlet {
float pct;
if (isValid) {
pct = (float) (100.0 * peer.completed() / meta.getPieces());
if (pct == 100.0)
if (pct >= 100.0)
out.write(_("Seed"));
else {
String ps = String.valueOf(pct);
@@ -2644,7 +2644,8 @@ public class I2PSnarkServlet extends BasicServlet {
icon = "html";
else if (mime.equals("text/plain") ||
mime.equals("application/rtf") ||
mime.equals("application/epub+zip"))
mime.equals("application/epub+zip") ||
mime.equals("application/x-mobipocket-ebook"))
icon = "page";
else if (mime.equals("application/java-archive") ||
plc.endsWith(".deb"))

View File

@@ -8,6 +8,7 @@ iso = application/x-iso9660-image
m4a = audio/mp4a-latm
m4v = video/x-m4v
mkv = video/x-matroska
mobi = application/x-mobipocket-ebook
mp4 = video/mp4
mpc = audio/x-musepack
nfo = text/plain
@@ -19,5 +20,6 @@ su2 = application/zip
sud = application/zip
txt = text/plain
war = application/java-archive
webm = video/webm
wma = audio/x-ms-wma
wmv = video/x-ms-wmv

View File

@@ -93,6 +93,20 @@ class I2PSocketOptionsImpl implements I2PSocketOptions {
}
}
protected static double getDouble(Properties opts, String name, double defaultVal) {
if (opts == null) return defaultVal;
String val = opts.getProperty(name);
if (val == null) {
return defaultVal;
} else {
try {
return Double.parseDouble(val);
} catch (NumberFormatException nfe) {
return defaultVal;
}
}
}
/**
* How long we will wait for the ACK from a SYN, in milliseconds.
*

View File

@@ -567,8 +567,9 @@ public class ConsoleUpdateManager implements UpdateManager {
// For 0.9.4 update, only for dev builds
// For 0.9.5 update, only for dev builds and 1% more
// For 0.9.6 update, only for dev builds and 3% more
// Remove this in 0.9.6 or 0.9.7
if (method == TORRENT && RouterVersion.BUILD == 0 && _context.random().nextInt(100) > 2) {
// For 0.9.8 update, only for dev builds and 30% more
// Remove this for 100%
if (method == TORRENT && RouterVersion.BUILD == 0 && _context.random().nextInt(100) > 29) {
if (_log.shouldLog(Log.WARN))
_log.warn("Ignoring torrent registration");
return;

View File

@@ -58,16 +58,20 @@ public class ConfigUpdateHandler extends FormHandler {
private static final String PACK200_URLS =
"http://echelon.i2p/i2p/i2pupdate.su2\r\n" +
"http://inr.i2p/i2p/i2pupdate.su2\r\n" +
"http://meeh.i2p/i2pupdate/i2pupdate.su2\r\n" +
"http://stats.i2p/i2p/i2pupdate.su2\r\n" +
"http://www.i2p2.i2p/_static/i2pupdate.su2\r\n" +
"http://update.dg.i2p/files/i2pupdate.su2\r\n" +
"http://update.killyourtv.i2p/i2pupdate.su2\r\n" +
"http://update.postman.i2p/i2pupdate.su2" ;
private static final String NO_PACK200_URLS =
"http://echelon.i2p/i2p/i2pupdate.sud\r\n" +
"http://inr.i2p/i2p/i2pupdate.sud\r\n" +
"http://meeh.i2p/i2pupdate/i2pupdate.sud\r\n" +
"http://stats.i2p/i2p/i2pupdate.sud\r\n" +
"http://www.i2p2.i2p/_static/i2pupdate.sud\r\n" +
"http://update.dg.i2p/files/i2pupdate.sud\r\n" +
"http://update.killyourtv.i2p/i2pupdate.sud\r\n" +
"http://update.postman.i2p/i2pupdate.sud" ;

View File

@@ -27,7 +27,7 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
private int _profile;
private int _rtt;
private int _rttDev;
private int _rto;
private int _rto = INITIAL_RTO;
private int _resendDelay;
private int _sendAckDelay;
private int _maxMessageSize;
@@ -51,7 +51,17 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
private int _maxTotalConnsPerDay;
private int _maxConns;
private boolean _disableRejectLog;
/** state of a connection */
private enum AckInit {
INIT, // just created
FIRST, // first received ack
STEADY
}
/** LOCKING: this */
private AckInit _initState = AckInit.INIT;
// NOTE - almost all the options are below, but see
// I2PSocketOptions in ministreaming for a few more
@@ -65,11 +75,21 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
/** on inactivity timeout, send a payload message */
public static final int INACTIVITY_ACTION_SEND = 2;
/*
* These values are specified in RFC 6298
* Do not change unless you know what you're doing
*/
private static final double TCP_ALPHA = 1.0/8;
private static final double TCP_BETA = 1.0/4;
private static final double TCP_KAPPA = 4;
private static final String PROP_INITIAL_RTO = "i2p.streaming.initialRTO";
private static final int INITIAL_RTO = 9000;
public static final String PROP_CONNECT_DELAY = "i2p.streaming.connectDelay";
public static final String PROP_PROFILE = "i2p.streaming.profile";
public static final String PROP_MAX_MESSAGE_SIZE = "i2p.streaming.maxMessageSize";
public static final String PROP_MAX_RESENDS = "i2p.streaming.maxResends";
public static final String PROP_INITIAL_RTT = "i2p.streaming.initialRTT";
public static final String PROP_INITIAL_RESEND_DELAY = "i2p.streaming.initialResendDelay";
public static final String PROP_INITIAL_ACK_DELAY = "i2p.streaming.initialAckDelay";
public static final String PROP_INITIAL_WINDOW_SIZE = "i2p.streaming.initialWindowSize";
@@ -295,6 +315,7 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
setMaxWindowSize(opts.getMaxWindowSize());
setConnectDelay(opts.getConnectDelay());
setProfile(opts.getProfile());
setRTTDev(opts.getRTTDev());
setRTT(opts.getRTT());
setRequireFullySigned(opts.getRequireFullySigned());
setWindowSize(opts.getWindowSize());
@@ -332,7 +353,6 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
setConnectDelay(getInt(opts, PROP_CONNECT_DELAY, -1));
setProfile(getInt(opts, PROP_PROFILE, PROFILE_BULK));
setMaxMessageSize(getInt(opts, PROP_MAX_MESSAGE_SIZE, DEFAULT_MAX_MESSAGE_SIZE));
setRTT(getInt(opts, PROP_INITIAL_RTT, DEFAULT_INITIAL_RTT));
setReceiveWindow(getInt(opts, PROP_INITIAL_RECEIVE_WINDOW, 1));
setResendDelay(getInt(opts, PROP_INITIAL_RESEND_DELAY, 1000));
setSendAckDelay(getInt(opts, PROP_INITIAL_ACK_DELAY, DEFAULT_INITIAL_ACK_DELAY));
@@ -360,6 +380,8 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
_maxTotalConnsPerHour = getInt(opts, PROP_MAX_TOTAL_CONNS_HOUR, 0);
_maxTotalConnsPerDay = getInt(opts, PROP_MAX_TOTAL_CONNS_DAY, 0);
_maxConns = getInt(opts, PROP_MAX_STREAMS, 0);
_rto = getInt(opts, PROP_INITIAL_RTO, INITIAL_RTO);
}
/**
@@ -377,8 +399,6 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
setProfile(getInt(opts, PROP_PROFILE, PROFILE_BULK));
if (opts.containsKey(PROP_MAX_MESSAGE_SIZE))
setMaxMessageSize(getInt(opts, PROP_MAX_MESSAGE_SIZE, Packet.MAX_PAYLOAD_SIZE));
if (opts.containsKey(PROP_INITIAL_RTT))
setRTT(getInt(opts, PROP_INITIAL_RTT, DEFAULT_INITIAL_RTT));
if (opts.containsKey(PROP_INITIAL_RECEIVE_WINDOW))
setReceiveWindow(getInt(opts, PROP_INITIAL_RECEIVE_WINDOW, 1));
if (opts.containsKey(PROP_INITIAL_RESEND_DELAY))
@@ -427,6 +447,8 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
_maxTotalConnsPerDay = getInt(opts, PROP_MAX_TOTAL_CONNS_DAY, 0);
if (opts.containsKey(PROP_MAX_STREAMS))
_maxConns = getInt(opts, PROP_MAX_STREAMS, 0);
_rto = getInt(opts, PROP_INITIAL_RTO, INITIAL_RTO);
}
/**
@@ -515,12 +537,8 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
* What to set the round trip time estimate to (in milliseconds)
* @return round trip time estimate in ms
*/
public int getRTT() { return _rtt; }
public synchronized int getRTT() { return _rtt; }
public void setRTT(int ms) {
if (_rto == 0) {
_rttDev = ms / 2;
_rto = ms + ms / 2;
}
synchronized (_trend) {
_trend[0] = _trend[1];
_trend[1] = _trend[2];
@@ -532,15 +550,50 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
_trend[2] = 0;
}
_rtt = ms;
if (_rtt > 60*1000)
_rtt = 60*1000;
synchronized(this) {
_rtt = ms;
if (_rtt > 60*1000)
_rtt = 60*1000;
}
}
public int getRTO() { return _rto; }
public synchronized int getRTO() { return _rto; }
/** for debugging @since 0.7.13 */
int getRTTDev() { return _rttDev; }
/** used in TCB @since 0.9.8 */
synchronized int getRTTDev() { return _rttDev; }
private synchronized void setRTTDev(int rttDev) { _rttDev = rttDev; }
/**
* Loads options from TCB cache.
*/
synchronized void loadFromCache(int rtt, int rttDev, int wdw) {
_initState = AckInit.STEADY;
setRTT(rtt);
setRTTDev(rttDev);
setWindowSize(wdw);
computeRTO();
}
/**
* computes RTO based on formula in RFC
*/
private synchronized void computeRTO() {
switch(_initState) {
case INIT :
throw new IllegalStateException();
case FIRST :
_rto = _rtt + _rtt / 2;
break;
case STEADY :
_rto = _rtt + (int) (_rttDev * TCP_KAPPA);
break;
}
if (_rto < Connection.MIN_RESEND_DELAY)
_rto = (int)Connection.MIN_RESEND_DELAY;
else if (_rto > Connection.MAX_RESEND_DELAY)
_rto = (int)Connection.MAX_RESEND_DELAY;
}
/**
* If we have 3 consecutive rtt increases, we are trending upwards (1), or if we have
@@ -558,22 +611,22 @@ class ConnectionOptions extends I2PSocketOptionsImpl {
}
}
/** rtt = rtt*RTT_DAMPENING + (1-RTT_DAMPENING)*currentPacketRTT */
/** This is the value specified in RFC 2988, let's try it */
private static final double RTT_DAMPENING = 0.875;
public void updateRTT(int measuredValue) {
// the rttDev calculation matches that recommended in RFC 2988 (beta = 1/4)
_rttDev = _rttDev + (int)(0.25d*(Math.abs(measuredValue-_rtt)-_rttDev));
int smoothed = (int)(RTT_DAMPENING*_rtt + (1-RTT_DAMPENING)*measuredValue);
// K = 4
_rto = smoothed + (_rttDev<<2);
if (_rto < Connection.MIN_RESEND_DELAY)
_rto = (int)Connection.MIN_RESEND_DELAY;
else if (_rto > Connection.MAX_RESEND_DELAY)
_rto = (int)Connection.MAX_RESEND_DELAY;
setRTT(smoothed);
public synchronized void updateRTT(int measuredValue) {
switch(_initState) {
case INIT:
_initState = AckInit.FIRST;
setRTT(measuredValue); // no smoothing first sample
_rttDev = _rtt / 2;
break;
case FIRST:
_initState = AckInit.STEADY; // fall through
case STEADY:
// calculation matches that recommended in RFC 6298
_rttDev = (int) ((1-TCP_BETA) *_rttDev + TCP_BETA * Math.abs(measuredValue-_rtt));
int smoothed = (int)((1-TCP_ALPHA)*_rtt + TCP_ALPHA*measuredValue);
setRTT(smoothed);
}
computeRTO();
}
/** How long after sending a packet will we wait before resending?

View File

@@ -2,6 +2,7 @@ package net.i2p.client.streaming;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
import net.i2p.I2PAppContext;
@@ -9,6 +10,8 @@ import net.i2p.data.Destination;
import net.i2p.util.Log;
import net.i2p.util.SimpleTimer2;
import static net.i2p.client.streaming.I2PSocketOptionsImpl.getDouble;
/**
* Share important TCP Control Block parameters across Connections
* to the same remote peer.
@@ -25,20 +28,43 @@ class TCBShare {
private final Log _log;
private final Map<Destination, Entry> _cache;
private final CleanEvent _cleaner;
private final double _rttDampening, _wdwDampening, _rttDevDampening;
private static final long EXPIRE_TIME = 30*60*1000;
private static final long CLEAN_TIME = 10*60*1000;
///// constants defined in rfc 2140
///// do not change unless you know what you're doing
private static final double RTT_DAMPENING = 0.75;
private static final double RTTDEV_DAMPENING = 0.75;
private static final double WDW_DAMPENING = 0.75;
private static final String RTT_DAMP_PROP="i2p.streaming.tcbcache.rttDampening";
private static final String WDW_DAMP_PROP="i2p.streaming.tcbcache.wdwDampening";
private static final String RTTDEV_DAMP_PROP="i2p.streaming.tcbcache.rttdevDampening";
/////
private static final int MAX_RTT = ((int) Connection.MAX_RESEND_DELAY) / 2;
private static final int MAX_RTT_DEV = (int) (MAX_RTT * 1.5);
private static final int MAX_WINDOW_SIZE = ConnectionPacketHandler.MAX_SLOW_START_WINDOW;
public TCBShare(I2PAppContext ctx, SimpleTimer2 timer) {
_context = ctx;
_log = ctx.logManager().getLog(TCBShare.class);
final Properties props = ctx.getProperties();
_rttDampening = getDouble(props, RTT_DAMP_PROP, RTT_DAMPENING);
_wdwDampening = getDouble(props, WDW_DAMP_PROP, WDW_DAMPENING);
_rttDevDampening = getDouble(props, RTTDEV_DAMP_PROP, RTTDEV_DAMPENING);
_cache = new ConcurrentHashMap<Destination,Entry>(4);
_cleaner = new CleanEvent(timer);
_cleaner.schedule(CLEAN_TIME);
if (_log.shouldLog(Log.DEBUG)) {
String log = "Creating TCBCache with rttDamp=%s, rttDevDamp=%s, wdwDamp=%s, "+
"expire=%d, clean=%d";
log = String.format(log,_rttDampening,_rttDevDampening,_wdwDampening,
EXPIRE_TIME,CLEAN_TIME);
_log.debug(log);
}
}
/**
@@ -60,14 +86,22 @@ class TCBShare {
Entry e = _cache.get(dest);
if (e == null || e.isExpired())
return;
if (_log.shouldLog(Log.DEBUG))
final int rtt, rttDev, wdw;
synchronized(e) {
rtt = e.getRTT();
rttDev = e.getRTTDev();
wdw = e.getWindowSize();
}
if (_log.shouldLog(Log.DEBUG)) {
_log.debug("From cache: " +
con.getSession().getMyDestination().calculateHash().toBase64().substring(0, 4) +
'-' +
dest.calculateHash().toBase64().substring(0, 4) +
" RTT: " + e.getRTT() + " wdw: " + e.getWindowSize());
opts.setRTT(e.getRTT());
opts.setWindowSize(e.getWindowSize());
" RTT: " + rtt +
" RTTDev: "+ rttDev +
" wdw: " + wdw );
}
opts.loadFromCache(rtt,rttDev,wdw);
}
/** store to cache */
@@ -82,47 +116,61 @@ class TCBShare {
return;
int old = -1;
int oldw = -1;
int oldDev = -1;
Entry e = _cache.get(dest);
if (e == null || e.isExpired()) {
e = new Entry(opts.getRTT(), opts.getWindowSize());
e = new Entry(opts.getRTT(), opts.getWindowSize(), opts.getRTTDev());
_cache.put(dest, e);
} else {
synchronized(e) {
old = e.getRTT();
oldw = e.getWindowSize();
oldDev = e.getRTTDev();
e.setRTT(opts.getRTT());
e.setWindowSize(opts.getWindowSize());
e.setRTTDev(opts.getRTTDev());
}
}
if (_log.shouldLog(Log.DEBUG))
if (_log.shouldLog(Log.DEBUG)) {
_log.debug("To cache: " +
con.getSession().getMyDestination().calculateHash().toBase64().substring(0, 4) +
'-' +
dest.calculateHash().toBase64().substring(0, 4) +
" old: " + old + " con: " + opts.getRTT() + " new: " + e.getRTT() +
" oldDev: " + oldDev + " conDev: " + opts.getRTTDev() + " newDev: " + e.getRTTDev() +
" oldw: " + oldw + " conw: " + opts.getWindowSize() + " neww: " + e.getWindowSize());
}
}
private class Entry {
int _rtt;
int _wdw;
int _rttDev;
long _updated;
public Entry(int ms, int wdw) {
public Entry(int ms, int wdw, int rttDev) {
_rtt = ms;
_wdw = wdw;
_rttDev = rttDev;
_updated = _context.clock().now();
}
public synchronized int getRTT() { return _rtt; }
public synchronized void setRTT(int ms) {
_rtt = (int)(RTT_DAMPENING*_rtt + (1-RTT_DAMPENING)*ms);
_rtt = (int)(_rttDampening*_rtt + (1-_rttDampening)*ms);
if (_rtt > MAX_RTT)
_rtt = MAX_RTT;
_updated = _context.clock().now();
}
public synchronized int getRTTDev() { return _rttDev; }
public synchronized void setRTTDev(int count) {
_rttDev = (int)(_rttDevDampening*_rttDev + (1-_rttDevDampening)*count);
if (_rttDev > MAX_RTT_DEV)
_rttDev = MAX_RTT_DEV;
_updated = _context.clock().now();
}
public synchronized int getWindowSize() { return _wdw; }
public synchronized void setWindowSize(int wdw) {
_wdw = (int)(0.5 + WDW_DAMPENING*_wdw + (1-WDW_DAMPENING)*wdw);
_wdw = (int)(0.5 + _wdwDampening*_wdw + (1-_wdwDampening)*wdw);
if (_wdw > MAX_WINDOW_SIZE)
_wdw = MAX_WINDOW_SIZE;
_updated = _context.clock().now();

View File

@@ -1548,8 +1548,6 @@
<delete dir="../i2p-${release.number}" />
<exec executable="mtn" failonerror="true">
<arg value="co" />
<arg value="-b" />
<arg value="i2p.i2p" />
<!-- w: is the revision of the current workspace -->
<arg value="-r" />
<arg value="w:" />

View File

@@ -16,7 +16,7 @@ package net.i2p;
public class CoreVersion {
/** deprecated */
public final static String ID = "Monotone";
public final static String VERSION = "0.9.7";
public final static String VERSION = "0.9.7.1";
public static void main(String args[]) {
System.out.println("I2P Core version: " + VERSION);

View File

@@ -41,7 +41,7 @@ Debian wrapper.config to try to prevent confusion.
-# should have been replaced by the izpack installer.
-# If you did not run the installer, replace them with the appropriate paths.
-I2P="%INSTALL_PATH"
-if [ "`uname -s`" == "Darwin" ]; then
-if [ "`uname -s`" = "Darwin" ]; then
- if [ -d "%USER_HOME/Library/Application Support" ]; then
- I2P_CONFIG_DIR="%USER_HOME/Library/Application Support/i2p"
- else

View File

@@ -1,3 +1,17 @@
* 2013-08-10 0.9.7.1 released
2013-08-08 zzz
* New update hosts, thx Meeh and dg
* Updater: Increase update-via-torrent to 30%
* Plucks from trunk for 0.9.7.1:
- Disable RI verifies
- Extend IB tunnel expiration
- i2prouter: bashism fix
- i2psnark: increase max piece size, mime type updates
- New reseed host
- Streaming: RTO changes
- UPnP fix for some hardware
* 2013-07-15 0.9.7 released
2013-07-11 kytv

View File

@@ -4,7 +4,7 @@
<info>
<appname>i2p</appname>
<appversion>0.9.7</appversion>
<appversion>0.9.7.1</appversion>
<authors>
<author name="I2P" email="http://www.i2p2.de/"/>
</authors>

View File

@@ -0,0 +1,19 @@
-----BEGIN CERTIFICATE-----
MIIC/jCCAmegAwIBAgIJALLizEjOqx6kMA0GCSqGSIb3DQEBBQUAMF4xCzAJBgNV
BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
aWRnaXRzIFB0eSBMdGQxFzAVBgNVBAMTDnJlc2VlZC5wa29sLmRlMB4XDTEzMDcy
MjE3MjAwN1oXDTI0MDcwNDE3MjAwN1owXjELMAkGA1UEBhMCQVUxEzARBgNVBAgT
ClNvbWUtU3RhdGUxITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEX
MBUGA1UEAxMOcmVzZWVkLnBrb2wuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJ
AoGBAKcGetxR5BVrCjUe/sCvMfGiMoyhATjPGVdN+j5qxFdSOhbsC6KAhqL5GNyu
so8VKpHkIKaD5NeCAonUDLNXB+YOtR+YAHQRsKoR7ApQ5mwpNBsnbUthg1WK3Y/0
DrYsN7q7rzhLZ1eKm9qy09Ym2c8GnMy/4WpJzwVMji86+p9rAgMBAAGjgcMwgcAw
HQYDVR0OBBYEFIzPJdHcn4B0CbPOisqt/JLb+BQ/MIGQBgNVHSMEgYgwgYWAFIzP
JdHcn4B0CbPOisqt/JLb+BQ/oWKkYDBeMQswCQYDVQQGEwJBVTETMBEGA1UECBMK
U29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRcw
FQYDVQQDEw5yZXNlZWQucGtvbC5kZYIJALLizEjOqx6kMAwGA1UdEwQFMAMBAf8w
DQYJKoZIhvcNAQEFBQADgYEAMhy4JVAsTdmkcdxb3x1JNgD7ftWEPl5T2vKrRYCR
LD24FgLLdTGoXEB/NeH8qD3i5xwqc8h9oAvsFx5lp8DhcsZ0YMIuqmRDwmxAVOJ7
Ke3UR9Zu40ql7u8K4dXtjTyCi6J7twTY76JA/fAhTzgPJoGVBysVQCoW97ukY2jR
PGk=
-----END CERTIFICATE-----

View File

@@ -345,3 +345,5 @@ www.syndie.i2p=DvyDrcY8se2M~qqp4qfZn-6UTFfS2Ieaye5QIhKoFQGktMbCK2MzhAMYvNm7n1k9O
syndie-project.i2p=2~qacMy9FwwWCFm3JYRKSLIe8u6wEuinZPre0WoZC-M3IUSg8VhUp1QSPuaeFJdym69hjew6AOE-wnZ30mtzriXyvaYh7UNshTc9ZdEBWwhdn5cghMjf48HdBw3pKAiiw1gwv8WwsskbAxbSTkcQUmqGsterPyUqspSqddwUkcDxZHC7dUJsyyd4gcul40KljlIu9mMWXZLWQ7Zu8od~NcFNHVBE-UnTvDmHErpx7AWcN9VrD4j-OuVqsLYq1T9uhdLH-~H~9eE5RKekz6ehhGJRLlGB~2~MYVt4xrqbo4z18nFxdp9PorOO1wt5xiFSw4GEX5HAO2~pt97DVkcwogOEVCJbRbLiIJJDmehn5PB-56K4tjuUNFtzLAq7QQZEAAHGCUEaVPUObKS20vU~JN6GrAOAXKM2M-16frR0ddpJ4f55iuc~tVL3OFPAtha5aHP9xihP7i80rB5LsG0aT77Ey~mCWHrV2sQwhua40vP9TgpCi6Lg21DnVrR97S5tAAAA
lists.i2p2.i2p=iKMDu6cP~nt4vubwZOuXWDQS4zdhF9x2YjhcilOrRIHR7lkP6ErNgUHZb~ggwnRaPkj81JpmbwDJ1GR~LLS7DcN5ktSZ1WhjVfrm92AQ4-yDX5HEcPpCnTPBp11zsrh2WEDXSjWMqyBPbkYMzrJ33ZGxVMxccXLlV~W9ecPrpl7EmrIF1gPmbinG1oDA0wFLaJyXPZrCRhdX6xMDgvb0slHE0pxAM00TeAQK~aL~LZ5iwfA7WllYd9jaDdQ-kjaa6qEKSSQHf~bNycR~OFsxKurh1CIbrglo8vIHss-tjIfKzG2mgO8w8AE01uhlsRTxjq7TYhxTWKn4kTFyaljJCE-SL1XTYwfyEEZ90bH8Puk1zDnKIARXMPA1YM26StySLLoFyQu2SbNfJcgCqYFcGStvaG54QFCLVnHOxTKi-Z3D-PBMc9aRKSHJilN1kzExGKNZSW09wX7btyEUCHXJjbep6oFauwrtGmP9SjjZf-o3BHzvQlaLSzVFKuPJ-5tQAAAA
outproxy-tor.meeh.i2p=BcY6Gwk8927GdVB4hS5Gbb7CyYGp6o2do0L4pxLttbBh11tDuS~ExJnao99fl2e4lp596Ueje3z-xlEWKdo~6a7iDDE-x7XlkgkXs-~FJntgQV2c028a5W74U8SZZMdwOMcCsJoi3xYFMhcntRFW28nPMGFcZwYgww6AjPK7iREtBuiboB8Rm7ba~dcyA1Fouu03Y8UY0Dyy1ajApJNmJmHY5wDq2GisGB9OA2GHu-rrOp9iSczYaQJ5-BzhhostBRbHpp6Q-JeUlml1dUGZb1p-0teuqY9WvZEMv5Q9S3lxrN7jmXre5QaQOI9sn8tGJqKc8Dun62j7i6gtZA8IWonN9IacCA64x9sf9DmP1~PCKVXxnKygL818OvP-4CwJgQyUgJEiem~RguxWveZcBsTdedt1xk52cCBa1Yw87qOzO9rOHDWEHrp2qf~yZBEoKVnk4ElM8~G809QL0VJG6MKI2e0kmo5HYWIhZP7qK94M66Nn3tK7pEMpbo0SGazgAAAA
meeh.i2p=FA~-QarjN29hh0OzqmdwQV8HldxrjoOQUjKr6c4KQ3XZOjwiAbl7KqQgV1zGXMzWRzyZiKpM8fN0McGZnCK1C7yRguxjBcueGtxR8qT60RO7jTWaSvV5d9ocX0KFqd67U3uhHN95UphcWHm4G75l4om3GCQebNg9xJwbvjUQF~k0Trm5wrVl~XbND-~aIvVGRFappGKx4pfKSNxVJIjMACGG1UUszT4RTFDc6wN49Wujt9WRbFfC9UTTUsWO2waYRyZXaeRyfIRAkYq1jIhqL2Nq~2Gs1NaztwKp8olYv7jX5hxw~prFEKTNX93ZLaezU7YsEuEj-ez~gvoumJGMvyTZjSNQMTbTyCsGbqeEENgyhZkYdlQNqt9OAkp1-ZoFq0YhRGF9bt4EygoHL3DdeSCgummytv3w86M0To-g0S39i7twVPtLsxyoS076uiRADbFVgPfYHH6MBfjiBhxtjhL5eOEbcbgrSDBd6waqEuPdIPUndeEa8Qz-Rovept~kAAAA
update.dg.i2p=VF24ZkA7BpNnX5pjhhcqdQoopDX5JPLWRPidbAWXut8OMA4BGoCfGZo6hkT-WhHHOGi0OR89XqpZt6Pvf~KY-SahxNg8LD8FsWdLhaq~PXPi2H8ZGfEW7moEFm2sIlGbwQSWkFwQHmqRRvOs-YkuFFPeSRVMGzBkZGhT7~yJ9TjfpESJo~K4UEYZFp6l9BNj-kLeqEzXd4cCR8kYhubqvRGcdStNWyTPgIjZA~TffAQhR6RvLJovQbIaio8TXECFA1WE4rlX7FXlZt2DLGUhmZMEOisTS3-bH5axZID0461X8nEs~z-DuPl6CO7KFnxspWmA1gNk7Hdwcn4Jzy9bRg-2W4B2Dhh-k7wIi1lI-Tebbvpnx~cwoGjalpW95DomqcxQThQ7ffHtCIZw0GwM9ZJD-diB5zR~jDLCEr8VfiNpHuKzFb3z45QowTo4woXBU1wY0FV0cXYXrVjWz10v96bN3~v99Fp8yFJTbCNwsCf9sOl6ymqJj7l4j~xyxAouAAAA

View File

@@ -29,7 +29,7 @@
# should have been replaced by the izpack installer.
# If you did not run the installer, replace them with the appropriate paths.
I2P="%INSTALL_PATH"
if [ "`uname -s`" == "Darwin" ]; then
if [ "`uname -s`" = "Darwin" ]; then
if [ -d "%USER_HOME/Library/Application Support" ]; then
I2P_CONFIG_DIR="%USER_HOME/Library/Application Support/i2p"
else

View File

@@ -24,6 +24,8 @@ import net.i2p.util.Log;
class FloodfillStoreJob extends StoreJob {
private final FloodfillNetworkDatabaseFacade _facade;
private static final String PROP_RI_VERIFY = "router.verifyRouterInfoStore";
/**
* Send a data structure to the floodfills
*
@@ -64,6 +66,10 @@ class FloodfillStoreJob extends StoreJob {
// it finds something stamped with that time or newer.
DatabaseEntry data = _state.getData();
boolean isRouterInfo = data.getType() == DatabaseEntry.KEY_TYPE_ROUTERINFO;
// default false
if (isRouterInfo && !getContext().getBooleanProperty(PROP_RI_VERIFY))
return;
long published = data.getDate();
// we should always have exactly one successful entry

View File

@@ -69,6 +69,7 @@ public class Reseeder {
"http://193.150.121.66/netDb/" + "," +
"http://netdb.i2p2.no/" + "," +
"http://reseed.info/" + "," +
"http://reseed.pkol.de/" + "," +
"http://ieb9oopo.mooo.com";
// Temp disabled since h2ik have been AWOL since 06-03-2013
//"http://i2p.feared.eu/";
@@ -83,6 +84,7 @@ public class Reseeder {
"https://193.150.121.66/netDb/" + "," +
"https://netdb.i2p2.no/" + "," +
"https://reseed.info/" + "," +
"https://reseed.pkol.de/" + "," +
"https://ieb9oopo.mooo.com";
// Temp disabled since h2ik have been AWOL since 06-03-2013
//"https://i2p.feared.eu/";

View File

@@ -29,11 +29,15 @@ class ExpireJob extends JobImpl {
// others may be sending to the published lease expirations
// Also skew the inbound away from the outbound
long expire = cfg.getExpiration();
_dropAfter = expire + Router.CLOCK_FUDGE_FACTOR;
if (_pool.getSettings().isInbound())
if (_pool.getSettings().isInbound()) {
// wait extra long for IB so we don't drop msgs that
// got all the way to us.
_dropAfter = expire + (2 * Router.CLOCK_FUDGE_FACTOR);
expire -= IB_EARLY_EXPIRE + ctx.random().nextLong(IB_EARLY_EXPIRE);
else
} else {
_dropAfter = expire + Router.CLOCK_FUDGE_FACTOR;
expire -= OB_EARLY_EXPIRE + ctx.random().nextLong(OB_EARLY_EXPIRE);
}
// See comments in TunnelPool.locked_buildNewLeaseSet
cfg.setExpiration(expire);
getTiming().setStartAfter(expire);
@@ -45,6 +49,7 @@ class ExpireJob extends JobImpl {
public void runJob() {
if (!_leaseUpdated) {
// First run
_pool.removeTunnel(_cfg);
_leaseUpdated = true;
// noop for outbound
@@ -52,6 +57,7 @@ class ExpireJob extends JobImpl {
long timeToDrop = _dropAfter - getContext().clock().now();
requeue(timeToDrop);
} else {
// Second run
// already removed/refreshed, but now lets make it
// so we dont even honor the tunnel anymore
getContext().tunnelDispatcher().remove(_cfg);

View File

@@ -283,6 +283,9 @@ public class Device implements org.cybergarage.http.HTTPRequestListener, SearchL
}
urlString = HTTP.toRelativeURL(urlString);
// I2P fix for devices that return a base URL with trailing /
if (urlBaseStr.endsWith("/") && urlString.startsWith("/"))
urlString = urlString.substring(1);
String absUrl = urlBaseStr + urlString;
try {
URL url = new URL(absUrl);