< prev index next >

src/java.base/macosx/classes/java/net/DefaultInterface.java

Print this page
rev 16951 : [mq]: defaultInterface

@@ -48,14 +48,15 @@
     static NetworkInterface getDefault() {
         return defaultInterface;
     }
 
     /**
-     * Choose a default interface. This method returns an interface that is
-     * both "up" and supports multicast. This method choses an interface in
+     * Choose a default interface. This method returns the first interface that
+     * is both "up" and supports multicast. This method chooses an interface in
      * order of preference:
      * 1. neither loopback nor point to point
+     *    ( prefer interfaces with dual IP support )
      * 2. point to point
      * 3. loopback
      *
      * @return  the chosen interface or {@code null} if there isn't a suitable
      *          default

@@ -64,34 +65,58 @@
         Enumeration<NetworkInterface> nifs;
 
         try {
            nifs = NetworkInterface.getNetworkInterfaces();
         } catch (IOException ignore) {
-            // unable to enumate network interfaces
+            // unable to enumerate network interfaces
             return null;
         }
 
+        NetworkInterface preferred = null;
         NetworkInterface ppp = null;
         NetworkInterface loopback = null;
 
         while (nifs.hasMoreElements()) {
             NetworkInterface ni = nifs.nextElement();
             try {
-                if (ni.isUp() && ni.supportsMulticast()) {
+                if (!ni.isUp() || !ni.supportsMulticast())
+                    continue;
+
+                boolean ip4 = false, ip6 = false;
+                Enumeration<InetAddress> addrs = ni.getInetAddresses();
+                while (addrs.hasMoreElements()) {
+                    InetAddress addr = addrs.nextElement();
+                    if (!addr.isAnyLocalAddress()) {
+                        if (addr instanceof Inet4Address) {
+                            ip4 = true;
+                        } else if (addr instanceof Inet6Address) {
+                            ip6 = true;
+                        }
+                    }
+                }
+
                     boolean isLoopback = ni.isLoopback();
                     boolean isPPP = ni.isPointToPoint();
                     if (!isLoopback && !isPPP) {
                         // found an interface that is not the loopback or a
                         // point-to-point interface
+                    if (preferred == null) {
+                        preferred = ni;
+                    } else if (ip4 == true && ip6 == true){
                         return ni;
                     }
+                }
                     if (ppp == null && isPPP)
                         ppp = ni;
                     if (loopback == null && isLoopback)
                         loopback = ni;
-                }
+
             } catch (IOException skip) { }
         }
 
+        if (preferred != null) {
+            return preferred;
+        } else {
         return (ppp != null) ? ppp : loopback;
     }
+    }
 }
< prev index next >