Author: toad
Date: 2006-11-08 17:47:54 +0000 (Wed, 08 Nov 2006)
New Revision: 10835
Added:
trunk/freenet/src/freenet/support/transport/
trunk/freenet/src/freenet/support/transport/ip/
trunk/freenet/src/freenet/support/transport/ip/IPAddressDetector.java
trunk/freenet/src/freenet/support/transport/ip/IPUtil.java
Removed:
trunk/freenet/src/freenet/transport/
Modified:
trunk/freenet/src/freenet/io/comm/FreenetInetAddress.java
trunk/freenet/src/freenet/io/comm/Peer.java
trunk/freenet/src/freenet/node/IPDetectorPluginManager.java
trunk/freenet/src/freenet/node/NodeIPDetector.java
Log:
move freenet.transport to freenet.support.transport.ip
Modified: trunk/freenet/src/freenet/io/comm/FreenetInetAddress.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/FreenetInetAddress.java 2006-11-08
17:37:51 UTC (rev 10834)
+++ trunk/freenet/src/freenet/io/comm/FreenetInetAddress.java 2006-11-08
17:47:54 UTC (rev 10835)
@@ -11,7 +11,7 @@
import freenet.io.AddressIdentifier;
import freenet.support.Logger;
-import freenet.transport.IPUtil;
+import freenet.support.transport.ip.IPUtil;
/**
* Long-term InetAddress. If created with an IP address, then the IP address
is primary.
Modified: trunk/freenet/src/freenet/io/comm/Peer.java
===================================================================
--- trunk/freenet/src/freenet/io/comm/Peer.java 2006-11-08 17:37:51 UTC (rev
10834)
+++ trunk/freenet/src/freenet/io/comm/Peer.java 2006-11-08 17:47:54 UTC (rev
10835)
@@ -23,7 +23,7 @@
import java.net.*;
import freenet.io.WritableToDataOutputStream;
-import freenet.transport.IPUtil;
+import freenet.support.transport.ip.IPUtil;
/**
* @author ian
Modified: trunk/freenet/src/freenet/node/IPDetectorPluginManager.java
===================================================================
--- trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2006-11-08
17:37:51 UTC (rev 10834)
+++ trunk/freenet/src/freenet/node/IPDetectorPluginManager.java 2006-11-08
17:47:54 UTC (rev 10835)
@@ -11,7 +11,7 @@
import freenet.pluginmanager.DetectedIP;
import freenet.pluginmanager.FredPluginIPDetector;
import freenet.support.Logger;
-import freenet.transport.IPUtil;
+import freenet.support.transport.ip.IPUtil;
/**
* Tracks all known IP address detection plugins, and runs them when
appropriate.
Modified: trunk/freenet/src/freenet/node/NodeIPDetector.java
===================================================================
--- trunk/freenet/src/freenet/node/NodeIPDetector.java 2006-11-08 17:37:51 UTC
(rev 10834)
+++ trunk/freenet/src/freenet/node/NodeIPDetector.java 2006-11-08 17:47:54 UTC
(rev 10835)
@@ -20,8 +20,8 @@
import freenet.pluginmanager.DetectedIP;
import freenet.pluginmanager.FredPluginIPDetector;
import freenet.support.Logger;
-import freenet.transport.IPAddressDetector;
-import freenet.transport.IPUtil;
+import freenet.support.transport.ip.IPAddressDetector;
+import freenet.support.transport.ip.IPUtil;
public class NodeIPDetector {
Copied: trunk/freenet/src/freenet/support/transport/ip/IPAddressDetector.java
(from rev 10830, trunk/freenet/src/freenet/transport/IPAddressDetector.java)
===================================================================
--- trunk/freenet/src/freenet/transport/IPAddressDetector.java 2006-11-05
20:30:44 UTC (rev 10830)
+++ trunk/freenet/src/freenet/support/transport/ip/IPAddressDetector.java
2006-11-08 17:47:54 UTC (rev 10835)
@@ -0,0 +1,232 @@
+/* -*- Mode: java; c-basic-indent: 4; tab-width: 4 -*- */
+package freenet.support.transport.ip;
+
+import java.net.DatagramSocket;
+import java.net.InetAddress;
+import java.net.SocketException;
+import java.net.UnknownHostException;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import freenet.node.NodeIPDetector;
+import freenet.support.Logger;
+
+/**
+ * A class to autodetect our IP address(es)
+ */
+
+public class IPAddressDetector implements Runnable {
+
+ //private String preferedAddressString = null;
+ private final int interval;
+ private final NodeIPDetector detector;
+ public IPAddressDetector(int interval, NodeIPDetector detector) {
+ this.interval = interval;
+ this.detector = detector;
+ }
+
+ /**
+ * @return our name
+ */
+ public String getCheckpointName() {
+ return "Autodetection of IP addresses";
+ }
+
+ /**
+ * @return next scheduling point
+ */
+ public long nextCheckpoint() {
+ return System.currentTimeMillis() + interval; // We are pretty
cheap
+ }
+
+ InetAddress lastInetAddress = null;
+ InetAddress[] lastAddressList = null;
+ long lastDetectedTime = -1;
+
+ /**
+ * Fetches the currently detected IP address. If not detected yet a
detection is forced
+ * @return Detected ip address
+ */
+ public InetAddress[] getAddress() {
+ return getAddress(0);
+ }
+
+ /**
+ * Get the IP address
+ * @return Detected ip address
+ */
+ public InetAddress[] getAddress(long recheckTime) {
+ if(System.currentTimeMillis() > (lastDetectedTime + recheckTime)
+ || lastAddressList == null)
+ checkpoint();
+ return lastAddressList == null ? new InetAddress[0] :
lastAddressList;
+ }
+
+ boolean old = false;
+
+ /**
+ * Execute a checkpoint - detect our internet IP address and log it
+ * @param preferedAddress An address that for some reason is prefered
above others. Might be null
+ */
+ protected synchronized void checkpoint() {
+ boolean logDEBUG = Logger.shouldLog(Logger.DEBUG, this);
+ Vector addrs = new Vector();
+
+ Enumeration interfaces = null;
+ try {
+ interfaces =
java.net.NetworkInterface.getNetworkInterfaces();
+ } catch (NoClassDefFoundError e) {
+ addrs.add(oldDetect());
+ old = true;
+ } catch (SocketException e) {
+ Logger.error(
+ this,
+ "SocketException trying to detect
NetworkInterfaces",
+ e);
+ addrs.add(oldDetect());
+ old = true;
+ }
+
+ if (!old) {
+ while (interfaces.hasMoreElements()) {
+ java.net.NetworkInterface iface =
+ (java.net.NetworkInterface)
(interfaces.nextElement());
+ if (logDEBUG)
+ Logger.debug(
+ this,
+ "Scanning NetworkInterface " +
iface.getDisplayName());
+ Enumeration ee = iface.getInetAddresses();
+ while (ee.hasMoreElements()) {
+
+ InetAddress addr = (InetAddress)
(ee.nextElement());
+ addrs.add(addr);
+ if (logDEBUG)
+ Logger.debug(
+ this,
+ "Adding address "
+ + addr
+ + " from "
+ +
iface.getDisplayName());
+ }
+ if (logDEBUG)
+ Logger.debug(
+ this,
+ "Finished scanning interface "
+ iface.getDisplayName());
+ }
+ if (logDEBUG)
+ Logger.debug(
+ this,
+ "Finished scanning interfaces");
+ }
+
+ InetAddress oldAddress = lastInetAddress;
+ onGetAddresses(addrs);
+ lastDetectedTime = System.currentTimeMillis();
+ if ((oldAddress != null) && (lastInetAddress != null) &&
+ !lastInetAddress.equals(oldAddress)) {
+ Logger.minor(
+ this,
+ "Public IP Address changed from "
+ + oldAddress.getHostAddress()
+ + " to "
+ + lastInetAddress.getHostAddress());
+ detector.redetectAddress();
+ // We know it changed
+ }
+ }
+
+ protected InetAddress oldDetect() {
+ boolean shouldLog = Logger.shouldLog(Logger.DEBUG, this);
+ if (shouldLog)
+ Logger.debug(
+ this,
+ "Running old style detection code");
+ DatagramSocket ds = null;
+ try {
+ try {
+ ds = new DatagramSocket();
+ } catch (SocketException e) {
+ Logger.error(this, "SocketException", e);
+ return null;
+ }
+
+ // This does not transfer any data
+ // The ip is a.root-servers.net, 42 is DNS
+ try {
+ ds.connect(InetAddress.getByName("198.41.0.4"),
42);
+ } catch (UnknownHostException ex) {
+ Logger.error(this, "UnknownHostException", ex);
+ return null;
+ }
+ return ds.getLocalAddress();
+ } finally {
+ if (ds != null) {
+ ds.close();
+ }
+ }
+ }
+
+ /** Do something with the list of detected IP addresses.
+ * @param v Vector of InetAddresses
+ * @param preferedInetAddress An address that for some reason is
prefered above others. Might be null
+ */
+ protected void onGetAddresses(Vector v) {
+ Vector output = new Vector();
+ boolean logDEBUG = Logger.shouldLog(Logger.DEBUG, this);
+ if (logDEBUG)
+ Logger.debug(
+ this,
+ "onGetAddresses found " + v.size() + "
potential addresses)");
+ if (v.size() == 0) {
+ Logger.error(this, "No addresses found!");
+ lastAddressList = null;
+ } else {
+// InetAddress lastNonValidAddress = null;
+ for (int x = 0; x < v.size(); x++) {
+ if (v.elementAt(x) != null) {
+ InetAddress i = (InetAddress)
(v.elementAt(x));
+ if (logDEBUG)
+ Logger.debug(
+ this,
+ "Address " + x + ": " +
i);
+ if(IPUtil.isValidAddress(i,
detector.includeLocalAddressesInNoderefs)) {
+ output.add(i);
+ }
+ if(i.isAnyLocalAddress()) {
+ // Wildcard address, 0.0.0.0,
ignore.
+ } else if(i.isLinkLocalAddress() ||
i.isLoopbackAddress() ||
+ i.isSiteLocalAddress())
{
+
if(detector.includeLocalAddressesInNoderefs()) {
+ output.add(i);
+ }
+ } else if(i.isMulticastAddress()) {
+ // Ignore
+ } else {
+ output.add(i);
+ }
+ }
+ }
+ }
+ lastAddressList = (InetAddress[]) output.toArray(new
InetAddress[output.size()]);
+ }
+
+ public void run() {
+ while(true) {
+ try {
+ Thread.sleep(interval);
+ } catch (InterruptedException e) {
+ // Ignore
+ }
+ try {
+ checkpoint();
+ } catch (Throwable t) {
+ Logger.error(this, "Caught "+t, t);
+ }
+ }
+ }
+
+ public void clearCached() {
+ lastAddressList = null;
+ lastDetectedTime = -1;
+ }
+}
Copied: trunk/freenet/src/freenet/support/transport/ip/IPUtil.java (from rev
10830, trunk/freenet/src/freenet/transport/IPUtil.java)
===================================================================
--- trunk/freenet/src/freenet/transport/IPUtil.java 2006-11-05 20:30:44 UTC
(rev 10830)
+++ trunk/freenet/src/freenet/support/transport/ip/IPUtil.java 2006-11-08
17:47:54 UTC (rev 10835)
@@ -0,0 +1,30 @@
+/* This code is part of Freenet. It is distributed under the GNU General
+ * Public License, version 2 (or at your option any later version). See
+ * http://www.gnu.org/ for further details of the GPL. */
+package freenet.support.transport.ip;
+
+import java.net.InetAddress;
+
+public class IPUtil {
+
+ static final boolean strict = true;
+
+ public static boolean isValidAddress(InetAddress i, boolean
includeLocalAddressesInNoderefs) {
+ if(i.isAnyLocalAddress()) {
+ // Wildcard address, 0.0.0.0, ignore.
+ return false;
+ } else if(i.isLinkLocalAddress() || i.isLoopbackAddress() ||
+ i.isSiteLocalAddress()) {
+ if(includeLocalAddressesInNoderefs) {
+ return true;
+ } else return false;
+ } else if(i.isMulticastAddress()) {
+ // Ignore
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+
+}