diff --git a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java index 7b73be4e3..51a5bb989 100644 --- a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java +++ b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java @@ -75,6 +75,9 @@ public class CommSystemFacadeImpl extends CommSystemFacade { RouterAddress addr = createTCPAddress(); if (addr != null) addresses.add(addr); + + addresses.addAll(_manager.getAddresses()); + if (_log.shouldLog(Log.INFO)) _log.info("Creating addresses: " + addresses); return addresses; @@ -91,7 +94,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade { String name = _context.router().getConfigSetting(PROP_I2NP_TCP_HOSTNAME); String port = _context.router().getConfigSetting(PROP_I2NP_TCP_PORT); if ( (name == null) || (port == null) ) { - _log.info("TCP Host/Port not specified in config file - skipping TCP transport"); + //_log.info("TCP Host/Port not specified in config file - skipping TCP transport"); return null; } else { _log.info("Creating TCP address on " + name + ":" + port); diff --git a/router/java/src/net/i2p/router/transport/TransportManager.java b/router/java/src/net/i2p/router/transport/TransportManager.java index e81a1f6f0..35beef902 100644 --- a/router/java/src/net/i2p/router/transport/TransportManager.java +++ b/router/java/src/net/i2p/router/transport/TransportManager.java @@ -36,7 +36,6 @@ import net.i2p.util.Log; public class TransportManager implements TransportEventListener { private Log _log; private List _transports; - private List _addresses; private RouterContext _context; private final static String PROP_DISABLE_TCP = "i2np.tcp.disable"; @@ -45,7 +44,6 @@ public class TransportManager implements TransportEventListener { _context = context; _log = _context.logManager().getLog(TransportManager.class); _transports = new ArrayList(); - _addresses = new ArrayList(); } public void addTransport(Transport transport) { @@ -77,7 +75,6 @@ public class TransportManager implements TransportEventListener { for (int i = 0; i < _transports.size(); i++) { Transport t = (Transport)_transports.get(i); RouterAddress addr = t.startListening(); - if (addr != null) _addresses.add(addr); _log.debug("Transport " + i + " (" + t.getStyle() + ") started"); } _log.debug("Done start listening on transports"); @@ -94,7 +91,6 @@ public class TransportManager implements TransportEventListener { ((Transport)_transports.get(i)).stopListening(); } _transports.clear(); - _addresses.clear(); } private boolean isSupported(Set addresses, Transport t) { @@ -114,6 +110,15 @@ public class TransportManager implements TransportEventListener { return peers; } + List getAddresses() { + List rv = new ArrayList(_transports.size()); + for (int i = 0; i < _transports.size(); i++) { + Transport t = (Transport)_transports.get(i); + rv.addAll(t.getCurrentAddresses()); + } + return rv; + } + public List getBids(OutNetMessage msg) { if (msg == null) throw new IllegalArgumentException("Null message? no bidding on a null outNetMessage!"); @@ -264,9 +269,12 @@ public class TransportManager implements TransportEventListener { StringBuffer buf = new StringBuffer(8*1024); buf.append("
\n");
- for (Iterator iter = _addresses.iterator(); iter.hasNext(); ) {
- RouterAddress addr = (RouterAddress)iter.next();
- buf.append(addr.toString()).append("\n\n");
+ for (int i = 0; i < _transports.size(); i++) {
+ Transport t = (Transport)_transports.get(i);
+ for (Iterator iter = t.getCurrentAddresses().iterator(); iter.hasNext(); ) {
+ RouterAddress addr = (RouterAddress)iter.next();
+ buf.append(addr.toString()).append("\n\n");
+ }
}
buf.append("\n");
for (Iterator iter = _transports.iterator(); iter.hasNext(); ) {
diff --git a/router/java/src/net/i2p/router/transport/tcp/ConnectionBuilder.java b/router/java/src/net/i2p/router/transport/tcp/ConnectionBuilder.java
index 9aecad544..9a2bfa89d 100644
--- a/router/java/src/net/i2p/router/transport/tcp/ConnectionBuilder.java
+++ b/router/java/src/net/i2p/router/transport/tcp/ConnectionBuilder.java
@@ -610,7 +610,7 @@ public class ConnectionBuilder {
case 1: // not reachable
fail("According to "
+ _target.getIdentity().calculateHash().toBase64().substring(0,6)
- + ", we are not reachable on " + _localIP);
+ + ", we are not reachable on " + _localIP + ":" + _transport.getPort());
return false;
case 2: // clock skew
fail("According to "
diff --git a/router/java/src/net/i2p/router/transport/tcp/ConnectionHandler.java b/router/java/src/net/i2p/router/transport/tcp/ConnectionHandler.java
index 1485317d3..1593b6dda 100644
--- a/router/java/src/net/i2p/router/transport/tcp/ConnectionHandler.java
+++ b/router/java/src/net/i2p/router/transport/tcp/ConnectionHandler.java
@@ -639,6 +639,9 @@ public class ConnectionHandler {
private boolean verifyReachability() {
if (_actualPeer == null) return false;
_remoteAddress = new TCPAddress(_actualPeer.getTargetAddress(TCPTransport.STYLE));
+ if (!_transport.allowAddress(_remoteAddress))
+ return false;
+
//if (true) return true;
Socket s = null;
try {
diff --git a/router/java/src/net/i2p/router/transport/tcp/TCPAddress.java b/router/java/src/net/i2p/router/transport/tcp/TCPAddress.java
index ee9d4a17e..a71c420c0 100644
--- a/router/java/src/net/i2p/router/transport/tcp/TCPAddress.java
+++ b/router/java/src/net/i2p/router/transport/tcp/TCPAddress.java
@@ -92,6 +92,9 @@ public class TCPAddress {
RouterAddress addr = new RouterAddress();
+ addr.setCost(10);
+ addr.setExpiration(null);
+
Properties props = new Properties();
props.setProperty(PROP_HOST, _host);
props.setProperty(PROP_PORT, ""+_port);
@@ -141,7 +144,8 @@ public class TCPAddress {
public boolean equals(Object val) {
if ( (val != null) && (val instanceof TCPAddress) ) {
TCPAddress addr = (TCPAddress)val;
- if ( (_addr != null) && (_addr.getHostAddress() != null) ) {
+ if ( (_addr != null) && (_addr.getHostAddress() != null)
+ && (addr.getAddress() != null) && (addr.getAddress().getHostAddress() != null) ) {
return DataHelper.eq(getAddress().getHostAddress(), addr.getAddress().getHostAddress())
&& (getPort() == addr.getPort());
} else {
diff --git a/router/java/src/net/i2p/router/transport/tcp/TCPListener.java b/router/java/src/net/i2p/router/transport/tcp/TCPListener.java
index 61ac9117d..9487f1eb6 100644
--- a/router/java/src/net/i2p/router/transport/tcp/TCPListener.java
+++ b/router/java/src/net/i2p/router/transport/tcp/TCPListener.java
@@ -63,7 +63,14 @@ class TCPListener {
public void startListening() {
TCPAddress addr = _transport.getMyAddress();
- if (addr != null) {
+ if ( (addr != null) && (addr.getHost() != null) && (addr.getPort() > 0) ) {
+ if (_listener != null) {
+ if (_log.shouldLog(Log.WARN))
+ _log.warn("Not starting another listener on " + addr
+ + " while already listening on " + _listener.getMyAddress());
+ return;
+ }
+
_listener = new ListenerRunner(addr);
Thread t = new I2PThread(_listener, "Listener [" + addr.getPort()+"]");
t.setDaemon(true);
@@ -80,7 +87,9 @@ class TCPListener {
}
public void stopListening() {
- _listener.stopListening();
+ if (_listener != null)
+ _listener.stopListening();
+
for (int i = 0; i < _handlers.size(); i++) {
SocketHandler h = (SocketHandler)_handlers.get(i);
h.stopHandling();
@@ -93,6 +102,7 @@ class TCPListener {
_socket = null;
} catch (IOException ioe) {}
}
+ _listener = null;
}
private InetAddress getInetAddress(String host) {
@@ -119,6 +129,8 @@ class TCPListener {
}
public void stopListening() { _isRunning = false; }
+ public TCPAddress getMyAddress() { return _myAddress; }
+
public void run() {
if (_log.shouldLog(Log.INFO))
_log.info("Beginning TCP listener");
diff --git a/router/java/src/net/i2p/router/transport/tcp/TCPTransport.java b/router/java/src/net/i2p/router/transport/tcp/TCPTransport.java
index ae1467f5b..9aff2a2a7 100644
--- a/router/java/src/net/i2p/router/transport/tcp/TCPTransport.java
+++ b/router/java/src/net/i2p/router/transport/tcp/TCPTransport.java
@@ -270,7 +270,7 @@ public class TCPTransport extends TransportImpl {
*
* @param address address that the remote host said was ours
*/
- void ourAddressReceived(String address) {
+ synchronized void ourAddressReceived(String address) {
if (allowAddressUpdate()) {
int port = getPort();
TCPAddress addr = new TCPAddress(address, port);
@@ -282,6 +282,8 @@ public class TCPTransport extends TransportImpl {
return;
}
}
+ if (_log.shouldLog(Log.INFO))
+ _log.info("Update our local address to " + address);
updateAddress(addr);
}
} else {
@@ -361,10 +363,10 @@ public class TCPTransport extends TransportImpl {
}
/**
- * Is the given address a valid one that we could listen to?
+ * Is the given address a valid one that we could listen to or contact?
*
*/
- private boolean allowAddress(TCPAddress address) {
+ boolean allowAddress(TCPAddress address) {
if (address == null) return false;
if ( (address.getPort() <= 0) || (address.getPort() > 65535) )
return false;
@@ -391,7 +393,6 @@ public class TCPTransport extends TransportImpl {
RouterAddress routerAddr = addr.toRouterAddress();
_myAddress = addr;
_listener.stopListening();
- _listener.startListening();
Set addresses = getCurrentAddresses();
List toRemove = null;
@@ -411,6 +412,11 @@ public class TCPTransport extends TransportImpl {
addresses.add(routerAddr);
_context.router().rebuildRouterInfo();
+
+ if (_log.shouldLog(Log.INFO))
+ _log.info("Updating our local address to include " + addr.toString()
+ + " and modified our routerInfo to have: "
+ + _context.router().getRouterInfo().getAddresses());
_listener.startListening();
}
@@ -435,7 +441,7 @@ public class TCPTransport extends TransportImpl {
*
* @return the port number, or -1 if there is no valid port
*/
- private int getPort() {
+ int getPort() {
if ( (_myAddress != null) && (_myAddress.getPort() > 0) )
return _myAddress.getPort();