Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(411)

Side by Side Diff: net/base/net_util.cc

Issue 1006001: Refine IPv6 probe to require that the client has an IPv6 address on an interf... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/base/host_resolver_impl.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/base/net_util.h" 5 #include "net/base/net_util.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 #include <unicode/ucnv.h> 9 #include <unicode/ucnv.h>
10 #include <unicode/uidna.h> 10 #include <unicode/uidna.h>
11 #include <unicode/ulocdata.h> 11 #include <unicode/ulocdata.h>
12 #include <unicode/uniset.h> 12 #include <unicode/uniset.h>
13 #include <unicode/uscript.h> 13 #include <unicode/uscript.h>
14 #include <unicode/uset.h> 14 #include <unicode/uset.h>
15 15
16 #include "build/build_config.h" 16 #include "build/build_config.h"
17 17
18 #if defined(OS_WIN) 18 #if defined(OS_WIN)
19 #include <windows.h> 19 #include <windows.h>
20 #include <winsock2.h> 20 #include <winsock2.h>
21 #include <ws2tcpip.h> 21 #include <ws2tcpip.h>
22 #include <wspiapi.h> // Needed for Win2k compat. 22 #include <wspiapi.h> // Needed for Win2k compat.
23 #elif defined(OS_POSIX) 23 #elif defined(OS_POSIX)
24 #include <fcntl.h>
25 #include <ifaddrs.h>
24 #include <netdb.h> 26 #include <netdb.h>
27 #include <net/if.h>
25 #include <sys/socket.h> 28 #include <sys/socket.h>
26 #include <fcntl.h>
27 #endif 29 #endif
28 30
29 #include "base/base64.h" 31 #include "base/base64.h"
30 #include "base/basictypes.h" 32 #include "base/basictypes.h"
31 #include "base/file_path.h" 33 #include "base/file_path.h"
32 #include "base/file_util.h" 34 #include "base/file_util.h"
33 #include "base/i18n/file_util_icu.h" 35 #include "base/i18n/file_util_icu.h"
34 #include "base/i18n/icu_string_conversions.h" 36 #include "base/i18n/icu_string_conversions.h"
35 #include "base/i18n/time_formatting.h" 37 #include "base/i18n/time_formatting.h"
36 #include "base/json/string_escape.h" 38 #include "base/json/string_escape.h"
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
251 ucnv_close(converter); 253 ucnv_close(converter);
252 if (U_FAILURE(err)) { 254 if (U_FAILURE(err)) {
253 return false; 255 return false;
254 } 256 }
255 output->resize(length); 257 output->resize(length);
256 return true; 258 return true;
257 } 259 }
258 260
259 bool DecodeWord(const std::string& encoded_word, 261 bool DecodeWord(const std::string& encoded_word,
260 const std::string& referrer_charset, 262 const std::string& referrer_charset,
261 bool *is_rfc2047, 263 bool* is_rfc2047,
262 std::string* output) { 264 std::string* output) {
263 if (!IsStringASCII(encoded_word)) { 265 if (!IsStringASCII(encoded_word)) {
264 // Try UTF-8, referrer_charset and the native OS default charset in turn. 266 // Try UTF-8, referrer_charset and the native OS default charset in turn.
265 if (IsStringUTF8(encoded_word)) { 267 if (IsStringUTF8(encoded_word)) {
266 *output = encoded_word; 268 *output = encoded_word;
267 } else { 269 } else {
268 std::wstring wide_output; 270 std::wstring wide_output;
269 if (!referrer_charset.empty() && 271 if (!referrer_charset.empty() &&
270 base::CodepageToWide(encoded_word, referrer_charset.c_str(), 272 base::CodepageToWide(encoded_word, referrer_charset.c_str(),
271 base::OnStringConversionError::FAIL, 273 base::OnStringConversionError::FAIL,
(...skipping 1273 matching lines...) Expand 10 before | Expand all | Expand 10 after
1545 allowed_ports.substr(last, length)))); 1547 allowed_ports.substr(last, length))));
1546 last = i + 1; 1548 last = i + 1;
1547 } 1549 }
1548 } 1550 }
1549 explicitly_allowed_ports = ports; 1551 explicitly_allowed_ports = ports;
1550 } 1552 }
1551 1553
1552 enum IPv6SupportStatus { 1554 enum IPv6SupportStatus {
1553 IPV6_CANNOT_CREATE_SOCKETS, 1555 IPV6_CANNOT_CREATE_SOCKETS,
1554 IPV6_CAN_CREATE_SOCKETS, 1556 IPV6_CAN_CREATE_SOCKETS,
1557 IPV6_GETIFADDRS_FAILED,
1558 IPV6_GLOBAL_ADDRESS_MISSING,
1559 IPV6_GLOBAL_ADDRESS_PRESENT,
1555 IPV6_SUPPORT_MAX // Bounding values for enumeration. 1560 IPV6_SUPPORT_MAX // Bounding values for enumeration.
1556 }; 1561 };
1557 1562
1558 static void IPv6SupportResults(IPv6SupportStatus result) { 1563 static void IPv6SupportResults(IPv6SupportStatus result) {
1559 static bool run_once = false; 1564 static bool run_once = false;
1560 if (run_once) 1565 if (!run_once) {
1561 return; 1566 run_once = true;
1562 run_once = true; 1567 UMA_HISTOGRAM_ENUMERATION("Net.IPv6Status", result, IPV6_SUPPORT_MAX);
1563 UMA_HISTOGRAM_ENUMERATION("Net.IPv6Status", result, IPV6_SUPPORT_MAX); 1568 } else {
1569 UMA_HISTOGRAM_ENUMERATION("Net.IPv6Status_retest", result,
1570 IPV6_SUPPORT_MAX);
1571 }
1564 } 1572 }
1565 1573
1566 // TODO(jar): The following is a simple estimate of IPv6 support. We may need 1574 // TODO(jar): The following is a simple estimate of IPv6 support. We may need
1567 // to do a test resolution, and a test connection, to REALLY verify support. 1575 // to do a test resolution, and a test connection, to REALLY verify support.
1568 // static 1576 // static
1569 bool IPv6Supported() { 1577 bool IPv6Supported() {
1570 #if defined(OS_POSIX) 1578 #if defined(OS_POSIX)
1571 int test_socket; 1579 int test_socket = socket(AF_INET6, SOCK_STREAM, 0);
1572
1573 test_socket = socket(AF_INET6, SOCK_STREAM, 0);
1574 if (test_socket == -1) { 1580 if (test_socket == -1) {
1575 IPv6SupportResults(IPV6_CANNOT_CREATE_SOCKETS); 1581 IPv6SupportResults(IPV6_CANNOT_CREATE_SOCKETS);
1576 return false; 1582 return false;
1577 } 1583 }
1584 close(test_socket);
1578 1585
1579 close(test_socket); 1586 // Check to see if any interface has a IPv6 address.
1580 IPv6SupportResults(IPV6_CAN_CREATE_SOCKETS); 1587 struct ifaddrs* interface_addr = NULL;
1588 int rv = getifaddrs(&interface_addr);
1589 if (rv != 0) {
1590 IPv6SupportResults(IPV6_GETIFADDRS_FAILED);
1591 return true; // Don't yet block IPv6.
1592 }
1593
1594 bool found_ipv6 = false;
1595 for (struct ifaddrs* interface = interface_addr;
1596 interface != NULL;
1597 interface = interface->ifa_next) {
1598 if (!(IFF_UP & interface->ifa_flags))
1599 continue;
1600 if (IFF_LOOPBACK & interface->ifa_flags)
1601 continue;
1602 struct sockaddr* addr = interface->ifa_addr;
1603 if (!addr)
1604 continue;
1605 if (addr->sa_family != AF_INET6)
1606 continue;
1607 // Safe cast since this is AF_INET6.
1608 struct sockaddr_in6* addr_in6 =
1609 reinterpret_cast<struct sockaddr_in6*>(addr);
1610 struct in6_addr* sin6_addr = &addr_in6->sin6_addr;
1611 if (IN6_IS_ADDR_LOOPBACK(sin6_addr) || IN6_IS_ADDR_LINKLOCAL(sin6_addr))
1612 continue;
1613 found_ipv6 = true;
1614 break;
1615 }
1616 freeifaddrs(interface_addr);
1617 if (!found_ipv6) {
1618 IPv6SupportResults(IPV6_GLOBAL_ADDRESS_MISSING);
1619 return false;
1620 }
1621
1622 IPv6SupportResults(IPV6_GLOBAL_ADDRESS_PRESENT);
1581 return true; 1623 return true;
1582 #elif defined(OS_WIN) 1624 #elif defined(OS_WIN)
1583 EnsureWinsockInit(); 1625 EnsureWinsockInit();
1584 SOCKET test_socket; 1626 SOCKET test_socket = socket(AF_INET6, SOCK_STREAM, 0);
1585
1586 test_socket = socket(AF_INET6, SOCK_STREAM, 0);
1587 if (test_socket == INVALID_SOCKET) { 1627 if (test_socket == INVALID_SOCKET) {
1588 IPv6SupportResults(IPV6_CANNOT_CREATE_SOCKETS); 1628 IPv6SupportResults(IPV6_CANNOT_CREATE_SOCKETS);
1589 return false; 1629 return false;
1590 } 1630 }
1591
1592 closesocket(test_socket); 1631 closesocket(test_socket);
1593 IPv6SupportResults(IPV6_CAN_CREATE_SOCKETS); 1632 IPv6SupportResults(IPV6_CAN_CREATE_SOCKETS);
1594 return true; 1633 return true;
1595 #else 1634 #else
1596 NOTIMPLEMENTED(); 1635 NOTIMPLEMENTED();
1597 return true; 1636 return true;
1598 #endif // defined(various platforms) 1637 #endif // defined(various platforms)
1599 } 1638 }
1600 1639
1601
1602 } // namespace net 1640 } // namespace net
OLDNEW
« no previous file with comments | « net/base/host_resolver_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698