| Index: net/base/net_util.cc
|
| diff --git a/net/base/net_util.cc b/net/base/net_util.cc
|
| index 41a4c21921e754985b939172e457c8a09b5cb472..f9be889a715d3e5b7a15efa764be13a8ab383695 100644
|
| --- a/net/base/net_util.cc
|
| +++ b/net/base/net_util.cc
|
| @@ -1795,179 +1795,6 @@ ScopedPortException::~ScopedPortException() {
|
| NOTREACHED();
|
| }
|
|
|
| -namespace {
|
| -
|
| -const char* kFinalStatusNames[] = {
|
| - "Cannot create sockets",
|
| - "Can create sockets",
|
| - "Can't get addresses",
|
| - "Global ipv6 address missing",
|
| - "Global ipv6 address present",
|
| - "Interface array too short",
|
| - "Probing not supported", // IPV6_SUPPORT_MAX
|
| -};
|
| -COMPILE_ASSERT(arraysize(kFinalStatusNames) == IPV6_SUPPORT_MAX + 1,
|
| - IPv6SupportStatus_name_count_mismatch);
|
| -
|
| -// TODO(jar): The following is a simple estimate of IPv6 support. We may need
|
| -// to do a test resolution, and a test connection, to REALLY verify support.
|
| -IPv6SupportResult TestIPv6SupportInternal() {
|
| -#if defined(OS_ANDROID)
|
| - // TODO: We should fully implement IPv6 probe once 'getifaddrs' API available;
|
| - // Another approach is implementing the similar feature by
|
| - // java.net.NetworkInterface through JNI.
|
| - NOTIMPLEMENTED();
|
| - return IPv6SupportResult(true, IPV6_SUPPORT_MAX, 0);
|
| -#elif defined(OS_POSIX)
|
| - int test_socket = socket(AF_INET6, SOCK_STREAM, 0);
|
| - if (test_socket == -1)
|
| - return IPv6SupportResult(false, IPV6_CANNOT_CREATE_SOCKETS, errno);
|
| - close(test_socket);
|
| -
|
| - // Check to see if any interface has a IPv6 address.
|
| - struct ifaddrs* interface_addr = NULL;
|
| - int rv = getifaddrs(&interface_addr);
|
| - if (rv != 0) {
|
| - // Don't yet block IPv6.
|
| - return IPv6SupportResult(true, IPV6_GETIFADDRS_FAILED, errno);
|
| - }
|
| -
|
| - bool found_ipv6 = false;
|
| - for (struct ifaddrs* interface = interface_addr;
|
| - interface != NULL;
|
| - interface = interface->ifa_next) {
|
| - if (!(IFF_UP & interface->ifa_flags))
|
| - continue;
|
| - if (IFF_LOOPBACK & interface->ifa_flags)
|
| - continue;
|
| - struct sockaddr* addr = interface->ifa_addr;
|
| - if (!addr)
|
| - continue;
|
| - if (addr->sa_family != AF_INET6)
|
| - continue;
|
| - // Safe cast since this is AF_INET6.
|
| - struct sockaddr_in6* addr_in6 =
|
| - reinterpret_cast<struct sockaddr_in6*>(addr);
|
| - struct in6_addr* sin6_addr = &addr_in6->sin6_addr;
|
| - if (IN6_IS_ADDR_LOOPBACK(sin6_addr) || IN6_IS_ADDR_LINKLOCAL(sin6_addr))
|
| - continue;
|
| - found_ipv6 = true;
|
| - break;
|
| - }
|
| - freeifaddrs(interface_addr);
|
| - if (!found_ipv6)
|
| - return IPv6SupportResult(false, IPV6_GLOBAL_ADDRESS_MISSING, 0);
|
| -
|
| - return IPv6SupportResult(true, IPV6_GLOBAL_ADDRESS_PRESENT, 0);
|
| -#elif defined(OS_WIN)
|
| - EnsureWinsockInit();
|
| - SOCKET test_socket = socket(AF_INET6, SOCK_STREAM, 0);
|
| - if (test_socket == INVALID_SOCKET) {
|
| - return IPv6SupportResult(false,
|
| - IPV6_CANNOT_CREATE_SOCKETS,
|
| - WSAGetLastError());
|
| - }
|
| - closesocket(test_socket);
|
| -
|
| - // Check to see if any interface has a IPv6 address.
|
| - // The GetAdaptersAddresses MSDN page recommends using a size of 15000 to
|
| - // avoid reallocation.
|
| - ULONG adapters_size = 15000;
|
| - scoped_ptr_malloc<IP_ADAPTER_ADDRESSES> adapters;
|
| - ULONG error;
|
| - int num_tries = 0;
|
| - do {
|
| - adapters.reset(
|
| - reinterpret_cast<PIP_ADAPTER_ADDRESSES>(malloc(adapters_size)));
|
| - // Return only unicast addresses.
|
| - error = GetAdaptersAddresses(AF_UNSPEC,
|
| - GAA_FLAG_SKIP_ANYCAST |
|
| - GAA_FLAG_SKIP_MULTICAST |
|
| - GAA_FLAG_SKIP_DNS_SERVER |
|
| - GAA_FLAG_SKIP_FRIENDLY_NAME,
|
| - NULL, adapters.get(), &adapters_size);
|
| - num_tries++;
|
| - } while (error == ERROR_BUFFER_OVERFLOW && num_tries <= 3);
|
| - if (error == ERROR_NO_DATA)
|
| - return IPv6SupportResult(false, IPV6_GLOBAL_ADDRESS_MISSING, error);
|
| - if (error != ERROR_SUCCESS) {
|
| - // Don't yet block IPv6.
|
| - return IPv6SupportResult(true, IPV6_GETIFADDRS_FAILED, error);
|
| - }
|
| -
|
| - PIP_ADAPTER_ADDRESSES adapter;
|
| - for (adapter = adapters.get(); adapter; adapter = adapter->Next) {
|
| - if (adapter->OperStatus != IfOperStatusUp)
|
| - continue;
|
| - if (adapter->IfType == IF_TYPE_SOFTWARE_LOOPBACK)
|
| - continue;
|
| - PIP_ADAPTER_UNICAST_ADDRESS unicast_address;
|
| - for (unicast_address = adapter->FirstUnicastAddress;
|
| - unicast_address;
|
| - unicast_address = unicast_address->Next) {
|
| - if (unicast_address->Address.lpSockaddr->sa_family != AF_INET6)
|
| - continue;
|
| - // Safe cast since this is AF_INET6.
|
| - struct sockaddr_in6* addr_in6 = reinterpret_cast<struct sockaddr_in6*>(
|
| - unicast_address->Address.lpSockaddr);
|
| - struct in6_addr* sin6_addr = &addr_in6->sin6_addr;
|
| - if (IN6_IS_ADDR_LOOPBACK(sin6_addr) || IN6_IS_ADDR_LINKLOCAL(sin6_addr))
|
| - continue;
|
| - const uint8 kTeredoPrefix[] = { 0x20, 0x01, 0, 0 };
|
| - if (!memcmp(sin6_addr->s6_addr, kTeredoPrefix, arraysize(kTeredoPrefix)))
|
| - continue;
|
| - return IPv6SupportResult(true, IPV6_GLOBAL_ADDRESS_PRESENT, 0);
|
| - }
|
| - }
|
| -
|
| - return IPv6SupportResult(false, IPV6_GLOBAL_ADDRESS_MISSING, 0);
|
| -#else
|
| - NOTIMPLEMENTED();
|
| - return IPv6SupportResult(true, IPV6_SUPPORT_MAX, 0);
|
| -#endif // defined(various platforms)
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -IPv6SupportResult::IPv6SupportResult(bool ipv6_supported,
|
| - IPv6SupportStatus ipv6_support_status,
|
| - int os_error)
|
| - : ipv6_supported(ipv6_supported),
|
| - ipv6_support_status(ipv6_support_status),
|
| - os_error(os_error) {
|
| -}
|
| -
|
| -base::Value* IPv6SupportResult::ToNetLogValue(
|
| - NetLog::LogLevel /* log_level */) const {
|
| - base::DictionaryValue* dict = new base::DictionaryValue();
|
| - dict->SetBoolean("ipv6_supported", ipv6_supported);
|
| - dict->SetString("ipv6_support_status",
|
| - kFinalStatusNames[ipv6_support_status]);
|
| - if (os_error)
|
| - dict->SetInteger("os_error", os_error);
|
| - return dict;
|
| -}
|
| -
|
| -IPv6SupportResult TestIPv6Support() {
|
| - IPv6SupportResult result = TestIPv6SupportInternal();
|
| -
|
| - // Record UMA.
|
| - if (result.ipv6_support_status != IPV6_SUPPORT_MAX) {
|
| - static bool run_once = false;
|
| - if (!run_once) {
|
| - run_once = true;
|
| - UMA_HISTOGRAM_ENUMERATION("Net.IPv6Status",
|
| - result.ipv6_support_status,
|
| - IPV6_SUPPORT_MAX);
|
| - } else {
|
| - UMA_HISTOGRAM_ENUMERATION("Net.IPv6Status_retest",
|
| - result.ipv6_support_status,
|
| - IPV6_SUPPORT_MAX);
|
| - }
|
| - }
|
| - return result;
|
| -}
|
| -
|
| bool HaveOnlyLoopbackAddresses() {
|
| #if defined(OS_ANDROID)
|
| return android::HaveOnlyLoopbackAddresses();
|
|
|