From 04544ac9e07db0a7f45954e90c2dce9351c2d81f Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Sun, 22 Jan 2012 16:43:45 +0000
Subject: [PATCH]   * Transports: Bind only to a single interface if specified 
                as the host address and it's available (ticket #591)

---
 .../router/transport/ntcp/NTCPTransport.java  | 26 +++++++++++++++++--
 .../router/transport/udp/UDPTransport.java    | 18 +++++++++++++
 2 files changed, 42 insertions(+), 2 deletions(-)

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 de39759eaf..ac6856a5b7 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java
@@ -13,6 +13,7 @@ import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
@@ -30,6 +31,7 @@ import net.i2p.router.transport.CommSystemFacadeImpl;
 import net.i2p.router.transport.Transport;
 import net.i2p.router.transport.TransportBid;
 import net.i2p.router.transport.TransportImpl;
+import net.i2p.util.Addresses;
 import net.i2p.util.ConcurrentHashSet;
 import net.i2p.util.Log;
 import net.i2p.util.Translate;
@@ -515,6 +517,23 @@ public class NTCPTransport extends TransportImpl {
         if (_myAddress != null) {
             InetAddress bindToAddr = null;
             String bindTo = _context.getProperty(PROP_BIND_INTERFACE);
+
+            if (bindTo == null) {
+                // If we are configured with a fixed IP address,
+                // AND it's one of our local interfaces,
+                // bind only to that.
+                boolean isFixed = _context.getProperty(CommSystemFacadeImpl.PROP_I2NP_NTCP_AUTO_IP, "true")
+                                  .toLowerCase(Locale.US).equals("false");
+                String fixedHost = _context.getProperty(CommSystemFacadeImpl.PROP_I2NP_NTCP_HOSTNAME);
+                if (isFixed && fixedHost != null) {
+                    try {
+                        String testAddr = InetAddress.getByName(fixedHost).getHostAddress();
+                        if (Addresses.getAddresses().contains(testAddr))
+                            bindTo = testAddr;
+                    } catch (UnknownHostException uhe) {}
+                }
+            }
+
             if (bindTo != null) {
                 try {
                     bindToAddr = InetAddress.getByName(bindTo);
@@ -532,10 +551,13 @@ public class NTCPTransport extends TransportImpl {
                 chan.configureBlocking(false);
 
                 InetSocketAddress addr = null;
-                if(bindToAddr==null)
+                if(bindToAddr==null) {
                     addr = new InetSocketAddress(_myAddress.getPort());
-                else
+                } else {
                     addr = new InetSocketAddress(bindToAddr, _myAddress.getPort());
+                    if (_log.shouldLog(Log.WARN))
+                        _log.warn("Binding only to " + bindToAddr);
+                }
                 chan.socket().bind(addr);
                 if (_log.shouldLog(Log.INFO))
                     _log.info("Listening on " + addr);
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 3f233c53cb..11b3e29d08 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
@@ -35,6 +35,7 @@ import net.i2p.router.transport.Transport;
 import net.i2p.router.transport.TransportBid;
 import net.i2p.router.transport.TransportImpl;
 import net.i2p.router.util.RandomIterator;
+import net.i2p.util.Addresses;
 import net.i2p.util.ConcurrentHashSet;
 import net.i2p.util.Log;
 import net.i2p.util.SimpleScheduler;
@@ -255,6 +256,21 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
 
         // bind host
         String bindTo = _context.getProperty(PROP_BIND_INTERFACE);
+
+        if (bindTo == null) {
+            // If we are configured with a fixed IP address,
+            // AND it's one of our local interfaces,
+            // bind only to that.
+            String fixedHost = _context.getProperty(PROP_EXTERNAL_HOST);
+            if (fixedHost != null && fixedHost.length() > 0) {
+                try {
+                    String testAddr = InetAddress.getByName(fixedHost).getHostAddress();
+                    if (Addresses.getAddresses().contains(testAddr))
+                        bindTo = testAddr;
+                } catch (UnknownHostException uhe) {}
+            }
+        }
+
         InetAddress bindToAddr = null;
         if (bindTo != null) {
             try {
@@ -281,6 +297,8 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         } else {
             port = _externalListenPort;
         }
+        if (bindToAddr != null && _log.shouldLog(Log.WARN))
+            _log.warn("Binding only to " + bindToAddr);
         if (_log.shouldLog(Log.INFO))
             _log.info("Binding to the port: " + port);
         if (_endpoint == null) {
-- 
GitLab