Author: toad
Date: 2006-02-21 17:41:17 +0000 (Tue, 21 Feb 2006)
New Revision: 8086

Modified:
   trunk/freenet/src/freenet/io/comm/DMT.java
   trunk/freenet/src/freenet/node/Node.java
   trunk/freenet/src/freenet/node/NodeDispatcher.java
   trunk/freenet/src/freenet/node/PeerNode.java
   trunk/freenet/src/freenet/node/Version.java
Log:
456:
On-network IP address detection.
Not tested; please test!

Modified: trunk/freenet/src/freenet/io/comm/DMT.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/DMT.java  2006-02-21 17:13:00 UTC (rev 
8085)
+++ trunk/freenet/src/freenet/io/comm/DMT.java  2006-02-21 17:41:17 UTC (rev 
8086)
@@ -909,6 +909,16 @@
         return msg;
     }

+    public static final MessageType FNPDetectedIPAddress = new 
MessageType("FNPDetectedIPAddress") {{
+       addField(EXTERNAL_ADDRESS, Peer.class);
+    }};
+    
+    public static final Message createFNPDetectedIPAddress(Peer peer) {
+       Message msg = new Message(FNPDetectedIPAddress);
+       msg.set(EXTERNAL_ADDRESS, peer);
+       return msg;
+    }
+    
        public static void init() { }

 }

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2006-02-21 17:13:00 UTC (rev 
8085)
+++ trunk/freenet/src/freenet/node/Node.java    2006-02-21 17:41:17 UTC (rev 
8086)
@@ -15,7 +15,6 @@
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.OutputStreamWriter;
-import java.net.BindException;
 import java.net.InetAddress;
 import java.net.SocketException;
 import java.net.UnknownHostException;
@@ -28,17 +27,13 @@

 import pluginmanager.PluginManager;
 import pluginmanager.PluginRespirator;
-
-import snmplib.SNMPAgent;
 import snmplib.SNMPStarter;
-
 import freenet.client.ArchiveManager;
 import freenet.client.HighLevelSimpleClient;
 import freenet.client.HighLevelSimpleClientImpl;
 import freenet.client.async.ClientRequestScheduler;
 import freenet.clients.http.FproxyToadlet;
 import freenet.clients.http.SimpleToadletServer;
-import freenet.config.BooleanCallback;
 import freenet.config.Config;
 import freenet.config.FilePersistentConfig;
 import freenet.config.IntCallback;
@@ -79,18 +74,17 @@
 import freenet.store.BerkeleyDBFreenetStore;
 import freenet.store.FreenetStore;
 import freenet.support.BucketFactory;
-import freenet.support.FileLoggerHook;
 import freenet.support.HexUtil;
 import freenet.support.ImmutableByteArrayWrapper;
 import freenet.support.LRUHashtable;
 import freenet.support.LRUQueue;
 import freenet.support.Logger;
-import freenet.support.LoggerHookChain;
 import freenet.support.PaddedEphemerallyEncryptedBucketFactory;
 import freenet.support.SimpleFieldSet;
 import freenet.support.io.FilenameGenerator;
 import freenet.support.io.TempBucketFactory;
 import freenet.transport.IPAddressDetector;
+import freenet.transport.IPUtil;

 /**
  * @author amphibian
@@ -1318,6 +1312,8 @@
     }

     InetAddress overrideIPAddress;
+    /** Last detected IP address */
+    InetAddress lastIPAddress;

     /**
      * @return Our current main IP address.
@@ -1325,15 +1321,57 @@
      * detection properly with NetworkInterface, and we should use
      * third parties if available and UP&P if available.
      */
-    InetAddress getPrimaryIPAddress() {
+    InetAddress detectPrimaryIPAddress() {
         if(overrideIPAddress != null) {
             Logger.minor(this, "Returning overridden address: 
"+overrideIPAddress);
             return overrideIPAddress;
         }
         Logger.minor(this, "IP address not overridden");
-               return ipDetector.getAddress();
+               InetAddress addr = ipDetector.getAddress();
+               if(addr != null) return addr;
+               // Try to pick it up from our connections
+               if(peers == null) return null;
+               PeerNode[] peerList = peers.connectedPeers;
+               HashMap countsByPeer = new HashMap();
+               // FIXME use a standard mutable int object, we have one 
somewhere
+               for(int i=0;i<peerList.length;i++) {
+                       Peer p = peerList[i].getRemoteDetectedPeer();
+                       if(p == null || p.isNull()) continue;
+                       InetAddress ip = p.getAddress();
+                       if(!IPUtil.checkAddress(p.getAddress())) continue;
+                       if(countsByPeer.containsKey(ip)) {
+                               Integer count = (Integer) countsByPeer.get(ip);
+                               Integer newCount = new 
Integer(count.intValue()+1);
+                               countsByPeer.put(ip, newCount);
+                       } else {
+                               countsByPeer.put(ip, new Integer(1));
+                       }
+               }
+               if(countsByPeer.size() == 0) return null;
+               Iterator it = countsByPeer.keySet().iterator();
+               if(countsByPeer.size() == 1) {
+                       return (InetAddress) it.next();
+               }
+               // Pick most popular address
+               // FIXME use multi-homing here
+               InetAddress best = null;
+               int bestPopularity = 0;
+               while(it.hasNext()) {
+                       InetAddress cur = (InetAddress) it.next();
+                       int curPop = ((Integer) 
(countsByPeer.get(best))).intValue();
+                       if(curPop > bestPopularity) {
+                               bestPopularity = curPop;
+                                best = cur;
+                       }
+               }
+               return best;
     }

+    InetAddress getPrimaryIPAddress() {
+       if(lastIPAddress == null) return detectPrimaryIPAddress();
+       return lastIPAddress;
+    }
+    
     /**
      * Do a routed ping of another node on the network by its location.
      * @param loc2 The location of the other node to ping. It must match
@@ -1801,7 +1839,7 @@
        InetAddress lastIP;

        public void redetectAddress() {
-               InetAddress newIP = ipDetector.getAddress();
+               InetAddress newIP = detectPrimaryIPAddress();
                if(newIP.equals(lastIP)) return;
                writeNodeFile();
        }

Modified: trunk/freenet/src/freenet/node/NodeDispatcher.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeDispatcher.java  2006-02-21 17:13:00 UTC 
(rev 8085)
+++ trunk/freenet/src/freenet/node/NodeDispatcher.java  2006-02-21 17:41:17 UTC 
(rev 8086)
@@ -8,6 +8,7 @@
 import freenet.io.comm.Message;
 import freenet.io.comm.MessageType;
 import freenet.io.comm.NotConnectedException;
+import freenet.io.comm.Peer;
 import freenet.support.Logger;

 /**
@@ -87,6 +88,10 @@
                long id = m.getLong(DMT.PING_SEQNO);
                source.receivedLinkPong(id);
                return true;
+        } else if(spec == DMT.FNPDetectedIPAddress) {
+               Peer p = (Peer) m.getObject(DMT.EXTERNAL_ADDRESS);
+               source.setRemoteDetectedPeer(p);
+               node.redetectAddress();
         }
         return false;
     }

Modified: trunk/freenet/src/freenet/node/PeerNode.java
===================================================================
--- trunk/freenet/src/freenet/node/PeerNode.java        2006-02-21 17:13:00 UTC 
(rev 8085)
+++ trunk/freenet/src/freenet/node/PeerNode.java        2006-02-21 17:41:17 UTC 
(rev 8086)
@@ -61,6 +61,9 @@
     /** Advertised addresses */
     private Vector nominalPeer;

+    /** The PeerNode's report of our IP address */
+    private Peer remoteDetectedPeer;
+    
     /** Is this a testnet node? */
     public final boolean testnetEnabled;

@@ -749,10 +752,12 @@
      * Send any high level messages that need to be sent on connect.
      */
     private void sendInitialMessages() {
-        Message msg = 
DMT.createFNPLocChangeNotification(node.lm.loc.getValue());
+        Message locMsg = 
DMT.createFNPLocChangeNotification(node.lm.loc.getValue());
+        Message ipMsg = DMT.createFNPDetectedIPAddress(detectedPeer);

         try {
-            sendAsync(msg, null);
+            sendAsync(locMsg, null);
+            sendAsync(ipMsg, null);
         } catch (NotConnectedException e) {
             Logger.error(this, "Completed handshake but disconnected!!!", new 
Exception("error"));
         }
@@ -1172,5 +1177,13 @@
                throttledPacketSendAverage.report(timeDiff);
                Logger.minor(this, "Reporting throttled packet send time: 
"+timeDiff+" to "+getPeer());
        }
+
+       public void setRemoteDetectedPeer(Peer p) {
+               this.remoteDetectedPeer = p;
+       }
+       
+       public Peer getRemoteDetectedPeer() {
+               return remoteDetectedPeer;
+       }
 }


Modified: trunk/freenet/src/freenet/node/Version.java
===================================================================
--- trunk/freenet/src/freenet/node/Version.java 2006-02-21 17:13:00 UTC (rev 
8085)
+++ trunk/freenet/src/freenet/node/Version.java 2006-02-21 17:41:17 UTC (rev 
8086)
@@ -20,7 +20,7 @@
        public static final String protocolVersion = "1.0";

        /** The build number of the current revision */
-       private static final int buildNumber = 455;
+       private static final int buildNumber = 456;

        /** Oldest build of Fred we will talk to */
        private static final int lastGoodBuild = 403;


Reply via email to