From 1d3f0fe96c1bbdaf7eb31d221a73c4b3dbaaae02 Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Mon, 15 Feb 2010 04:08:02 +0000 Subject: [PATCH] * Transport: - Update addressses before publishing - Increment address cost if near capacity - Synchronize notifyReplaceAddress() --- .../transport/CommSystemFacadeImpl.java | 18 +++++++++++-- .../net/i2p/router/transport/Transport.java | 1 + .../i2p/router/transport/TransportImpl.java | 16 ++++++++++-- .../router/transport/TransportManager.java | 6 +++++ .../router/transport/ntcp/NTCPTransport.java | 1 + .../router/transport/udp/UDPTransport.java | 25 ++++++++++++++++++- 6 files changed, 62 insertions(+), 5 deletions(-) diff --git a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java index 2ab19ea275..a49caec72e 100644 --- a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java +++ b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java @@ -256,7 +256,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade { * This should really be moved to ntcp/NTCPTransport.java, why is it here? */ @Override - public void notifyReplaceAddress(RouterAddress UDPAddr) { + public synchronized void notifyReplaceAddress(RouterAddress UDPAddr) { if (UDPAddr == null) return; NTCPTransport t = (NTCPTransport) _manager.getTransport(NTCPTransport.STYLE); @@ -348,7 +348,21 @@ public class CommSystemFacadeImpl extends CommSystemFacade { } if (!changed) { - _log.warn("No change to NTCP Address"); + if (oldAddr != null) { + int oldCost = oldAddr.getCost(); + int newCost = NTCPAddress.DEFAULT_COST; + if (TransportImpl.ADJUST_COST && !t.haveCapacity()) + newCost++; + if (newCost != oldCost) { + oldAddr.setCost(newCost); + if (_log.shouldLog(Log.WARN)) + _log.warn("Changing NTCP cost from " + oldCost + " to " + newCost); + } else { + _log.warn("No change to NTCP Address"); + } + } else { + _log.warn("No change to NTCP Address"); + } return; } diff --git a/router/java/src/net/i2p/router/transport/Transport.java b/router/java/src/net/i2p/router/transport/Transport.java index 339c33f7be..2f9ec74c0b 100644 --- a/router/java/src/net/i2p/router/transport/Transport.java +++ b/router/java/src/net/i2p/router/transport/Transport.java @@ -35,6 +35,7 @@ public interface Transport { public RouterAddress startListening(); public void stopListening(); public RouterAddress getCurrentAddress(); + public RouterAddress updateAddress(); public static final String SOURCE_UPNP = "upnp"; public static final String SOURCE_INTERFACE = "local"; public static final String SOURCE_CONFIG = "config"; // unused diff --git a/router/java/src/net/i2p/router/transport/TransportImpl.java b/router/java/src/net/i2p/router/transport/TransportImpl.java index 12ba8ad6b6..c4bab51324 100644 --- a/router/java/src/net/i2p/router/transport/TransportImpl.java +++ b/router/java/src/net/i2p/router/transport/TransportImpl.java @@ -32,6 +32,7 @@ import net.i2p.router.MessageSelector; import net.i2p.router.OutNetMessage; import net.i2p.router.Router; import net.i2p.router.RouterContext; +import net.i2p.router.RouterVersion; import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade; import net.i2p.util.ConcurrentHashSet; import net.i2p.util.Log; @@ -420,10 +421,23 @@ public abstract class TransportImpl implements Transport { } } + /** To protect dev anonymity. Set to true after 0.7.12 is out */ + public static final boolean ADJUST_COST = !RouterVersion.VERSION.equals("0.7.11"); + /** What addresses are we currently listening to? */ public RouterAddress getCurrentAddress() { return _currentAddress; } + + /** + * Ask the transport to update its address based on current information and return it + * Transports should override. + * @since 0.7.12 + */ + public RouterAddress updateAddress() { + return _currentAddress; + } + /** * Replace any existing addresses for the current transport with the given * one. @@ -433,8 +447,6 @@ public abstract class TransportImpl implements Transport { _currentAddress = address; if (_listener != null) _listener.transportAddressChanged(); - if ("SSU".equals(getStyle())) - _context.commSystem().notifyReplaceAddress(address); } /** diff --git a/router/java/src/net/i2p/router/transport/TransportManager.java b/router/java/src/net/i2p/router/transport/TransportManager.java index 0b988c03e2..c584341b9b 100644 --- a/router/java/src/net/i2p/router/transport/TransportManager.java +++ b/router/java/src/net/i2p/router/transport/TransportManager.java @@ -323,8 +323,14 @@ public class TransportManager implements TransportEventListener { return TransportImpl.getIP(dest); } + /** + * This forces a rebuild + */ public Map<String, RouterAddress> getAddresses() { Map<String, RouterAddress> rv = new HashMap(_transports.size()); + // do this first since SSU may force a NTCP change + for (Transport t : _transports) + t.updateAddress(); for (Transport t : _transports) { if (t.getCurrentAddress() != null) rv.put(t.getStyle(), t.getCurrentAddress()); diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java index a08f589c7b..4adb4e33ab 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java @@ -547,6 +547,7 @@ public class NTCPTransport extends TransportImpl { if (ctx == null) { System.err.println("NIO transport has no context?"); } else { + // this generally returns null -- see javadoc RouterAddress ra = CommSystemFacadeImpl.createNTCPAddress(ctx); if (ra != null) { NTCPAddress addr = new NTCPAddress(ra); diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java index 4c67cd4dc8..3884dd263c 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -1164,6 +1164,17 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority return (_context.getProperty(PROP_EXTERNAL_HOST) != null); } + /** + * Rebuild to get updated cost and introducers. + * Do not tell the router (he is the one calling this) + * @since 0.7.12 + */ + @Override + public RouterAddress updateAddress() { + rebuildExternalAddress(false); + return getCurrentAddress(); + } + void rebuildExternalAddress() { rebuildExternalAddress(true); } void rebuildExternalAddress(boolean allowRebuildRouterInfo) { // if the external port is specified, we want to use that to bind to even @@ -1216,7 +1227,10 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority options.setProperty(UDPAddress.PROP_INTRO_KEY, _introKey.toBase64()); RouterAddress addr = new RouterAddress(); - addr.setCost(DEFAULT_COST); + if (ADJUST_COST && !haveCapacity()) + addr.setCost(DEFAULT_COST + 1); + else + addr.setCost(DEFAULT_COST); addr.setExpiration(null); addr.setTransportStyle(STYLE); addr.setOptions(options); @@ -1241,6 +1255,15 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } } + /** + * Replace then tell NTCP that we changed. + */ + @Override + protected void replaceAddress(RouterAddress address) { + super.replaceAddress(address); + _context.commSystem().notifyReplaceAddress(address); + } + protected void replaceAddress(RouterAddress address, RouterAddress oldAddress) { replaceAddress(address); if (oldAddress != null) { -- GitLab