forked from I2P_Developers/i2p.i2p
propagate from branch 'i2p.i2p' (head 6fddab77462a92759305edee8fe5a944d6865375)
to branch 'i2p.i2p.zzz.test' (head 45a25185236e38606e761060427ee8fa60144a8c)
This commit is contained in:
@@ -1,9 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
|
<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
|
||||||
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/>
|
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/>
|
||||||
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/1">
|
|
||||||
<file>file:/root/NetBeansProjects/i2p.i2p/apps/BOB/src/net/i2p/BOB/BOB.java</file>
|
|
||||||
<file>file:/root/NetBeansProjects/i2p.i2p/apps/BOB/src/net/i2p/BOB/DoCMDS.java</file>
|
|
||||||
<file>file:/root/NetBeansProjects/i2p.i2p/apps/BOB/src/net/i2p/BOB/MUXlisten.java</file>
|
|
||||||
</open-files>
|
|
||||||
</project-private>
|
</project-private>
|
||||||
|
@@ -41,7 +41,6 @@ import net.i2p.client.I2PClient;
|
|||||||
import net.i2p.client.streaming.RetransmissionTimer;
|
import net.i2p.client.streaming.RetransmissionTimer;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
import net.i2p.util.SimpleScheduler;
|
import net.i2p.util.SimpleScheduler;
|
||||||
import net.i2p.util.SimpleStore;
|
|
||||||
import net.i2p.util.SimpleTimer2;
|
import net.i2p.util.SimpleTimer2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -47,7 +47,7 @@ public class DoCMDS implements Runnable {
|
|||||||
|
|
||||||
// FIX ME
|
// FIX ME
|
||||||
// I need a better way to do versioning, but this will do for now.
|
// I need a better way to do versioning, but this will do for now.
|
||||||
public static final String BMAJ = "00", BMIN = "00", BREV = "06", BEXT = "";
|
public static final String BMAJ = "00", BMIN = "00", BREV = "07", BEXT = "";
|
||||||
public static final String BOBversion = BMAJ + "." + BMIN + "." + BREV + BEXT;
|
public static final String BOBversion = BMAJ + "." + BMIN + "." + BREV + BEXT;
|
||||||
private Socket server;
|
private Socket server;
|
||||||
private Properties props;
|
private Properties props;
|
||||||
|
@@ -52,12 +52,12 @@ public class I2PtoTCP implements Runnable {
|
|||||||
this.database = database;
|
this.database = database;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void rlock() throws Exception {
|
private void rlock() {
|
||||||
database.getReadLock();
|
database.getReadLock();
|
||||||
info.getReadLock();
|
info.getReadLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void runlock() throws Exception {
|
private void runlock() {
|
||||||
database.releaseReadLock();
|
database.releaseReadLock();
|
||||||
info.releaseReadLock();
|
info.releaseReadLock();
|
||||||
}
|
}
|
||||||
|
@@ -43,7 +43,7 @@ import net.i2p.util.Log;
|
|||||||
*/
|
*/
|
||||||
public class MUXlisten implements Runnable {
|
public class MUXlisten implements Runnable {
|
||||||
|
|
||||||
private NamedDB database, info;
|
private NamedDB database, info;
|
||||||
private Log _log;
|
private Log _log;
|
||||||
private I2PSocketManager socketManager;
|
private I2PSocketManager socketManager;
|
||||||
private ByteArrayInputStream prikey;
|
private ByteArrayInputStream prikey;
|
||||||
@@ -269,27 +269,27 @@ public class MUXlisten implements Runnable {
|
|||||||
// Wait around till all threads are collected.
|
// Wait around till all threads are collected.
|
||||||
if (tg != null) {
|
if (tg != null) {
|
||||||
String boner = tg.getName();
|
String boner = tg.getName();
|
||||||
System.out.println("BOB: MUXlisten: Starting thread collection for: " + boner);
|
// System.out.println("BOB: MUXlisten: Starting thread collection for: " + boner);
|
||||||
_log.warn("BOB: MUXlisten: Starting thread collection for: " + boner);
|
_log.warn("BOB: MUXlisten: Starting thread collection for: " + boner);
|
||||||
// tg.interrupt(); // give my stuff a small smack again.
|
// tg.interrupt(); // give my stuff a small smack again.
|
||||||
if (tg.activeCount() + tg.activeGroupCount() != 0) {
|
if (tg.activeCount() + tg.activeGroupCount() != 0) {
|
||||||
visit(tg, 0, boner);
|
// visit(tg, 0, boner);
|
||||||
int foo = tg.activeCount() + tg.activeGroupCount();
|
int foo = tg.activeCount() + tg.activeGroupCount();
|
||||||
// hopefully no longer needed!
|
// hopefully no longer needed!
|
||||||
int bar = foo;
|
// int bar = foo;
|
||||||
System.out.println("BOB: MUXlisten: Waiting on threads for " + boner);
|
// System.out.println("BOB: MUXlisten: Waiting on threads for " + boner);
|
||||||
System.out.println("\nBOB: MUXlisten: ThreadGroup dump BEGIN " + boner);
|
// System.out.println("\nBOB: MUXlisten: ThreadGroup dump BEGIN " + boner);
|
||||||
visit(tg, 0, boner);
|
// visit(tg, 0, boner);
|
||||||
System.out.println("BOB: MUXlisten: ThreadGroup dump END " + boner + "\n");
|
// System.out.println("BOB: MUXlisten: ThreadGroup dump END " + boner + "\n");
|
||||||
// Happily spin forever :-(
|
// Happily spin forever :-(
|
||||||
while (foo != 0) {
|
while (foo != 0) {
|
||||||
foo = tg.activeCount() + tg.activeGroupCount();
|
foo = tg.activeCount() + tg.activeGroupCount();
|
||||||
if (foo != bar && foo != 0) {
|
// if (foo != bar && foo != 0) {
|
||||||
System.out.println("\nBOB: MUXlisten: ThreadGroup dump BEGIN " + boner);
|
// System.out.println("\nBOB: MUXlisten: ThreadGroup dump BEGIN " + boner);
|
||||||
visit(tg, 0, boner);
|
// visit(tg, 0, boner);
|
||||||
System.out.println("BOB: MUXlisten: ThreadGroup dump END " + boner + "\n");
|
// System.out.println("BOB: MUXlisten: ThreadGroup dump END " + boner + "\n");
|
||||||
}
|
// }
|
||||||
bar = foo;
|
// bar = foo;
|
||||||
try {
|
try {
|
||||||
Thread.sleep(100); //sleep for 100 ms (One tenth second)
|
Thread.sleep(100); //sleep for 100 ms (One tenth second)
|
||||||
} catch (InterruptedException ex) {
|
} catch (InterruptedException ex) {
|
||||||
@@ -297,7 +297,7 @@ public class MUXlisten implements Runnable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
System.out.println("BOB: MUXlisten: Threads went away. Success: " + boner);
|
// System.out.println("BOB: MUXlisten: Threads went away. Success: " + boner);
|
||||||
_log.warn("BOB: MUXlisten: Threads went away. Success: " + boner);
|
_log.warn("BOB: MUXlisten: Threads went away. Success: " + boner);
|
||||||
tg.destroy();
|
tg.destroy();
|
||||||
// Zap reference to the ThreadGroup so the JVM can GC it.
|
// Zap reference to the ThreadGroup so the JVM can GC it.
|
||||||
@@ -357,41 +357,4 @@ public class MUXlisten implements Runnable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
private static void nuke(ThreadGroup group, int level) {
|
|
||||||
// Get threads in `group'
|
|
||||||
int numThreads = group.activeCount();
|
|
||||||
Thread[] threads = new Thread[numThreads * 2];
|
|
||||||
numThreads = group.enumerate(threads, false);
|
|
||||||
// Enumerate each thread in `group' and stop it.
|
|
||||||
for (int i = 0; i < numThreads; i++) {
|
|
||||||
// Get thread
|
|
||||||
Thread thread = threads[i];
|
|
||||||
try {
|
|
||||||
if (thread.isAlive()) {
|
|
||||||
thread.stop();
|
|
||||||
}
|
|
||||||
} catch (SecurityException se) {
|
|
||||||
//nop
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get thread subgroups of `group'
|
|
||||||
int numGroups = group.activeGroupCount();
|
|
||||||
ThreadGroup[] groups = new ThreadGroup[numGroups * 2];
|
|
||||||
numGroups = group.enumerate(groups, false);
|
|
||||||
|
|
||||||
// Recursively visit each subgroup
|
|
||||||
for (int i = 0; i < numGroups; i++) {
|
|
||||||
nuke(groups[i], level + 1);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
group.destroy();
|
|
||||||
} catch (IllegalThreadStateException IE) {
|
|
||||||
//nop
|
|
||||||
} catch (SecurityException se) {
|
|
||||||
//nop
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
@@ -42,7 +42,6 @@ public class TCPlistener implements Runnable {
|
|||||||
|
|
||||||
private NamedDB info, database;
|
private NamedDB info, database;
|
||||||
private Log _log;
|
private Log _log;
|
||||||
private int tgwatch;
|
|
||||||
public I2PSocketManager socketManager;
|
public I2PSocketManager socketManager;
|
||||||
public I2PServerSocket serverSocket;
|
public I2PServerSocket serverSocket;
|
||||||
private ServerSocket listener;
|
private ServerSocket listener;
|
||||||
@@ -60,7 +59,6 @@ public class TCPlistener implements Runnable {
|
|||||||
this._log = _log;
|
this._log = _log;
|
||||||
this.socketManager = S;
|
this.socketManager = S;
|
||||||
this.listener = listener;
|
this.listener = listener;
|
||||||
tgwatch = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void rlock() throws Exception {
|
private void rlock() throws Exception {
|
||||||
@@ -84,28 +82,6 @@ public class TCPlistener implements Runnable {
|
|||||||
try {
|
try {
|
||||||
die:
|
die:
|
||||||
{
|
{
|
||||||
try {
|
|
||||||
rlock();
|
|
||||||
} catch (Exception e) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
if (info.exists("OUTPORT")) {
|
|
||||||
tgwatch = 2;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
try {
|
|
||||||
runlock();
|
|
||||||
} catch (Exception e2) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
runlock();
|
|
||||||
} catch (Exception e) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
Socket server = new Socket();
|
Socket server = new Socket();
|
||||||
listener.setSoTimeout(50); // We don't block, we cycle and check.
|
listener.setSoTimeout(50); // We don't block, we cycle and check.
|
||||||
@@ -134,7 +110,7 @@ public class TCPlistener implements Runnable {
|
|||||||
if (g) {
|
if (g) {
|
||||||
conn++;
|
conn++;
|
||||||
// toss the connection to a new thread.
|
// toss the connection to a new thread.
|
||||||
TCPtoI2P conn_c = new TCPtoI2P(socketManager, server);
|
TCPtoI2P conn_c = new TCPtoI2P(socketManager, server, info, database);
|
||||||
Thread t = new Thread(conn_c, Thread.currentThread().getName() + " TCPtoI2P " + conn);
|
Thread t = new Thread(conn_c, Thread.currentThread().getName() + " TCPtoI2P " + conn);
|
||||||
t.start();
|
t.start();
|
||||||
g = false;
|
g = false;
|
||||||
|
@@ -33,6 +33,7 @@ import java.net.Socket;
|
|||||||
import net.i2p.I2PException;
|
import net.i2p.I2PException;
|
||||||
import net.i2p.client.streaming.I2PSocket;
|
import net.i2p.client.streaming.I2PSocket;
|
||||||
import net.i2p.client.streaming.I2PSocketManager;
|
import net.i2p.client.streaming.I2PSocketManager;
|
||||||
|
import net.i2p.data.DataFormatException;
|
||||||
import net.i2p.data.Destination;
|
import net.i2p.data.Destination;
|
||||||
import net.i2p.i2ptunnel.I2PTunnel;
|
import net.i2p.i2ptunnel.I2PTunnel;
|
||||||
|
|
||||||
@@ -49,15 +50,29 @@ public class TCPtoI2P implements Runnable {
|
|||||||
private Socket sock;
|
private Socket sock;
|
||||||
private I2PSocketManager socketManager;
|
private I2PSocketManager socketManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* @param i2p
|
||||||
|
* @param socket
|
||||||
|
* param info
|
||||||
|
* param database
|
||||||
|
*/
|
||||||
|
TCPtoI2P(I2PSocketManager i2p, Socket socket , NamedDB info, NamedDB database) {
|
||||||
|
this.sock = socket;
|
||||||
|
this.info = info;
|
||||||
|
this.database = database;
|
||||||
|
this.socketManager = i2p;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a more forgiving readline,
|
* This is a more forgiving readline,
|
||||||
* it works on unbuffered streams
|
* it works on unbuffered streams
|
||||||
*
|
*
|
||||||
* @param in
|
* @param in
|
||||||
* @return line of text as a String
|
* @return line of text as a String
|
||||||
* @throws Exception
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
private static String lnRead(InputStream in) throws Exception {
|
private static String lnRead(InputStream in) throws IOException {
|
||||||
String S;
|
String S;
|
||||||
int b;
|
int b;
|
||||||
char c;
|
char c;
|
||||||
@@ -80,20 +95,6 @@ public class TCPtoI2P implements Runnable {
|
|||||||
return S;
|
return S;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
* @param i2p
|
|
||||||
* @param socket
|
|
||||||
* param info
|
|
||||||
* param database
|
|
||||||
*/
|
|
||||||
TCPtoI2P(I2PSocketManager i2p, Socket socket /*, NamedDB info, NamedDB database */) {
|
|
||||||
this.sock = socket;
|
|
||||||
// this.info = info;
|
|
||||||
// this.database = database;
|
|
||||||
this.socketManager = i2p;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Print an error message to out
|
* Print an error message to out
|
||||||
*
|
*
|
||||||
@@ -103,19 +104,22 @@ public class TCPtoI2P implements Runnable {
|
|||||||
*/
|
*/
|
||||||
private void Emsg(String e, OutputStream out) throws IOException {
|
private void Emsg(String e, OutputStream out) throws IOException {
|
||||||
// Debugging System.out.println("ERROR TCPtoI2P: " + e);
|
// Debugging System.out.println("ERROR TCPtoI2P: " + e);
|
||||||
out.write("ERROR".concat(e).getBytes());
|
out.write("ERROR ".concat(e).getBytes());
|
||||||
out.write(13); // cr
|
out.write(13);
|
||||||
|
out.write(10);
|
||||||
out.flush();
|
out.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void rlock() throws Exception {
|
// private void rlock() throws Exception {
|
||||||
|
private void rlock() {
|
||||||
database.getReadLock();
|
database.getReadLock();
|
||||||
info.getReadLock();
|
info.getReadLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void runlock() throws Exception {
|
// private void runlock() throws Exception {
|
||||||
database.releaseReadLock();
|
private void runlock() {
|
||||||
info.releaseReadLock();
|
info.releaseReadLock();
|
||||||
|
database.releaseReadLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -135,56 +139,64 @@ public class TCPtoI2P implements Runnable {
|
|||||||
|
|
||||||
in = sock.getInputStream();
|
in = sock.getInputStream();
|
||||||
out = sock.getOutputStream();
|
out = sock.getOutputStream();
|
||||||
try {
|
line = lnRead(in);
|
||||||
line = lnRead(in);
|
input = line.toLowerCase();
|
||||||
input = line.toLowerCase();
|
Destination dest = null;
|
||||||
Destination dest = null;
|
if (input.endsWith(".i2p")) {
|
||||||
|
dest = I2PTunnel.destFromName(input);
|
||||||
if (input.endsWith(".i2p")) {
|
line = dest.toBase64();
|
||||||
dest = I2PTunnel.destFromName(input);
|
}
|
||||||
line = dest.toBase64();
|
dest = new Destination();
|
||||||
}
|
dest.fromBase64(line);
|
||||||
dest = new Destination();
|
|
||||||
dest.fromBase64(line);
|
try {
|
||||||
|
// get a client socket
|
||||||
try {
|
I2P = socketManager.connect(dest);
|
||||||
// get a client socket
|
I2P.setReadTimeout(0); // temp bugfix, this *SHOULD* be the default
|
||||||
I2P = socketManager.connect(dest);
|
// make readers/writers
|
||||||
I2P.setReadTimeout(0); // temp bugfix, this *SHOULD* be the default
|
Iin = I2P.getInputStream();
|
||||||
// make readers/writers
|
Iout = I2P.getOutputStream();
|
||||||
Iin = I2P.getInputStream();
|
// setup to cross the streams
|
||||||
Iout = I2P.getOutputStream();
|
TCPio conn_c = new TCPio(in, Iout /*, info, database */); // app -> I2P
|
||||||
// setup to cross the streams
|
TCPio conn_a = new TCPio(Iin, out /*, info, database */); // I2P -> app
|
||||||
TCPio conn_c = new TCPio(in, Iout /*, info, database */); // app -> I2P
|
t = new Thread(conn_c, Thread.currentThread().getName() + " TCPioA");
|
||||||
TCPio conn_a = new TCPio(Iin, out /*, info, database */); // I2P -> app
|
q = new Thread(conn_a, Thread.currentThread().getName() + " TCPioB");
|
||||||
t = new Thread(conn_c, Thread.currentThread().getName() + " TCPioA");
|
// Fire!
|
||||||
q = new Thread(conn_a, Thread.currentThread().getName() + " TCPioB");
|
t.start();
|
||||||
// Fire!
|
q.start();
|
||||||
t.start();
|
boolean spin = true;
|
||||||
q.start();
|
while (t.isAlive() && q.isAlive()) { // AND is used here to kill off the other thread
|
||||||
boolean spin = true;
|
Thread.sleep(10); //sleep for 10 ms
|
||||||
while (t.isAlive() && q.isAlive()) { // AND is used here to kill off the other thread
|
rlock();
|
||||||
Thread.sleep(10); //sleep for 10 ms
|
spin = info.get("RUNNING").equals(Boolean.TRUE);
|
||||||
rlock();
|
runlock();
|
||||||
spin = info.get("RUNNING").equals(Boolean.TRUE);
|
}
|
||||||
runlock();
|
} catch (I2PException e) {
|
||||||
}
|
Emsg(e.toString(), out);
|
||||||
} catch (I2PException e) {
|
} catch (ConnectException e) {
|
||||||
Emsg("ERROR " + e.toString(), out);
|
Emsg(e.toString(), out);
|
||||||
} catch (ConnectException e) {
|
} catch (NoRouteToHostException e) {
|
||||||
Emsg("ERROR " + e.toString(), out);
|
Emsg(e.toString(), out);
|
||||||
} catch (NoRouteToHostException e) {
|
}
|
||||||
Emsg("ERROR " + e.toString(), out);
|
|
||||||
} catch (InterruptedIOException e) {
|
} catch (InterruptedIOException e) {
|
||||||
// We're breaking away.
|
// We're breaking away.
|
||||||
}
|
} catch (InterruptedException e) {
|
||||||
|
// ditto
|
||||||
} catch (Exception e) {
|
} catch (IOException e) {
|
||||||
Emsg("ERROR " + e.toString(), out);
|
try {
|
||||||
|
Emsg(e.toString(), out);
|
||||||
|
} catch (IOException ex) {
|
||||||
|
// ditto
|
||||||
|
}
|
||||||
|
} catch (DataFormatException e) {
|
||||||
|
try {
|
||||||
|
Emsg(e.toString(), out);
|
||||||
|
} catch (IOException ex) {
|
||||||
|
// ditto
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
|
||||||
// bail on anything else
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} finally {
|
} finally {
|
||||||
try {
|
try {
|
||||||
t.interrupt();
|
t.interrupt();
|
||||||
|
@@ -15,7 +15,7 @@ package net.i2p;
|
|||||||
*/
|
*/
|
||||||
public class CoreVersion {
|
public class CoreVersion {
|
||||||
public final static String ID = "$Revision: 1.72 $ $Date: 2008-08-24 12:00:00 $";
|
public final static String ID = "$Revision: 1.72 $ $Date: 2008-08-24 12:00:00 $";
|
||||||
public final static String VERSION = "0.7.3";
|
public final static String VERSION = "0.7.4";
|
||||||
|
|
||||||
public static void main(String args[]) {
|
public static void main(String args[]) {
|
||||||
System.out.println("I2P Core version: " + VERSION);
|
System.out.println("I2P Core version: " + VERSION);
|
||||||
|
115
history.txt
115
history.txt
@@ -1,3 +1,111 @@
|
|||||||
|
2009-06-17 zzz
|
||||||
|
* PeerSelector:
|
||||||
|
- Limit exploratory tunnels to connected peers when over
|
||||||
|
half the connection limit (was 80%)
|
||||||
|
- Have the high capacity tier fall back to a new connected tier
|
||||||
|
before moving on to the not failing tier
|
||||||
|
so that tunnel build success doesn't collapse and drive
|
||||||
|
connections to the limit
|
||||||
|
* PeerTestJob:
|
||||||
|
- Limit to connected peers
|
||||||
|
|
||||||
|
2009-06-12 zzz
|
||||||
|
* Console:
|
||||||
|
- Move the console css from default.css in the .war to docs/themes/console/console.css,
|
||||||
|
and support console themes in the main console with routerconsole.theme=foo
|
||||||
|
- Remove unused NoticeHelper
|
||||||
|
|
||||||
|
* Installer:
|
||||||
|
Upgrade to izpack 4.3.0 and add a short script to fix Vista install problems.
|
||||||
|
(previous izpack was 3.7.2 from 2005-04-22)
|
||||||
|
|
||||||
|
izpack 4.3.0 from :
|
||||||
|
http://dist.codehaus.org/izpack/releases/4.3.0/IzPack-install-4.3.0.jar
|
||||||
|
SHA1 f06da6b26ac2c68fed64ab38980352989b8d8841
|
||||||
|
(no signatures or sha1sums found on website, and the jar is unsigned)
|
||||||
|
License: Apache 2.0
|
||||||
|
|
||||||
|
upack izpack:
|
||||||
|
java -jar IzPack-install-4.3.0.jar
|
||||||
|
or
|
||||||
|
java -jar IzPack-install-4.3.0.jar -console
|
||||||
|
|
||||||
|
get the standalone-compiler.jar from the installation lib/ directory:
|
||||||
|
SHA1 6d2b4a5657bfb864a333b1c4b1c0f8223aa57d80
|
||||||
|
(no signatures or sha1sums found on website, and the jar is unsigned)
|
||||||
|
|
||||||
|
This fixes the bug with the install windows centered in all the
|
||||||
|
workspaces, not the current workspace. And who knows what other
|
||||||
|
bugs in the last 4 years.
|
||||||
|
|
||||||
|
To fix Vista (and presumably Windows 7) permissiom problems,
|
||||||
|
add a run-privileged flag for those, and run the new fixperms.bat
|
||||||
|
which calls icacls to add the privileges to the install directory.
|
||||||
|
|
||||||
|
Add support for 6 more language packs found in the new release.
|
||||||
|
Change from ISO3 codes to native language names.
|
||||||
|
|
||||||
|
Disable creation of the i2p.tar.bz2 file in build.xml
|
||||||
|
(distributed as i2pheadless-0.7.x.tar.bz2), as izpack 4.3.0 now
|
||||||
|
supports headless installation with java -jar i2pinstall.exe -console.
|
||||||
|
Update INSTALL.txt and INSTALL-headless.txt accordingly.
|
||||||
|
|
||||||
|
- Add install and temp path substitution to wrapper.config and
|
||||||
|
i2prouter on install
|
||||||
|
|
||||||
|
- Change the wrapper.config classpath to one line: lib/*.jar
|
||||||
|
This means we lose control of classpath load order, so move the windows installer
|
||||||
|
jars copy.jar, delete.jar, and exec.jar to a new installer/ directory so
|
||||||
|
these jars won't be in the classpath or potentially conflict, since
|
||||||
|
copy.jar and delete.jar include FileUtil.class, and we don't want to have
|
||||||
|
to remember to add them to the updater if we ever change FileUtil.class.
|
||||||
|
Delete the installer/ directory in postinstall.sh since it is windows-only.
|
||||||
|
|
||||||
|
* Watchdog: Only try to dump threads if there is a wrapper
|
||||||
|
and we aren't on windows
|
||||||
|
|
||||||
|
* 2009-06-12 0.7.4 released
|
||||||
|
|
||||||
|
2009-06-12 Complication
|
||||||
|
* Update versions, package release
|
||||||
|
|
||||||
|
2009-06-09 zzz
|
||||||
|
* NTCP: Fix startup race NPE (thanks postman!)
|
||||||
|
|
||||||
|
2009-06-08 sponge
|
||||||
|
* Last commit for this cycle. All debugging except for WARN removed.
|
||||||
|
I can use the visit command to debug now anyway.
|
||||||
|
|
||||||
|
2009-06-08 sponge
|
||||||
|
* Removed BOB debugging as-per zzz
|
||||||
|
|
||||||
|
2009-06-08 sponge
|
||||||
|
* Fixed NPE and some other goofups in BOB.
|
||||||
|
* BOB bump version
|
||||||
|
|
||||||
|
2009-06-07 zzz
|
||||||
|
* Build file:
|
||||||
|
- Add updaterWithJettyFixesAndGeoIP, use it in pkg for one release
|
||||||
|
- Cleanups
|
||||||
|
* Console:
|
||||||
|
- netdb.jsp cleanup
|
||||||
|
- tunnels.jsp cleanup
|
||||||
|
* ExploratoryPeerSelector:
|
||||||
|
- Limit to connected peers when near connection limit
|
||||||
|
* Timestamper:
|
||||||
|
- Use locale country if geoip unavailable
|
||||||
|
* Transport:
|
||||||
|
- Lower min NTCP idle time to 3m (was 5m)
|
||||||
|
- Increase SSU conn limit by 33%
|
||||||
|
* UPnP: Fix deprecation warning
|
||||||
|
* Watchdog:
|
||||||
|
- Defang him again
|
||||||
|
|
||||||
|
2009-06-06 sponge
|
||||||
|
* Added BOB's license to licenses
|
||||||
|
* Janitorial javadoc fixes *sigh*
|
||||||
|
* bump to -13
|
||||||
|
|
||||||
2009-06-05 sponge
|
2009-06-05 sponge
|
||||||
* Merge and bump to -12
|
* Merge and bump to -12
|
||||||
|
|
||||||
@@ -10,8 +118,15 @@
|
|||||||
time out. What should happen is the streaming lib should cause an IO
|
time out. What should happen is the streaming lib should cause an IO
|
||||||
error to the pending read or write.
|
error to the pending read or write.
|
||||||
|
|
||||||
|
2009-06-05 zzz
|
||||||
|
* Build file:
|
||||||
|
- Add license info for launch4j includes
|
||||||
|
* Console:
|
||||||
|
- 16x11 transparent flags for ch and np, thanks anonim!
|
||||||
|
|
||||||
2009-06-04 zzz
|
2009-06-04 zzz
|
||||||
* Console:
|
* Console:
|
||||||
|
- Update geoip file to June 3 version
|
||||||
- Hide some controls if no wrapper on configservice.jsp
|
- Hide some controls if no wrapper on configservice.jsp
|
||||||
* I2PTunnel:
|
* I2PTunnel:
|
||||||
- Fix bug where delayed-open and close-on-idle tunnels would
|
- Fix bug where delayed-open and close-on-idle tunnels would
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
<i2p.news date="$Date: 2009-05-16 00:00:00 $">
|
<i2p.news date="$Date: 2009-06-12 00:00:00 $">
|
||||||
<i2p.release version="0.7.3" date="2009/05/16" minVersion="0.6"
|
<i2p.release version="0.7.4" date="2009/06/12" minVersion="0.6"
|
||||||
/>
|
/>
|
||||||
<center><h2>Congratulations on getting I2P installed!</h2></center>
|
<center><h2>Congratulations on getting I2P installed!</h2></center>
|
||||||
<ul>
|
<ul>
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
<info>
|
<info>
|
||||||
<appname>i2p</appname>
|
<appname>i2p</appname>
|
||||||
<appversion>0.7.3</appversion>
|
<appversion>0.7.4</appversion>
|
||||||
<authors>
|
<authors>
|
||||||
<author name="I2P" email="http://forum.i2p2.de/"/>
|
<author name="I2P" email="http://forum.i2p2.de/"/>
|
||||||
</authors>
|
</authors>
|
||||||
|
21
licenses/COPYING-BOB.txt
Normal file
21
licenses/COPYING-BOB.txt
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||||
|
Version 2, December 2004
|
||||||
|
|
||||||
|
Copyright (C) sponge
|
||||||
|
Planet Earth
|
||||||
|
Everyone is permitted to copy and distribute verbatim or modified
|
||||||
|
copies of this license document, and changing it is allowed as long
|
||||||
|
as the name is changed.
|
||||||
|
|
||||||
|
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. You just DO WHAT THE FUCK YOU WANT TO.
|
||||||
|
|
||||||
|
See...
|
||||||
|
|
||||||
|
http://sam.zoy.org/wtfpl/
|
||||||
|
and
|
||||||
|
http://en.wikipedia.org/wiki/WTFPL
|
||||||
|
|
||||||
|
...for any additional details and license questions.
|
32
news.xml
32
news.xml
@@ -1,5 +1,5 @@
|
|||||||
<i2p.news date="$Date: 2009-05-16 00:00:00 $">
|
<i2p.news date="$Date: 2009-06-12 00:00:00 $">
|
||||||
<i2p.release version="0.7.3" date="2009/05/16" minVersion="0.6"
|
<i2p.release version="0.7.4" date="2009/06/12" minVersion="0.6"
|
||||||
anonurl="http://i2p/NF2RLVUxVulR3IqK0sGJR0dHQcGXAzwa6rEO4WAWYXOHw-DoZhKnlbf1nzHXwMEJoex5nFTyiNMqxJMWlY54cvU~UenZdkyQQeUSBZXyuSweflUXFqKN-y8xIoK2w9Ylq1k8IcrAFDsITyOzjUKoOPfVq34rKNDo7fYyis4kT5bAHy~2N1EVMs34pi2RFabATIOBk38Qhab57Umpa6yEoE~rbyR~suDRvD7gjBvBiIKFqhFueXsR2uSrPB-yzwAGofTXuklofK3DdKspciclTVzqbDjsk5UXfu2nTrC1agkhLyqlOfjhyqC~t1IXm-Vs2o7911k7KKLGjB4lmH508YJ7G9fLAUyjuB-wwwhejoWqvg7oWvqo4oIok8LG6ECR71C3dzCvIjY2QcrhoaazA9G4zcGMm6NKND-H4XY6tUWhpB~5GefB3YczOqMbHq4wi0O9MzBFrOJEOs3X4hwboKWANf7DT5PZKJZ5KorQPsYRSq0E3wSOsFCSsdVCKUGsAAAA/i2p/i2pupdate.sud"
|
anonurl="http://i2p/NF2RLVUxVulR3IqK0sGJR0dHQcGXAzwa6rEO4WAWYXOHw-DoZhKnlbf1nzHXwMEJoex5nFTyiNMqxJMWlY54cvU~UenZdkyQQeUSBZXyuSweflUXFqKN-y8xIoK2w9Ylq1k8IcrAFDsITyOzjUKoOPfVq34rKNDo7fYyis4kT5bAHy~2N1EVMs34pi2RFabATIOBk38Qhab57Umpa6yEoE~rbyR~suDRvD7gjBvBiIKFqhFueXsR2uSrPB-yzwAGofTXuklofK3DdKspciclTVzqbDjsk5UXfu2nTrC1agkhLyqlOfjhyqC~t1IXm-Vs2o7911k7KKLGjB4lmH508YJ7G9fLAUyjuB-wwwhejoWqvg7oWvqo4oIok8LG6ECR71C3dzCvIjY2QcrhoaazA9G4zcGMm6NKND-H4XY6tUWhpB~5GefB3YczOqMbHq4wi0O9MzBFrOJEOs3X4hwboKWANf7DT5PZKJZ5KorQPsYRSq0E3wSOsFCSsdVCKUGsAAAA/i2p/i2pupdate.sud"
|
||||||
publicurl="http://dev.i2p.net/i2p/i2pupdate.sud"
|
publicurl="http://dev.i2p.net/i2p/i2pupdate.sud"
|
||||||
anonannouncement="http://i2p/NF2RLVUxVulR3IqK0sGJR0dHQcGXAzwa6rEO4WAWYXOHw-DoZhKnlbf1nzHXwMEJoex5nFTyiNMqxJMWlY54cvU~UenZdkyQQeUSBZXyuSweflUXFqKN-y8xIoK2w9Ylq1k8IcrAFDsITyOzjUKoOPfVq34rKNDo7fYyis4kT5bAHy~2N1EVMs34pi2RFabATIOBk38Qhab57Umpa6yEoE~rbyR~suDRvD7gjBvBiIKFqhFueXsR2uSrPB-yzwAGofTXuklofK3DdKspciclTVzqbDjsk5UXfu2nTrC1agkhLyqlOfjhyqC~t1IXm-Vs2o7911k7KKLGjB4lmH508YJ7G9fLAUyjuB-wwwhejoWqvg7oWvqo4oIok8LG6ECR71C3dzCvIjY2QcrhoaazA9G4zcGMm6NKND-H4XY6tUWhpB~5GefB3YczOqMbHq4wi0O9MzBFrOJEOs3X4hwboKWANf7DT5PZKJZ5KorQPsYRSq0E3wSOsFCSsdVCKUGsAAAA/pipermail/i2p/2005-September/000878.html"
|
anonannouncement="http://i2p/NF2RLVUxVulR3IqK0sGJR0dHQcGXAzwa6rEO4WAWYXOHw-DoZhKnlbf1nzHXwMEJoex5nFTyiNMqxJMWlY54cvU~UenZdkyQQeUSBZXyuSweflUXFqKN-y8xIoK2w9Ylq1k8IcrAFDsITyOzjUKoOPfVq34rKNDo7fYyis4kT5bAHy~2N1EVMs34pi2RFabATIOBk38Qhab57Umpa6yEoE~rbyR~suDRvD7gjBvBiIKFqhFueXsR2uSrPB-yzwAGofTXuklofK3DdKspciclTVzqbDjsk5UXfu2nTrC1agkhLyqlOfjhyqC~t1IXm-Vs2o7911k7KKLGjB4lmH508YJ7G9fLAUyjuB-wwwhejoWqvg7oWvqo4oIok8LG6ECR71C3dzCvIjY2QcrhoaazA9G4zcGMm6NKND-H4XY6tUWhpB~5GefB3YczOqMbHq4wi0O9MzBFrOJEOs3X4hwboKWANf7DT5PZKJZ5KorQPsYRSq0E3wSOsFCSsdVCKUGsAAAA/pipermail/i2p/2005-September/000878.html"
|
||||||
@@ -11,22 +11,22 @@
|
|||||||
publiclogs="http://www.i2p.net/meeting141" />
|
publiclogs="http://www.i2p.net/meeting141" />
|
||||||
<p>
|
<p>
|
||||||
•
|
•
|
||||||
2009-05-16: <b>0.7.3 <a href="http://www.i2p2.i2p/release-0.7.3.html">Released</a></b>
|
2009-06-12: <b>0.7.4 <a href="http://www.i2p2.i2p/release-0.7.4.html">Released</a></b>
|
||||||
</p><p>
|
</p><p>
|
||||||
I2P version 0.7.3 contains several buxfixes and improvements,
|
I2P version 0.7.4 introduces notable new features
|
||||||
includes a lot of maintenance work and new versions of
|
like GeoIP capability and UPnP support. While the former
|
||||||
both the SAM and BOB application gateway protocols.
|
can become a basis for geographically aware tunnel-building,
|
||||||
|
the latter should immediately enable more routers to accept
|
||||||
|
inbound TCP connections, helping distribute workload more evenly.
|
||||||
</p><p>
|
</p><p>
|
||||||
A patch to I2P's internal web server Jetty is included
|
Inbound NTCP is now enabled automaticaly if the router
|
||||||
to correct SusiDNS behaviour on Windows. The way I2P nodes
|
does not appear firewalled, and default bandwidth limits
|
||||||
volunteer to participate in the Network Database is changed
|
for new installations are increased.
|
||||||
to avoid too many doing this simultaneously, and creation
|
|
||||||
of new participating tunnels is now throttled before messages
|
|
||||||
in existing tunnels start to get dropped.
|
|
||||||
</p><p>
|
</p><p>
|
||||||
Multiple improvements to the Router Console and other components
|
In addition, multiple bugfixes and updates are included,
|
||||||
are included, I2PSnark can handle bigger torrents and more files,
|
addressing issues with the NTCP transport, BOB protocol,
|
||||||
while work continues on the experimental desktop interface.
|
connection limiting, behaviour of new I2PTunnel options
|
||||||
Updating is recommended.
|
and the SusiDNS user interface. Improvements to the Router Console
|
||||||
|
are likewise included. Updating is recommended.
|
||||||
</p>
|
</p>
|
||||||
</i2p.news>
|
</i2p.news>
|
||||||
|
@@ -36,6 +36,7 @@ public abstract class CommSystemFacade implements Service {
|
|||||||
public int countActiveSendPeers() { return 0; }
|
public int countActiveSendPeers() { return 0; }
|
||||||
public boolean haveInboundCapacity() { return true; }
|
public boolean haveInboundCapacity() { return true; }
|
||||||
public boolean haveOutboundCapacity() { return true; }
|
public boolean haveOutboundCapacity() { return true; }
|
||||||
|
public boolean haveHighOutboundCapacity() { return true; }
|
||||||
public List getMostRecentErrorMessages() { return Collections.EMPTY_LIST; }
|
public List getMostRecentErrorMessages() { return Collections.EMPTY_LIST; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -101,7 +101,7 @@ class RouterThrottleImpl implements RouterThrottle {
|
|||||||
// reject here if lag too high???
|
// reject here if lag too high???
|
||||||
|
|
||||||
RateStat rs = _context.statManager().getRate("transport.sendProcessingTime");
|
RateStat rs = _context.statManager().getRate("transport.sendProcessingTime");
|
||||||
Rate r = null;
|
Rate r = rs.getRate(60*1000);
|
||||||
|
|
||||||
//Reject tunnels if the time to process messages and send them is too large. Too much time implies congestion.
|
//Reject tunnels if the time to process messages and send them is too large. Too much time implies congestion.
|
||||||
if(r != null) {
|
if(r != null) {
|
||||||
|
@@ -18,9 +18,9 @@ public class RouterVersion {
|
|||||||
/** deprecated */
|
/** deprecated */
|
||||||
public final static String ID = "Monotone";
|
public final static String ID = "Monotone";
|
||||||
public final static String VERSION = CoreVersion.VERSION;
|
public final static String VERSION = CoreVersion.VERSION;
|
||||||
public final static long BUILD = 12;
|
public final static long BUILD = 2;
|
||||||
/** for example "-test" */
|
/** for example "-test" */
|
||||||
public final static String EXTRA = "-rc";
|
public final static String EXTRA = "";
|
||||||
public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA;
|
public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA;
|
||||||
public static void main(String args[]) {
|
public static void main(String args[]) {
|
||||||
System.out.println("I2P Router version: " + FULL_VERSION);
|
System.out.println("I2P Router version: " + FULL_VERSION);
|
||||||
|
@@ -116,7 +116,14 @@ class PeerManager {
|
|||||||
case PeerSelectionCriteria.PURPOSE_TEST:
|
case PeerSelectionCriteria.PURPOSE_TEST:
|
||||||
// for now, the peers we test will be the reliable ones
|
// for now, the peers we test will be the reliable ones
|
||||||
//_organizer.selectWellIntegratedPeers(criteria.getMinimumRequired(), exclude, curVals);
|
//_organizer.selectWellIntegratedPeers(criteria.getMinimumRequired(), exclude, curVals);
|
||||||
_organizer.selectNotFailingPeers(criteria.getMinimumRequired(), exclude, peers);
|
|
||||||
|
// The PeerTestJob does only run every 5 minutes, but
|
||||||
|
// this was helping drive us to connection limits, let's leave the exploration
|
||||||
|
// to the ExploratoryPeerSelector, which will restrict to connected peers
|
||||||
|
// when we get close to the limit. So let's stick with connected peers here.
|
||||||
|
// Todo: what's the point of the PeerTestJob anyway?
|
||||||
|
//_organizer.selectNotFailingPeers(criteria.getMinimumRequired(), exclude, peers);
|
||||||
|
_organizer.selectActiveNotFailingPeers(criteria.getMinimumRequired(), exclude, peers);
|
||||||
break;
|
break;
|
||||||
case PeerSelectionCriteria.PURPOSE_TUNNEL:
|
case PeerSelectionCriteria.PURPOSE_TUNNEL:
|
||||||
// pull all of the fast ones, regardless of how many we
|
// pull all of the fast ones, regardless of how many we
|
||||||
|
@@ -316,8 +316,8 @@ public class ProfileOrganizer {
|
|||||||
} finally { releaseReadLock(); }
|
} finally { releaseReadLock(); }
|
||||||
if (matches.size() < howMany) {
|
if (matches.size() < howMany) {
|
||||||
if (_log.shouldLog(Log.INFO))
|
if (_log.shouldLog(Log.INFO))
|
||||||
_log.info("selectHighCap("+howMany+"), not enough fast (" + matches.size() + ") going on to notFailing");
|
_log.info("selectHighCap("+howMany+"), not enough highcap (" + matches.size() + ") going on to ANFP2");
|
||||||
selectNotFailingPeers(howMany, exclude, matches, mask);
|
selectActiveNotFailingPeers2(howMany, exclude, matches, mask);
|
||||||
} else {
|
} else {
|
||||||
if (_log.shouldLog(Log.INFO))
|
if (_log.shouldLog(Log.INFO))
|
||||||
_log.info("selectHighCap("+howMany+"), found enough highCap (" + matches.size() + ")");
|
_log.info("selectHighCap("+howMany+"), found enough highCap (" + matches.size() + ")");
|
||||||
@@ -375,6 +375,7 @@ public class ProfileOrganizer {
|
|||||||
selectAllNotFailingPeers(howMany, exclude, matches, onlyNotFailing, mask);
|
selectAllNotFailingPeers(howMany, exclude, matches, onlyNotFailing, mask);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a set of Hashes for peers that are both not failing and we're actively
|
* Return a set of Hashes for peers that are both not failing and we're actively
|
||||||
* talking with.
|
* talking with.
|
||||||
@@ -403,6 +404,39 @@ public class ProfileOrganizer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a set of Hashes for peers that are both not failing and we're actively
|
||||||
|
* talking with.
|
||||||
|
*
|
||||||
|
* We use commSystem().isEstablished(), not profile.getIsActive(), as the
|
||||||
|
* NTCP idle time is now shorter than the 5 minute getIsActive() threshold,
|
||||||
|
* and we're using this to try and limit connections.
|
||||||
|
*
|
||||||
|
* This DOES cascade further to non-connected peers.
|
||||||
|
*/
|
||||||
|
private void selectActiveNotFailingPeers2(int howMany, Set exclude, Set matches, int mask) {
|
||||||
|
if (matches.size() < howMany) {
|
||||||
|
Map<Hash, PeerProfile> activePeers = new HashMap();
|
||||||
|
getReadLock();
|
||||||
|
try {
|
||||||
|
for (Iterator<Map.Entry<Hash, PeerProfile>> iter = _notFailingPeers.entrySet().iterator(); iter.hasNext(); ) {
|
||||||
|
Map.Entry<Hash, PeerProfile> e = iter.next();
|
||||||
|
if (_context.commSystem().isEstablished(e.getKey()))
|
||||||
|
activePeers.put(e.getKey(), e.getValue());
|
||||||
|
}
|
||||||
|
locked_selectPeers(activePeers, howMany, exclude, matches, mask);
|
||||||
|
} finally { releaseReadLock(); }
|
||||||
|
}
|
||||||
|
if (matches.size() < howMany) {
|
||||||
|
if (_log.shouldLog(Log.INFO))
|
||||||
|
_log.info("selectANFP2("+howMany+"), not enough ANFP (" + matches.size() + ") going on to notFailing");
|
||||||
|
selectNotFailingPeers(howMany, exclude, matches, mask);
|
||||||
|
} else {
|
||||||
|
if (_log.shouldLog(Log.INFO))
|
||||||
|
_log.info("selectANFP2("+howMany+"), found enough ANFP (" + matches.size() + ")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a set of Hashes for peers that are not failing.
|
* Return a set of Hashes for peers that are not failing.
|
||||||
*
|
*
|
||||||
@@ -520,8 +554,8 @@ public class ProfileOrganizer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_log.shouldLog(Log.INFO))
|
if (_log.shouldLog(Log.DEBUG))
|
||||||
_log.info("Unreachable: " + l);
|
_log.debug("Unreachable: " + l);
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -73,6 +73,8 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
|
|||||||
public boolean haveInboundCapacity() { return (_manager == null ? false : _manager.haveInboundCapacity()); }
|
public boolean haveInboundCapacity() { return (_manager == null ? false : _manager.haveInboundCapacity()); }
|
||||||
@Override
|
@Override
|
||||||
public boolean haveOutboundCapacity() { return (_manager == null ? false : _manager.haveOutboundCapacity()); }
|
public boolean haveOutboundCapacity() { return (_manager == null ? false : _manager.haveOutboundCapacity()); }
|
||||||
|
@Override
|
||||||
|
public boolean haveHighOutboundCapacity() { return (_manager == null ? false : _manager.haveHighOutboundCapacity()); }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Framed average clock skew of connected peers in seconds, or null if we cannot answer.
|
* Framed average clock skew of connected peers in seconds, or null if we cannot answer.
|
||||||
|
@@ -47,6 +47,7 @@ public interface Transport {
|
|||||||
public int countActivePeers();
|
public int countActivePeers();
|
||||||
public int countActiveSendPeers();
|
public int countActiveSendPeers();
|
||||||
public boolean haveCapacity();
|
public boolean haveCapacity();
|
||||||
|
public boolean haveHighCapacity();
|
||||||
public Vector getClockSkews();
|
public Vector getClockSkews();
|
||||||
public List getMostRecentErrorMessages();
|
public List getMostRecentErrorMessages();
|
||||||
|
|
||||||
|
@@ -215,6 +215,20 @@ public class TransportManager implements TransportEventListener {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Are all transports well below their outbound connection limit
|
||||||
|
* Use for throttling in the router.
|
||||||
|
*/
|
||||||
|
public boolean haveHighOutboundCapacity() {
|
||||||
|
if (_transports.size() <= 0)
|
||||||
|
return false;
|
||||||
|
for (int i = 0; i < _transports.size(); i++) {
|
||||||
|
if (!((Transport)_transports.get(i)).haveHighCapacity())
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is at least one transport below its inbound connection limit + some margin
|
* Is at least one transport below its inbound connection limit + some margin
|
||||||
* Use for throttling in the router.
|
* Use for throttling in the router.
|
||||||
|
@@ -47,9 +47,11 @@ import org.freenetproject.ForwardPortStatus;
|
|||||||
*
|
*
|
||||||
* some code has been borrowed from Limewire : @see com.limegroup.gnutella.UPnPManager
|
* some code has been borrowed from Limewire : @see com.limegroup.gnutella.UPnPManager
|
||||||
*
|
*
|
||||||
* @see http://www.upnp.org/
|
* @see "http://www.upnp.org/"
|
||||||
* @see http://en.wikipedia.org/wiki/Universal_Plug_and_Play
|
* @see "http://en.wikipedia.org/wiki/Universal_Plug_and_Play"
|
||||||
*
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
* TODO: Support multiple IGDs ?
|
* TODO: Support multiple IGDs ?
|
||||||
* TODO: Advertise the node like the MDNS plugin does
|
* TODO: Advertise the node like the MDNS plugin does
|
||||||
* TODO: Implement EventListener and react on ip-change
|
* TODO: Implement EventListener and react on ip-change
|
||||||
|
@@ -42,7 +42,8 @@ public class NTCPSendFinisher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void stop() {
|
public void stop() {
|
||||||
_executor.shutdownNow();
|
if (_executor != null)
|
||||||
|
_executor.shutdownNow();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void add(OutNetMessage msg) {
|
public void add(OutNetMessage msg) {
|
||||||
|
@@ -326,6 +326,10 @@ public class NTCPTransport extends TransportImpl {
|
|||||||
return countActivePeers() < getMaxConnections() * 4 / 5;
|
return countActivePeers() < getMaxConnections() * 4 / 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean haveHighCapacity() {
|
||||||
|
return countActivePeers() < getMaxConnections() / 2;
|
||||||
|
}
|
||||||
|
|
||||||
/** queue up afterSend call, which can take some time w/ jobs, etc */
|
/** queue up afterSend call, which can take some time w/ jobs, etc */
|
||||||
void sendComplete(OutNetMessage msg) { _finisher.add(msg); }
|
void sendComplete(OutNetMessage msg) { _finisher.add(msg); }
|
||||||
|
|
||||||
|
@@ -387,7 +387,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
|
|||||||
* - Much better tracking of troublemakers
|
* - Much better tracking of troublemakers
|
||||||
* - Disable if we have good local address or UPnP
|
* - Disable if we have good local address or UPnP
|
||||||
*
|
*
|
||||||
* @param ip publicly routable IPv4 only
|
* @param from Hash of inbound destination
|
||||||
|
* @param ourIP publicly routable IPv4 only
|
||||||
* @param ourPort >= 1024
|
* @param ourPort >= 1024
|
||||||
*/
|
*/
|
||||||
void externalAddressReceived(Hash from, byte ourIP[], int ourPort) {
|
void externalAddressReceived(Hash from, byte ourIP[], int ourPort) {
|
||||||
@@ -1381,6 +1382,12 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean haveHighCapacity() {
|
||||||
|
synchronized (_peersByIdent) {
|
||||||
|
return _peersByIdent.size() < getMaxConnections() / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return our peer clock skews on this transport.
|
* Return our peer clock skews on this transport.
|
||||||
* Vector composed of Long, each element representing a peer skew in seconds.
|
* Vector composed of Long, each element representing a peer skew in seconds.
|
||||||
|
@@ -47,7 +47,7 @@ class ExploratoryPeerSelector extends TunnelPeerSelector {
|
|||||||
//
|
//
|
||||||
if (exploreHighCap)
|
if (exploreHighCap)
|
||||||
ctx.profileOrganizer().selectHighCapacityPeers(length, exclude, matches);
|
ctx.profileOrganizer().selectHighCapacityPeers(length, exclude, matches);
|
||||||
else if (ctx.commSystem().haveOutboundCapacity())
|
else if (ctx.commSystem().haveHighOutboundCapacity())
|
||||||
ctx.profileOrganizer().selectNotFailingPeers(length, exclude, matches, false);
|
ctx.profileOrganizer().selectNotFailingPeers(length, exclude, matches, false);
|
||||||
else // use only connected peers so we don't make more connections
|
else // use only connected peers so we don't make more connections
|
||||||
ctx.profileOrganizer().selectActiveNotFailingPeers(length, exclude, matches);
|
ctx.profileOrganizer().selectActiveNotFailingPeers(length, exclude, matches);
|
||||||
|
@@ -815,7 +815,7 @@ public interface XmlPullParser {
|
|||||||
* <a href="http://www.w3.org/TR/REC-xml-names/#ns-using">Namespaces in XML</a>
|
* <a href="http://www.w3.org/TR/REC-xml-names/#ns-using">Namespaces in XML</a>
|
||||||
* specification to "http://www.w3.org/XML/1998/namespace".
|
* specification to "http://www.w3.org/XML/1998/namespace".
|
||||||
*
|
*
|
||||||
* @param zero based index of attribute
|
* @param index zero based index of attribute
|
||||||
* @return attribute namespace,
|
* @return attribute namespace,
|
||||||
* empty string ("") is returned if namesapces processing is not enabled or
|
* empty string ("") is returned if namesapces processing is not enabled or
|
||||||
* namespaces processing is enabled but attribute has no namespace (it has no prefix).
|
* namespaces processing is enabled but attribute has no namespace (it has no prefix).
|
||||||
@@ -828,7 +828,7 @@ public interface XmlPullParser {
|
|||||||
* Throws an IndexOutOfBoundsException if the index is out of range
|
* Throws an IndexOutOfBoundsException if the index is out of range
|
||||||
* or current event type is not START_TAG.
|
* or current event type is not START_TAG.
|
||||||
*
|
*
|
||||||
* @param zero based index of attribute
|
* @param index zero based index of attribute
|
||||||
* @return attribute name (null is never returned)
|
* @return attribute name (null is never returned)
|
||||||
*/
|
*/
|
||||||
String getAttributeName (int index);
|
String getAttributeName (int index);
|
||||||
@@ -840,7 +840,7 @@ public interface XmlPullParser {
|
|||||||
* Throws an IndexOutOfBoundsException if the index is out of range
|
* Throws an IndexOutOfBoundsException if the index is out of range
|
||||||
* or current event type is not START_TAG.
|
* or current event type is not START_TAG.
|
||||||
*
|
*
|
||||||
* @param zero based index of attribute
|
* @param index zero based index of attribute
|
||||||
* @return attribute prefix or null if namespaces processing is not enabled.
|
* @return attribute prefix or null if namespaces processing is not enabled.
|
||||||
*/
|
*/
|
||||||
String getAttributePrefix(int index);
|
String getAttributePrefix(int index);
|
||||||
@@ -849,7 +849,7 @@ public interface XmlPullParser {
|
|||||||
* Returns the type of the specified attribute
|
* Returns the type of the specified attribute
|
||||||
* If parser is non-validating it MUST return CDATA.
|
* If parser is non-validating it MUST return CDATA.
|
||||||
*
|
*
|
||||||
* @param zero based index of attribute
|
* @param index zero based index of attribute
|
||||||
* @return attribute type (null is never returned)
|
* @return attribute type (null is never returned)
|
||||||
*/
|
*/
|
||||||
String getAttributeType(int index);
|
String getAttributeType(int index);
|
||||||
@@ -859,7 +859,7 @@ public interface XmlPullParser {
|
|||||||
* If parser is non-validating it MUST always return false.
|
* If parser is non-validating it MUST always return false.
|
||||||
* This information is part of XML infoset:
|
* This information is part of XML infoset:
|
||||||
*
|
*
|
||||||
* @param zero based index of attribute
|
* @param index zero based index of attribute
|
||||||
* @return false if attribute was in input
|
* @return false if attribute was in input
|
||||||
*/
|
*/
|
||||||
boolean isAttributeDefault(int index);
|
boolean isAttributeDefault(int index);
|
||||||
@@ -876,7 +876,7 @@ public interface XmlPullParser {
|
|||||||
*
|
*
|
||||||
* @see #defineEntityReplacementText
|
* @see #defineEntityReplacementText
|
||||||
*
|
*
|
||||||
* @param zero based index of attribute
|
* @param index zero based index of attribute
|
||||||
* @return value of attribute (null is never returned)
|
* @return value of attribute (null is never returned)
|
||||||
*/
|
*/
|
||||||
String getAttributeValue(int index);
|
String getAttributeValue(int index);
|
||||||
|
Reference in New Issue
Block a user