diff options
-rw-r--r-- | build/android/gtest_filter/net_unittests_disabled | 1 | ||||
-rw-r--r-- | net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java | 55 | ||||
-rw-r--r-- | net/android/network_library.cc | 7 | ||||
-rw-r--r-- | net/android/network_library.h | 6 | ||||
-rw-r--r-- | net/base/net_util_posix.cc | 32 |
5 files changed, 94 insertions, 7 deletions
diff --git a/build/android/gtest_filter/net_unittests_disabled b/build/android/gtest_filter/net_unittests_disabled index 75214b4..be5af81 100644 --- a/build/android/gtest_filter/net_unittests_disabled +++ b/build/android/gtest_filter/net_unittests_disabled @@ -2,7 +2,6 @@ # Generated by hand to get net_unittests running initially. # Likely too aggressive disabling. DiskCacheBackendTest.* -NetUtilTest.GetNetworkList TransportSecurityStateTest.ParseSidePins* # TODO(jnd): The following tests are disabled because test server spawner is not # enabled on Chromium Android. Once the net upstreaming is done, test server diff --git a/net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java b/net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java index ef8fa03..28208a7 100644 --- a/net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java +++ b/net/android/java/src/org/chromium/net/AndroidNetworkLibrary.java @@ -12,6 +12,8 @@ import android.util.Log; import org.chromium.base.CalledByNative; import org.chromium.base.CalledByNativeUnchecked; +import java.net.Inet6Address; +import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.URLConnection; @@ -87,6 +89,59 @@ class AndroidNetworkLibrary { } /** + * @return the network interfaces list (if any) string. The items in + * the list string are delimited by a semicolon ";", each item + * is a network interface name and address pair and formatted + * as "name,address". e.g. + * eth0,10.0.0.2;eth0,fe80::5054:ff:fe12:3456 + * represents a network list string which containts two items. + */ + @CalledByNative + static public String getNetworkList() { + Enumeration<NetworkInterface> list = null; + try { + list = NetworkInterface.getNetworkInterfaces(); + if (list == null) return ""; + } catch (SocketException e) { + Log.w(TAG, "Unable to get network interfaces: " + e); + return ""; + } + + StringBuilder result = new StringBuilder(); + while (list.hasMoreElements()) { + NetworkInterface netIf = list.nextElement(); + try { + // Skip loopback interfaces, and ones which are down. + if (!netIf.isUp() || netIf.isLoopback()) + continue; + Enumeration<InetAddress> addressList = netIf.getInetAddresses(); + while (addressList.hasMoreElements()) { + InetAddress address = addressList.nextElement(); + // Skip loopback addresses configured on non-loopback interfaces. + if (address.isLoopbackAddress()) + continue; + StringBuilder addressString = new StringBuilder(); + addressString.append(netIf.getName()); + addressString.append(","); + + String ipAddress = address.getHostAddress(); + if (address instanceof Inet6Address && ipAddress.contains("%")) { + ipAddress = ipAddress.substring(0, ipAddress.lastIndexOf("%")); + } + addressString.append(ipAddress); + + if (result.length() != 0) + result.append(";"); + result.append(addressString.toString()); + } + } catch (SocketException e) { + continue; + } + } + return result.toString(); + } + + /** * Validate the server's certificate chain is trusted. * * @param certChain The ASN.1 DER encoded bytes for certificates. diff --git a/net/android/network_library.cc b/net/android/network_library.cc index d518abaf..64f11aa 100644 --- a/net/android/network_library.cc +++ b/net/android/network_library.cc @@ -69,6 +69,13 @@ bool HaveOnlyLoopbackAddresses() { return Java_AndroidNetworkLibrary_haveOnlyLoopbackAddresses(env); } +std::string GetNetworkList() { + JNIEnv* env = AttachCurrentThread(); + ScopedJavaLocalRef<jstring> ret = + Java_AndroidNetworkLibrary_getNetworkList(env); + return ConvertJavaStringToUTF8(ret); +} + bool GetMimeTypeFromExtension(const std::string& extension, std::string* result) { JNIEnv* env = AttachCurrentThread(); diff --git a/net/android/network_library.h b/net/android/network_library.h index 26b326ab..a0cf7d3 100644 --- a/net/android/network_library.h +++ b/net/android/network_library.h @@ -44,6 +44,12 @@ bool StoreKeyPair(const uint8* public_key, // Also returns false if it cannot determine this. bool HaveOnlyLoopbackAddresses(); +// Return a string containing a list of network interfaces, each item is a +// network name and address pair. +// e.g. "eth0,10.0.0.2;eth0,fe80::5054:ff:fe12:3456" is a result string +// containing two items. +std::string GetNetworkList(); + // Get the mime type (if any) that is associated with the file extension. // Returns true if a corresponding mime type exists. bool GetMimeTypeFromExtension(const std::string& extension, diff --git a/net/base/net_util_posix.cc b/net/base/net_util_posix.cc index 8ff720f..ecea33f 100644 --- a/net/base/net_util_posix.cc +++ b/net/base/net_util_posix.cc @@ -9,6 +9,7 @@ #include "base/eintr_wrapper.h" #include "base/file_path.h" #include "base/logging.h" +#include "base/string_tokenizer.h" #include "base/string_util.h" #include "base/threading/thread_restrictions.h" #include "googleurl/src/gurl.h" @@ -22,6 +23,10 @@ #include <net/if.h> #include <netinet/in.h> +#if defined(OS_ANDROID) +#include "net/android/network_library.h" +#endif + namespace net { bool FileURLToFilePath(const GURL& url, FilePath* path) { @@ -60,12 +65,27 @@ bool FileURLToFilePath(const GURL& url, FilePath* path) { bool GetNetworkList(NetworkInterfaceList* networks) { #if defined(OS_ANDROID) - // TODO: Android API doesn't support ifaddrs. This method was only used by - // P2PMessage. Consider to implement it until really needed. The possible - // approach is implementing the similar feature by - // java.net.NetworkInterface through JNI. - NOTIMPLEMENTED(); - return false; + std::string network_list = android::GetNetworkList(); + StringTokenizer network_interfaces(network_list, ";"); + while (network_interfaces.GetNext()) { + std::string network_item = network_interfaces.token(); + StringTokenizer network_tokenizer(network_item, ","); + std::string name; + if (!network_tokenizer.GetNext()) + continue; + name = network_tokenizer.token(); + + std::string literal_address; + if (!network_tokenizer.GetNext()) + continue; + literal_address = network_tokenizer.token(); + + IPAddressNumber address; + if (!ParseIPLiteralToNumber(literal_address, &address)) + continue; + networks->push_back(NetworkInterface(name, address)); + } + return true; #else // getifaddrs() may require IO operations. base::ThreadRestrictions::AssertIOAllowed(); |