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> |
11 #endif | 11 #endif |
12 | 12 |
13 #include <cmath> | 13 #include <cmath> |
14 #include <utility> | 14 #include <utility> |
15 #include <vector> | 15 #include <vector> |
16 | 16 |
17 #include "base/basictypes.h" | |
18 #include "base/bind.h" | 17 #include "base/bind.h" |
19 #include "base/bind_helpers.h" | 18 #include "base/bind_helpers.h" |
20 #include "base/callback.h" | 19 #include "base/callback.h" |
21 #include "base/compiler_specific.h" | 20 #include "base/compiler_specific.h" |
22 #include "base/debug/debugger.h" | 21 #include "base/debug/debugger.h" |
23 #include "base/debug/stack_trace.h" | 22 #include "base/debug/stack_trace.h" |
| 23 #include "base/macros.h" |
24 #include "base/memory/scoped_ptr.h" | 24 #include "base/memory/scoped_ptr.h" |
25 #include "base/metrics/field_trial.h" | 25 #include "base/metrics/field_trial.h" |
26 #include "base/metrics/histogram_macros.h" | 26 #include "base/metrics/histogram_macros.h" |
27 #include "base/metrics/sparse_histogram.h" | 27 #include "base/metrics/sparse_histogram.h" |
28 #include "base/profiler/scoped_tracker.h" | 28 #include "base/profiler/scoped_tracker.h" |
29 #include "base/single_thread_task_runner.h" | 29 #include "base/single_thread_task_runner.h" |
30 #include "base/stl_util.h" | 30 #include "base/stl_util.h" |
31 #include "base/strings/string_util.h" | 31 #include "base/strings/string_util.h" |
32 #include "base/strings/utf_string_conversions.h" | 32 #include "base/strings/utf_string_conversions.h" |
33 #include "base/thread_task_runner_handle.h" | 33 #include "base/thread_task_runner_handle.h" |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 return false; | 210 return false; |
211 IPEndPoint endpoint; | 211 IPEndPoint endpoint; |
212 rv = socket->GetLocalAddress(&endpoint); | 212 rv = socket->GetLocalAddress(&endpoint); |
213 if (rv != OK) | 213 if (rv != OK) |
214 return false; | 214 return false; |
215 DCHECK_EQ(ADDRESS_FAMILY_IPV6, endpoint.GetFamily()); | 215 DCHECK_EQ(ADDRESS_FAMILY_IPV6, endpoint.GetFamily()); |
216 const IPAddressNumber& address = endpoint.address(); | 216 const IPAddressNumber& address = endpoint.address(); |
217 bool is_link_local = (address[0] == 0xFE) && ((address[1] & 0xC0) == 0x80); | 217 bool is_link_local = (address[0] == 0xFE) && ((address[1] & 0xC0) == 0x80); |
218 if (is_link_local) | 218 if (is_link_local) |
219 return false; | 219 return false; |
220 const uint8 kTeredoPrefix[] = { 0x20, 0x01, 0, 0 }; | 220 const uint8_t kTeredoPrefix[] = {0x20, 0x01, 0, 0}; |
221 bool is_teredo = std::equal(kTeredoPrefix, | 221 bool is_teredo = std::equal(kTeredoPrefix, |
222 kTeredoPrefix + arraysize(kTeredoPrefix), | 222 kTeredoPrefix + arraysize(kTeredoPrefix), |
223 address.begin()); | 223 address.begin()); |
224 if (is_teredo) | 224 if (is_teredo) |
225 return false; | 225 return false; |
226 return true; | 226 return true; |
227 } | 227 } |
228 | 228 |
229 // Provide a common macro to simplify code and readability. We must use a | 229 // Provide a common macro to simplify code and readability. We must use a |
230 // macro as the underlying HISTOGRAM macro creates static variables. | 230 // macro as the underlying HISTOGRAM macro creates static variables. |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 std::string group_name = base::FieldTrialList::FindFullName("AsyncDns"); | 281 std::string group_name = base::FieldTrialList::FindFullName("AsyncDns"); |
282 if (!group_name.empty()) { | 282 if (!group_name.empty()) { |
283 return base::StartsWith(group_name, "AsyncDnsNoFallback", | 283 return base::StartsWith(group_name, "AsyncDnsNoFallback", |
284 base::CompareCase::INSENSITIVE_ASCII); | 284 base::CompareCase::INSENSITIVE_ASCII); |
285 } | 285 } |
286 return kDefault; | 286 return kDefault; |
287 } | 287 } |
288 | 288 |
289 //----------------------------------------------------------------------------- | 289 //----------------------------------------------------------------------------- |
290 | 290 |
291 AddressList EnsurePortOnAddressList(const AddressList& list, uint16 port) { | 291 AddressList EnsurePortOnAddressList(const AddressList& list, uint16_t port) { |
292 if (list.empty() || list.front().port() == port) | 292 if (list.empty() || list.front().port() == port) |
293 return list; | 293 return list; |
294 return AddressList::CopyWithPort(list, port); | 294 return AddressList::CopyWithPort(list, port); |
295 } | 295 } |
296 | 296 |
297 // Returns true if |addresses| contains only IPv4 loopback addresses. | 297 // Returns true if |addresses| contains only IPv4 loopback addresses. |
298 bool IsAllIPv4Loopback(const AddressList& addresses) { | 298 bool IsAllIPv4Loopback(const AddressList& addresses) { |
299 for (unsigned i = 0; i < addresses.size(); ++i) { | 299 for (unsigned i = 0; i < addresses.size(); ++i) { |
300 const IPAddressNumber& address = addresses[i].address(); | 300 const IPAddressNumber& address = addresses[i].address(); |
301 switch (addresses[i].GetFamily()) { | 301 switch (addresses[i].GetFamily()) { |
302 case ADDRESS_FAMILY_IPV4: | 302 case ADDRESS_FAMILY_IPV4: |
303 if (address[0] != 127) | 303 if (address[0] != 127) |
304 return false; | 304 return false; |
305 break; | 305 break; |
306 case ADDRESS_FAMILY_IPV6: | 306 case ADDRESS_FAMILY_IPV6: |
307 return false; | 307 return false; |
308 default: | 308 default: |
309 NOTREACHED(); | 309 NOTREACHED(); |
310 return false; | 310 return false; |
311 } | 311 } |
312 } | 312 } |
313 return true; | 313 return true; |
314 } | 314 } |
315 | 315 |
316 // Creates NetLog parameters when the resolve failed. | 316 // Creates NetLog parameters when the resolve failed. |
317 scoped_ptr<base::Value> NetLogProcTaskFailedCallback( | 317 scoped_ptr<base::Value> NetLogProcTaskFailedCallback( |
318 uint32 attempt_number, | 318 uint32_t attempt_number, |
319 int net_error, | 319 int net_error, |
320 int os_error, | 320 int os_error, |
321 NetLogCaptureMode /* capture_mode */) { | 321 NetLogCaptureMode /* capture_mode */) { |
322 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 322 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
323 if (attempt_number) | 323 if (attempt_number) |
324 dict->SetInteger("attempt_number", attempt_number); | 324 dict->SetInteger("attempt_number", attempt_number); |
325 | 325 |
326 dict->SetInteger("net_error", net_error); | 326 dict->SetInteger("net_error", net_error); |
327 | 327 |
328 if (os_error) { | 328 if (os_error) { |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
689 params_.unresponsive_delay); | 689 params_.unresponsive_delay); |
690 } | 690 } |
691 } | 691 } |
692 | 692 |
693 // WARNING: This code runs inside a worker pool. The shutdown code cannot | 693 // WARNING: This code runs inside a worker pool. The shutdown code cannot |
694 // wait for it to finish, so we must be very careful here about using other | 694 // wait for it to finish, so we must be very careful here about using other |
695 // objects (like MessageLoops, Singletons, etc). During shutdown these objects | 695 // objects (like MessageLoops, Singletons, etc). During shutdown these objects |
696 // may no longer exist. Multiple DoLookups() could be running in parallel, so | 696 // may no longer exist. Multiple DoLookups() could be running in parallel, so |
697 // any state inside of |this| must not mutate . | 697 // any state inside of |this| must not mutate . |
698 void DoLookup(const base::TimeTicks& start_time, | 698 void DoLookup(const base::TimeTicks& start_time, |
699 const uint32 attempt_number) { | 699 const uint32_t attempt_number) { |
700 AddressList results; | 700 AddressList results; |
701 int os_error = 0; | 701 int os_error = 0; |
702 // Running on the worker thread | 702 // Running on the worker thread |
703 int error = params_.resolver_proc->Resolve(key_.hostname, | 703 int error = params_.resolver_proc->Resolve(key_.hostname, |
704 key_.address_family, | 704 key_.address_family, |
705 key_.host_resolver_flags, | 705 key_.host_resolver_flags, |
706 &results, | 706 &results, |
707 &os_error); | 707 &os_error); |
708 | 708 |
709 // Fail the resolution if the result contains 127.0.53.53. See the comment | 709 // Fail the resolution if the result contains 127.0.53.53. See the comment |
(...skipping 25 matching lines...) Expand all Loading... |
735 if (was_completed() || was_canceled()) | 735 if (was_completed() || was_canceled()) |
736 return; | 736 return; |
737 | 737 |
738 params_.unresponsive_delay *= params_.retry_factor; | 738 params_.unresponsive_delay *= params_.retry_factor; |
739 StartLookupAttempt(); | 739 StartLookupAttempt(); |
740 } | 740 } |
741 | 741 |
742 // Callback for when DoLookup() completes (runs on task runner thread). | 742 // Callback for when DoLookup() completes (runs on task runner thread). |
743 void OnLookupComplete(const AddressList& results, | 743 void OnLookupComplete(const AddressList& results, |
744 const base::TimeTicks& start_time, | 744 const base::TimeTicks& start_time, |
745 const uint32 attempt_number, | 745 const uint32_t attempt_number, |
746 int error, | 746 int error, |
747 const int os_error) { | 747 const int os_error) { |
748 DCHECK(task_runner_->BelongsToCurrentThread()); | 748 DCHECK(task_runner_->BelongsToCurrentThread()); |
749 // If results are empty, we should return an error. | 749 // If results are empty, we should return an error. |
750 bool empty_list_on_ok = (error == OK && results.empty()); | 750 bool empty_list_on_ok = (error == OK && results.empty()); |
751 UMA_HISTOGRAM_BOOLEAN("DNS.EmptyAddressListAndNoError", empty_list_on_ok); | 751 UMA_HISTOGRAM_BOOLEAN("DNS.EmptyAddressListAndNoError", empty_list_on_ok); |
752 if (empty_list_on_ok) | 752 if (empty_list_on_ok) |
753 error = ERR_NAME_NOT_RESOLVED; | 753 error = ERR_NAME_NOT_RESOLVED; |
754 | 754 |
755 bool was_retry_attempt = attempt_number > 1; | 755 bool was_retry_attempt = attempt_number > 1; |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
868 UMA_HISTOGRAM_CUSTOM_ENUMERATION(kOSErrorsForGetAddrinfoHistogramName, | 868 UMA_HISTOGRAM_CUSTOM_ENUMERATION(kOSErrorsForGetAddrinfoHistogramName, |
869 std::abs(os_error), | 869 std::abs(os_error), |
870 GetAllGetAddrinfoOSErrors()); | 870 GetAllGetAddrinfoOSErrors()); |
871 } | 871 } |
872 DCHECK_LT(category, static_cast<int>(RESOLVE_MAX)); // Be sure it was set. | 872 DCHECK_LT(category, static_cast<int>(RESOLVE_MAX)); // Be sure it was set. |
873 | 873 |
874 UMA_HISTOGRAM_ENUMERATION("DNS.ResolveCategory", category, RESOLVE_MAX); | 874 UMA_HISTOGRAM_ENUMERATION("DNS.ResolveCategory", category, RESOLVE_MAX); |
875 } | 875 } |
876 | 876 |
877 void RecordAttemptHistograms(const base::TimeTicks& start_time, | 877 void RecordAttemptHistograms(const base::TimeTicks& start_time, |
878 const uint32 attempt_number, | 878 const uint32_t attempt_number, |
879 const int error, | 879 const int error, |
880 const int os_error) const { | 880 const int os_error) const { |
881 DCHECK(task_runner_->BelongsToCurrentThread()); | 881 DCHECK(task_runner_->BelongsToCurrentThread()); |
882 bool first_attempt_to_complete = | 882 bool first_attempt_to_complete = |
883 completed_attempt_number_ == attempt_number; | 883 completed_attempt_number_ == attempt_number; |
884 bool is_first_attempt = (attempt_number == 1); | 884 bool is_first_attempt = (attempt_number == 1); |
885 | 885 |
886 if (first_attempt_to_complete) { | 886 if (first_attempt_to_complete) { |
887 // If this was first attempt to complete, then record the resolution | 887 // If this was first attempt to complete, then record the resolution |
888 // status of the attempt. | 888 // status of the attempt. |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
936 | 936 |
937 // The listener to the results of this ProcTask. | 937 // The listener to the results of this ProcTask. |
938 Callback callback_; | 938 Callback callback_; |
939 | 939 |
940 // Used to post ourselves onto the task runner thread. | 940 // Used to post ourselves onto the task runner thread. |
941 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; | 941 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
942 | 942 |
943 // Keeps track of the number of attempts we have made so far to resolve the | 943 // Keeps track of the number of attempts we have made so far to resolve the |
944 // host. Whenever we start an attempt to resolve the host, we increase this | 944 // host. Whenever we start an attempt to resolve the host, we increase this |
945 // number. | 945 // number. |
946 uint32 attempt_number_; | 946 uint32_t attempt_number_; |
947 | 947 |
948 // The index of the attempt which finished first (or 0 if the job is still in | 948 // The index of the attempt which finished first (or 0 if the job is still in |
949 // progress). | 949 // progress). |
950 uint32 completed_attempt_number_; | 950 uint32_t completed_attempt_number_; |
951 | 951 |
952 // The result (a net error code) from the first attempt to complete. | 952 // The result (a net error code) from the first attempt to complete. |
953 int completed_attempt_error_; | 953 int completed_attempt_error_; |
954 | 954 |
955 // The time when retry attempt was finished. | 955 // The time when retry attempt was finished. |
956 base::TimeTicks retry_attempt_finished_time_; | 956 base::TimeTicks retry_attempt_finished_time_; |
957 | 957 |
958 // True if a non-speculative request was ever attached to this job | 958 // True if a non-speculative request was ever attached to this job |
959 // (regardless of whether or not it was later canceled. | 959 // (regardless of whether or not it was later canceled. |
960 // This boolean is used for histogramming the duration of jobs used to | 960 // This boolean is used for histogramming the duration of jobs used to |
(...skipping 1465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2426 dns_client_->SetConfig(dns_config); | 2426 dns_client_->SetConfig(dns_config); |
2427 num_dns_failures_ = 0; | 2427 num_dns_failures_ = 0; |
2428 if (dns_client_->GetConfig()) | 2428 if (dns_client_->GetConfig()) |
2429 UMA_HISTOGRAM_BOOLEAN("AsyncDNS.DnsClientEnabled", true); | 2429 UMA_HISTOGRAM_BOOLEAN("AsyncDNS.DnsClientEnabled", true); |
2430 } | 2430 } |
2431 | 2431 |
2432 AbortDnsTasks(); | 2432 AbortDnsTasks(); |
2433 } | 2433 } |
2434 | 2434 |
2435 } // namespace net | 2435 } // namespace net |
OLD | NEW |