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;