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