diff --git a/core/java/src/net/i2p/util/Addresses.java b/core/java/src/net/i2p/util/Addresses.java index c824c5f7d063c6f18f54be4f4cb2dc30cad3db04..cd773bdd9a20b40c792e337c214c267e136beffd 100644 --- a/core/java/src/net/i2p/util/Addresses.java +++ b/core/java/src/net/i2p/util/Addresses.java @@ -25,6 +25,15 @@ import net.i2p.I2PAppContext; */ public abstract class Addresses { + /** + * Do we have any non-loop, non-wildcard IPv4 address at all? + * @since 0.9.4 + */ + public static boolean isConnected() { + // not as good as using a Java DBus implementation to talk to NetworkManager... + return !getAddresses(true, false, false).isEmpty(); + } + /** @return the first non-local address it finds, or null */ public static String getAnyAddress() { SortedSet<String> a = getAddresses(); @@ -51,13 +60,28 @@ public abstract class Addresses { } /** - * @return a sorted array of all addresses + * @return a sorted set of all addresses including wildcard * @param includeLocal whether to include local * @param includeIPv6 whether to include IPV6 * @return an array of all addresses * @since 0.8.3 */ public static SortedSet<String> getAddresses(boolean includeLocal, boolean includeIPv6) { + return getAddresses(includeLocal, includeLocal, includeIPv6); + } + + /** + * @return a sorted set of all addresses + * @param includeSiteLocal whether to include private like 192.168.x.x + * @param includeLoopAndWildcard whether to include 127.x.x.x and 0.0.0.0 + * @param includeIPv6 whether to include IPV6 + * @param includeWildCard whether to include 0.0.0.0 and/or 0:0:0:0:0:0 (includeLocal must be true) + * @return an array of all addresses + * @since 0.9.4 + */ + public static SortedSet<String> getAddresses(boolean includeSiteLocal, + boolean includeLoopbackAndWildcard, + boolean includeIPv6) { boolean haveIPv4 = false; boolean haveIPv6 = false; SortedSet<String> rv = new TreeSet(); @@ -70,7 +94,8 @@ public abstract class Addresses { haveIPv4 = true; else haveIPv6 = true; - if (shouldInclude(allMyIps[i], includeLocal, includeIPv6)) + if (shouldInclude(allMyIps[i], includeSiteLocal, + includeLoopbackAndWildcard, includeIPv6)) rv.add(allMyIps[i].getHostAddress()); } } @@ -87,34 +112,39 @@ public abstract class Addresses { haveIPv4 = true; else haveIPv6 = true; - if (shouldInclude(addr, includeLocal, includeIPv6)) + if (shouldInclude(addr, includeSiteLocal, + includeLoopbackAndWildcard, includeIPv6)) rv.add(addr.getHostAddress()); } } } } catch (SocketException e) {} - if (includeLocal && haveIPv4) - rv.add("0.0.0.0"); - if (includeLocal && includeIPv6 && haveIPv6) - rv.add("0:0:0:0:0:0:0:0"); // we could do "::" but all the other ones are probably in long form + if (includeLoopbackAndWildcard) { + if (haveIPv4) + rv.add("0.0.0.0"); + if (includeIPv6 && haveIPv6) + rv.add("0:0:0:0:0:0:0:0"); // we could do "::" but all the other ones are probably in long form + } return rv; } - private static boolean shouldInclude(InetAddress ia, boolean includeLocal, boolean includeIPv6) { + private static boolean shouldInclude(InetAddress ia, boolean includeSiteLocal, + boolean includeLoopbackAndWildcard, boolean includeIPv6) { return - (!ia.isLinkLocalAddress()) && + (!ia.isLinkLocalAddress()) && // 169.254.x.x (!ia.isMulticastAddress()) && - (includeLocal || + (includeLoopbackAndWildcard || ((!ia.isAnyLocalAddress()) && - (!ia.isLoopbackAddress()) && - (!ia.isSiteLocalAddress()))) && + (!ia.isLoopbackAddress()))) && + (includeSiteLocal || + !ia.isSiteLocalAddress()) && // Hamachi 5/8 allocated to RIPE (30 November 2010) // Removed from TransportImpl.isPubliclyRoutable() // Check moved to here, for now, but will eventually need to // remove it from here also. - (includeLocal || - (!ia.getHostAddress().startsWith("5."))) && + //(includeLocal || + //(!ia.getHostAddress().startsWith("5."))) && (includeIPv6 || (ia instanceof Inet4Address)); } @@ -247,13 +277,18 @@ public abstract class Addresses { * Print out the local addresses */ public static void main(String[] args) { - System.err.println("External Addresses:"); - Set<String> a = getAddresses(false, false); + System.err.println("External IPv4 Addresses:"); + Set<String> a = getAddresses(false, false, false); + for (String s : a) + System.err.println(s); + System.err.println("\nExternal and Local IPv4 Addresses:"); + a = getAddresses(true, false, false); for (String s : a) System.err.println(s); - System.err.println("All addresses:"); - a = getAddresses(true, true); + System.err.println("\nAll addresses:"); + a = getAddresses(true, true, true); for (String s : a) System.err.println(s); + System.err.println("\nIs connected? " + isConnected()); } } diff --git a/router/java/src/net/i2p/router/transport/UPnPManager.java b/router/java/src/net/i2p/router/transport/UPnPManager.java index aecd726bd3e80b10624ebdbbc75efc2f2017f260..63acc65c09d80c86902a285bd96d1dd5ae188fc4 100644 --- a/router/java/src/net/i2p/router/transport/UPnPManager.java +++ b/router/java/src/net/i2p/router/transport/UPnPManager.java @@ -81,13 +81,7 @@ class UPnPManager { if (!_isRunning) { // Do we have a non-loopback, non-broadcast address? // If not, that's why it failed (HTTPServer won't start) - Set<String> addrs = Addresses.getAddresses(true, false); - addrs.remove("0.0.0.0"); - for (Iterator<String> iter = addrs.iterator(); iter.hasNext(); ) { - if (iter.next().startsWith("127.")) - iter.remove(); - } - if (addrs.isEmpty()) + if (!Addresses.isConnected()) _log.logAlways(Log.WARN, "UPnP start failed - no network connection?"); else _log.error("UPnP start failed - port conflict?");