OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/dns/host_resolver_impl.h" | 5 #include "net/dns/host_resolver_impl.h" |
6 | 6 |
7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
8 #include <Winsock2.h> | 8 #include <Winsock2.h> |
9 #elif defined(OS_POSIX) | 9 #elif defined(OS_POSIX) |
10 #include <netdb.h> | 10 #include <netdb.h> |
(...skipping 26 matching lines...) Expand all Loading... | |
37 #include "net/base/net_errors.h" | 37 #include "net/base/net_errors.h" |
38 #include "net/base/net_log.h" | 38 #include "net/base/net_log.h" |
39 #include "net/base/net_util.h" | 39 #include "net/base/net_util.h" |
40 #include "net/dns/address_sorter.h" | 40 #include "net/dns/address_sorter.h" |
41 #include "net/dns/dns_client.h" | 41 #include "net/dns/dns_client.h" |
42 #include "net/dns/dns_config_service.h" | 42 #include "net/dns/dns_config_service.h" |
43 #include "net/dns/dns_protocol.h" | 43 #include "net/dns/dns_protocol.h" |
44 #include "net/dns/dns_response.h" | 44 #include "net/dns/dns_response.h" |
45 #include "net/dns/dns_transaction.h" | 45 #include "net/dns/dns_transaction.h" |
46 #include "net/dns/host_resolver_proc.h" | 46 #include "net/dns/host_resolver_proc.h" |
47 #include "net/socket/client_socket_factory.h" | |
48 #include "net/udp/datagram_client_socket.h" | |
47 | 49 |
48 #if defined(OS_WIN) | 50 #if defined(OS_WIN) |
49 #include "net/base/winsock_init.h" | 51 #include "net/base/winsock_init.h" |
50 #endif | 52 #endif |
51 | 53 |
52 namespace net { | 54 namespace net { |
53 | 55 |
54 namespace { | 56 namespace { |
55 | 57 |
56 // Limit the size of hostnames that will be resolved to combat issues in | 58 // Limit the size of hostnames that will be resolved to combat issues in |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
160 const size_t kSuffixLenTrimmed = kSuffixLen - 1; | 162 const size_t kSuffixLenTrimmed = kSuffixLen - 1; |
161 if (hostname[hostname.size() - 1] == '.') { | 163 if (hostname[hostname.size() - 1] == '.') { |
162 return hostname.size() > kSuffixLen && | 164 return hostname.size() > kSuffixLen && |
163 !hostname.compare(hostname.size() - kSuffixLen, kSuffixLen, kSuffix); | 165 !hostname.compare(hostname.size() - kSuffixLen, kSuffixLen, kSuffix); |
164 } | 166 } |
165 return hostname.size() > kSuffixLenTrimmed && | 167 return hostname.size() > kSuffixLenTrimmed && |
166 !hostname.compare(hostname.size() - kSuffixLenTrimmed, kSuffixLenTrimmed, | 168 !hostname.compare(hostname.size() - kSuffixLenTrimmed, kSuffixLenTrimmed, |
167 kSuffix, kSuffixLenTrimmed); | 169 kSuffix, kSuffixLenTrimmed); |
168 } | 170 } |
169 | 171 |
172 // Attempts to connect a UDP socket to |dest|:80. | |
173 int AttemptRoute(const IPAddressNumber& dest) { | |
174 scoped_ptr<DatagramClientSocket> socket( | |
175 ClientSocketFactory::GetDefaultFactory()->CreateDatagramClientSocket( | |
176 DatagramSocket::DEFAULT_BIND, | |
177 RandIntCallback(), | |
178 NULL, | |
179 NetLog::Source())); | |
180 return socket->Connect(IPEndPoint(dest, 80)); | |
lorenzo
2013/04/11 07:28:14
Do you need to check that the address is a global
| |
181 } | |
182 | |
170 // Provide a common macro to simplify code and readability. We must use a | 183 // Provide a common macro to simplify code and readability. We must use a |
171 // macro as the underlying HISTOGRAM macro creates static variables. | 184 // macro as the underlying HISTOGRAM macro creates static variables. |
172 #define DNS_HISTOGRAM(name, time) UMA_HISTOGRAM_CUSTOM_TIMES(name, time, \ | 185 #define DNS_HISTOGRAM(name, time) UMA_HISTOGRAM_CUSTOM_TIMES(name, time, \ |
173 base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromHours(1), 100) | 186 base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromHours(1), 100) |
174 | 187 |
175 // A macro to simplify code and readability. | 188 // A macro to simplify code and readability. |
176 #define DNS_HISTOGRAM_BY_PRIORITY(basename, priority, time) \ | 189 #define DNS_HISTOGRAM_BY_PRIORITY(basename, priority, time) \ |
177 do { \ | 190 do { \ |
178 switch (priority) { \ | 191 switch (priority) { \ |
179 case HIGHEST: DNS_HISTOGRAM(basename "_HIGHEST", time); break; \ | 192 case HIGHEST: DNS_HISTOGRAM(basename "_HIGHEST", time); break; \ |
(...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
881 | 894 |
882 BoundNetLog net_log_; | 895 BoundNetLog net_log_; |
883 | 896 |
884 DISALLOW_COPY_AND_ASSIGN(ProcTask); | 897 DISALLOW_COPY_AND_ASSIGN(ProcTask); |
885 }; | 898 }; |
886 | 899 |
887 //----------------------------------------------------------------------------- | 900 //----------------------------------------------------------------------------- |
888 | 901 |
889 // Wraps a call to TestIPv6Support to be executed on the WorkerPool as it takes | 902 // Wraps a call to TestIPv6Support to be executed on the WorkerPool as it takes |
890 // 40-100ms. | 903 // 40-100ms. |
904 // TODO(szym): Remove altogether, if IPv6ActiveProbe works. | |
891 class HostResolverImpl::IPv6ProbeJob { | 905 class HostResolverImpl::IPv6ProbeJob { |
892 public: | 906 public: |
893 IPv6ProbeJob(const base::WeakPtr<HostResolverImpl>& resolver, NetLog* net_log) | 907 IPv6ProbeJob(const base::WeakPtr<HostResolverImpl>& resolver, NetLog* net_log) |
894 : resolver_(resolver), | 908 : resolver_(resolver), |
895 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_IPV6_PROBE_JOB)), | 909 net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_IPV6_PROBE_JOB)), |
896 result_(false, IPV6_SUPPORT_MAX, OK) { | 910 result_(false, IPV6_SUPPORT_MAX, OK) { |
897 DCHECK(resolver); | 911 DCHECK(resolver); |
898 net_log_.BeginEvent(NetLog::TYPE_IPV6_PROBE_RUNNING); | 912 net_log_.BeginEvent(NetLog::TYPE_IPV6_PROBE_RUNNING); |
899 const bool kIsSlow = true; | 913 const bool kIsSlow = true; |
900 base::WorkerPool::PostTaskAndReply( | 914 base::WorkerPool::PostTaskAndReply( |
(...skipping 950 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1851 void HostResolverImpl::SetDefaultAddressFamily(AddressFamily address_family) { | 1865 void HostResolverImpl::SetDefaultAddressFamily(AddressFamily address_family) { |
1852 DCHECK(CalledOnValidThread()); | 1866 DCHECK(CalledOnValidThread()); |
1853 default_address_family_ = address_family; | 1867 default_address_family_ = address_family; |
1854 ipv6_probe_monitoring_ = false; | 1868 ipv6_probe_monitoring_ = false; |
1855 } | 1869 } |
1856 | 1870 |
1857 AddressFamily HostResolverImpl::GetDefaultAddressFamily() const { | 1871 AddressFamily HostResolverImpl::GetDefaultAddressFamily() const { |
1858 return default_address_family_; | 1872 return default_address_family_; |
1859 } | 1873 } |
1860 | 1874 |
1875 // TODO(szym): Remove this API altogether if IPv6ActiveProbe works. | |
1861 void HostResolverImpl::ProbeIPv6Support() { | 1876 void HostResolverImpl::ProbeIPv6Support() { |
1862 DCHECK(CalledOnValidThread()); | 1877 DCHECK(CalledOnValidThread()); |
1863 DCHECK(!ipv6_probe_monitoring_); | 1878 DCHECK(!ipv6_probe_monitoring_); |
1864 ipv6_probe_monitoring_ = true; | 1879 ipv6_probe_monitoring_ = true; |
1865 OnIPAddressChanged(); | 1880 OnIPAddressChanged(); |
1866 } | 1881 } |
1867 | 1882 |
1868 void HostResolverImpl::SetDnsClientEnabled(bool enabled) { | 1883 void HostResolverImpl::SetDnsClientEnabled(bool enabled) { |
1869 DCHECK(CalledOnValidThread()); | 1884 DCHECK(CalledOnValidThread()); |
1870 #if defined(ENABLE_BUILT_IN_DNS) | 1885 #if defined(ENABLE_BUILT_IN_DNS) |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2016 } else { | 2031 } else { |
2017 additional_resolver_flags_ &= ~HOST_RESOLVER_LOOPBACK_ONLY; | 2032 additional_resolver_flags_ &= ~HOST_RESOLVER_LOOPBACK_ONLY; |
2018 } | 2033 } |
2019 } | 2034 } |
2020 | 2035 |
2021 HostResolverImpl::Key HostResolverImpl::GetEffectiveKeyForRequest( | 2036 HostResolverImpl::Key HostResolverImpl::GetEffectiveKeyForRequest( |
2022 const RequestInfo& info) const { | 2037 const RequestInfo& info) const { |
2023 HostResolverFlags effective_flags = | 2038 HostResolverFlags effective_flags = |
2024 info.host_resolver_flags() | additional_resolver_flags_; | 2039 info.host_resolver_flags() | additional_resolver_flags_; |
2025 AddressFamily effective_address_family = info.address_family(); | 2040 AddressFamily effective_address_family = info.address_family(); |
2041 | |
2042 if (info.address_family() == ADDRESS_FAMILY_UNSPECIFIED) { | |
2043 base::TimeTicks start_time = base::TimeTicks::Now(); | |
2044 // Google DNS address. | |
2045 const uint8 kIPv6Address[] = | |
2046 { 0x20, 0x01, 0x48, 0x60, 0x48, 0x60, 0x00, 0x00, | |
2047 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x88 }; | |
2048 int rv6 = AttemptRoute( | |
2049 IPAddressNumber(kIPv6Address, kIPv6Address + arraysize(kIPv6Address))); | |
2050 | |
2051 UMA_HISTOGRAM_TIMES("Net.IPv6ConnectDuration", | |
2052 base::TimeTicks::Now() - start_time); | |
2053 if (rv6 == OK) { | |
2054 UMA_HISTOGRAM_BOOLEAN("Net.IPv6ConnectSuccessMatch", | |
2055 default_address_family_ == ADDRESS_FAMILY_UNSPECIFIED); | |
2056 } else { | |
2057 UMA_HISTOGRAM_BOOLEAN("Net.IPv6ConnectFailureMatch", | |
2058 default_address_family_ != ADDRESS_FAMILY_UNSPECIFIED); | |
2059 } | |
2060 } | |
2061 | |
2026 if (effective_address_family == ADDRESS_FAMILY_UNSPECIFIED && | 2062 if (effective_address_family == ADDRESS_FAMILY_UNSPECIFIED && |
2027 default_address_family_ != ADDRESS_FAMILY_UNSPECIFIED) { | 2063 default_address_family_ != ADDRESS_FAMILY_UNSPECIFIED) { |
2028 effective_address_family = default_address_family_; | 2064 effective_address_family = default_address_family_; |
2029 if (ipv6_probe_monitoring_) | 2065 if (ipv6_probe_monitoring_) |
2030 effective_flags |= HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; | 2066 effective_flags |= HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6; |
2031 } | 2067 } |
2068 | |
2032 return Key(info.hostname(), effective_address_family, effective_flags); | 2069 return Key(info.hostname(), effective_address_family, effective_flags); |
2033 } | 2070 } |
2034 | 2071 |
2035 void HostResolverImpl::AbortAllInProgressJobs() { | 2072 void HostResolverImpl::AbortAllInProgressJobs() { |
2036 // In Abort, a Request callback could spawn new Jobs with matching keys, so | 2073 // In Abort, a Request callback could spawn new Jobs with matching keys, so |
2037 // first collect and remove all running jobs from |jobs_|. | 2074 // first collect and remove all running jobs from |jobs_|. |
2038 ScopedVector<Job> jobs_to_abort; | 2075 ScopedVector<Job> jobs_to_abort; |
2039 for (JobMap::iterator it = jobs_.begin(); it != jobs_.end(); ) { | 2076 for (JobMap::iterator it = jobs_.begin(); it != jobs_.end(); ) { |
2040 Job* job = it->second; | 2077 Job* job = it->second; |
2041 if (job->is_running()) { | 2078 if (job->is_running()) { |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2176 } | 2213 } |
2177 DnsConfig dns_config; | 2214 DnsConfig dns_config; |
2178 NetworkChangeNotifier::GetDnsConfig(&dns_config); | 2215 NetworkChangeNotifier::GetDnsConfig(&dns_config); |
2179 dns_client_->SetConfig(dns_config); | 2216 dns_client_->SetConfig(dns_config); |
2180 num_dns_failures_ = 0; | 2217 num_dns_failures_ = 0; |
2181 if (dns_config.IsValid()) | 2218 if (dns_config.IsValid()) |
2182 UMA_HISTOGRAM_BOOLEAN("AsyncDNS.DnsClientEnabled", true); | 2219 UMA_HISTOGRAM_BOOLEAN("AsyncDNS.DnsClientEnabled", true); |
2183 } | 2220 } |
2184 | 2221 |
2185 } // namespace net | 2222 } // namespace net |
OLD | NEW |