diff options
author | jar@chromium.org <jar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-16 19:06:03 +0000 |
---|---|---|
committer | jar@chromium.org <jar@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-16 19:06:03 +0000 |
commit | 0f8f1b43ed25b241a8cf0a9c28c1185a79dad402 (patch) | |
tree | bce894104c5c7345c1ee36a985d5de97a18bac20 /chrome/browser/io_thread.cc | |
parent | c1d3c6fc04293d8fac98412cfc818ddd5978d0c4 (diff) | |
download | chromium_src-0f8f1b43ed25b241a8cf0a9c28c1185a79dad402.zip chromium_src-0f8f1b43ed25b241a8cf0a9c28c1185a79dad402.tar.gz chromium_src-0f8f1b43ed25b241a8cf0a9c28c1185a79dad402.tar.bz2 |
Refine IPv6 probe to require that the client has an IPv6 address on an interface
This currently only works on Posix, not windows.
Network changes are monitored, and the test is repeated each time interfaces
change (which is a subset of any IP addresses changing).
The test performed is performed on a worker thread, so latency should not
be an issue (even if we created much slower tests).
The current test appears to takes in the raneg of 50-100ms, and probably
(under the covers) does some reading from files).
BUG=25680
BUG=12754
r=wtc,eroman
Review URL: http://codereview.chromium.org/1006001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@41743 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/io_thread.cc')
-rw-r--r-- | chrome/browser/io_thread.cc | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/chrome/browser/io_thread.cc b/chrome/browser/io_thread.cc index 2ea8195..d2ce04e 100644 --- a/chrome/browser/io_thread.cc +++ b/chrome/browser/io_thread.cc @@ -27,44 +27,49 @@ namespace { net::HostResolver* CreateGlobalHostResolver( net::NetworkChangeNotifier* network_change_notifier) { - net::HostResolver* global_host_resolver = NULL; - const CommandLine& command_line = *CommandLine::ForCurrentProcess(); - - global_host_resolver = + net::HostResolver* global_host_resolver = net::CreateSystemHostResolver(network_change_notifier); + // Determine if we should disable IPv6 support. if (!command_line.HasSwitch(switches::kEnableIPv6)) { - // Measure impact of allowing IPv6 support without probing. - const FieldTrial::Probability kDivisor = 100; - const FieldTrial::Probability kProbability = 50; // 50% probability. - FieldTrial* trial = new FieldTrial("IPv6_Probe", kDivisor); - int skip_group = trial->AppendGroup("_IPv6_probe_skipped", kProbability); - trial->AppendGroup("_IPv6_probe_done", - FieldTrial::kAllRemainingProbability); - bool use_ipv6_probe = (trial->group() != skip_group); - - // Perform probe, and then optionally use result to disable IPv6. - // Some users report confused OS handling of IPv6, leading to large - // latency. If we can show that IPv6 is not supported, then disabliing it - // will work around such problems. - if ((!net::IPv6Supported() && use_ipv6_probe) || - command_line.HasSwitch(switches::kDisableIPv6)) + if (command_line.HasSwitch(switches::kDisableIPv6)) { global_host_resolver->SetDefaultAddressFamily(net::ADDRESS_FAMILY_IPV4); + } else { + net::HostResolverImpl* host_resolver_impl = + global_host_resolver->GetAsHostResolverImpl(); + if (host_resolver_impl != NULL) { + // (optionally) Use probe to decide if support is warranted. + + // Measure impact of probing to allow IPv6. + // Some users report confused OS handling of IPv6, leading to large + // latency. If we can show that IPv6 is not supported, then disabliing + // it will work around such problems. + const FieldTrial::Probability kDivisor = 100; + const FieldTrial::Probability kProbability = 50; // 50% probability. + FieldTrial* trial = new FieldTrial("IPv6_Probe", kDivisor); + int skip_group = trial->AppendGroup("_IPv6_probe_skipped", + kProbability); + trial->AppendGroup("_IPv6_probe_done", + FieldTrial::kAllRemainingProbability); + bool use_ipv6_probe = (trial->group() != skip_group); + if (use_ipv6_probe) + host_resolver_impl->ProbeIPv6Support(); + } + } } // If hostname remappings were specified on the command-line, layer these // rules on top of the real host resolver. This allows forwarding all requests // through a designated test server. - if (command_line.HasSwitch(switches::kHostResolverRules)) { - net::MappedHostResolver* remapped_resolver = - new net::MappedHostResolver(global_host_resolver); - global_host_resolver = remapped_resolver; - remapped_resolver->SetRulesFromString( - command_line.GetSwitchValueASCII(switches::kHostResolverRules)); - } - - return global_host_resolver; + if (!command_line.HasSwitch(switches::kHostResolverRules)) + return global_host_resolver; + + net::MappedHostResolver* remapped_resolver = + new net::MappedHostResolver(global_host_resolver); + remapped_resolver->SetRulesFromString( + command_line.GetSwitchValueASCII(switches::kHostResolverRules)); + return remapped_resolver; } } // namespace |