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/socket/transport_client_socket_pool.h" | 5 #include "net/socket/transport_client_socket_pool.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
13 #include "base/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
| 14 #include "base/profiler/scoped_tracker.h" |
14 #include "base/strings/string_util.h" | 15 #include "base/strings/string_util.h" |
15 #include "base/synchronization/lock.h" | 16 #include "base/synchronization/lock.h" |
16 #include "base/time/time.h" | 17 #include "base/time/time.h" |
17 #include "base/values.h" | 18 #include "base/values.h" |
18 #include "net/base/ip_endpoint.h" | 19 #include "net/base/ip_endpoint.h" |
19 #include "net/base/net_errors.h" | 20 #include "net/base/net_errors.h" |
20 #include "net/log/net_log.h" | 21 #include "net/log/net_log.h" |
21 #include "net/socket/client_socket_factory.h" | 22 #include "net/socket/client_socket_factory.h" |
22 #include "net/socket/client_socket_handle.h" | 23 #include "net/socket/client_socket_handle.h" |
23 #include "net/socket/client_socket_pool_base.h" | 24 #include "net/socket/client_socket_pool_base.h" |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
231 void TransportConnectJob::MakeAddressListStartWithIPv4(AddressList* list) { | 232 void TransportConnectJob::MakeAddressListStartWithIPv4(AddressList* list) { |
232 for (AddressList::iterator i = list->begin(); i != list->end(); ++i) { | 233 for (AddressList::iterator i = list->begin(); i != list->end(); ++i) { |
233 if (i->GetFamily() == ADDRESS_FAMILY_IPV4) { | 234 if (i->GetFamily() == ADDRESS_FAMILY_IPV4) { |
234 std::rotate(list->begin(), i, list->end()); | 235 std::rotate(list->begin(), i, list->end()); |
235 break; | 236 break; |
236 } | 237 } |
237 } | 238 } |
238 } | 239 } |
239 | 240 |
240 int TransportConnectJob::DoResolveHost() { | 241 int TransportConnectJob::DoResolveHost() { |
241 // TODO(vadimt): Remove ScopedTracker below once crbug.com/436634 is fixed. | 242 // TODO(ricea): Remove ScopedTracker below once crbug.com/436634 is fixed. |
242 tracked_objects::ScopedTracker tracking_profile( | 243 tracked_objects::ScopedTracker tracking_profile( |
243 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 244 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
244 "436634 TransportConnectJob::DoResolveHost")); | 245 "436634 TransportConnectJob::DoResolveHost")); |
245 | 246 |
246 return helper_.DoResolveHost(priority(), net_log()); | 247 return helper_.DoResolveHost(priority(), net_log()); |
247 } | 248 } |
248 | 249 |
249 int TransportConnectJob::DoResolveHostComplete(int result) { | 250 int TransportConnectJob::DoResolveHostComplete(int result) { |
250 // TODO(vadimt): Remove ScopedTracker below once crbug.com/436634 is fixed. | |
251 tracked_objects::ScopedTracker tracking_profile( | |
252 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
253 "436634 TransportConnectJob::DoResolveHostComplete")); | |
254 | |
255 return helper_.DoResolveHostComplete(result, net_log()); | 251 return helper_.DoResolveHostComplete(result, net_log()); |
256 } | 252 } |
257 | 253 |
258 int TransportConnectJob::DoTransportConnect() { | 254 int TransportConnectJob::DoTransportConnect() { |
259 // TODO(vadimt): Remove ScopedTracker below once crbug.com/436634 is fixed. | |
260 tracked_objects::ScopedTracker tracking_profile( | |
261 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
262 "436634 TransportConnectJob::DoTransportConnect")); | |
263 | |
264 base::TimeTicks now = base::TimeTicks::Now(); | 255 base::TimeTicks now = base::TimeTicks::Now(); |
265 base::TimeTicks last_connect_time; | 256 base::TimeTicks last_connect_time; |
266 { | 257 { |
267 base::AutoLock lock(g_last_connect_time_lock.Get()); | 258 base::AutoLock lock(g_last_connect_time_lock.Get()); |
268 last_connect_time = g_last_connect_time.Get(); | 259 last_connect_time = g_last_connect_time.Get(); |
269 *g_last_connect_time.Pointer() = now; | 260 *g_last_connect_time.Pointer() = now; |
270 } | 261 } |
271 if (last_connect_time.is_null()) { | 262 if (last_connect_time.is_null()) { |
272 interval_between_connects_ = CONNECT_INTERVAL_GT_20MS; | 263 interval_between_connects_ = CONNECT_INTERVAL_GT_20MS; |
273 } else { | 264 } else { |
274 int64 interval = (now - last_connect_time).InMilliseconds(); | 265 int64 interval = (now - last_connect_time).InMilliseconds(); |
275 if (interval <= 10) | 266 if (interval <= 10) |
276 interval_between_connects_ = CONNECT_INTERVAL_LE_10MS; | 267 interval_between_connects_ = CONNECT_INTERVAL_LE_10MS; |
277 else if (interval <= 20) | 268 else if (interval <= 20) |
278 interval_between_connects_ = CONNECT_INTERVAL_LE_20MS; | 269 interval_between_connects_ = CONNECT_INTERVAL_LE_20MS; |
279 else | 270 else |
280 interval_between_connects_ = CONNECT_INTERVAL_GT_20MS; | 271 interval_between_connects_ = CONNECT_INTERVAL_GT_20MS; |
281 } | 272 } |
282 | 273 |
283 // TODO(vadimt): Remove ScopedTracker below once crbug.com/436634 is fixed. | |
284 tracked_objects::ScopedTracker tracking_profile1( | |
285 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
286 "436634 TransportConnectJob::DoTransportConnect1")); | |
287 | |
288 helper_.set_next_state( | 274 helper_.set_next_state( |
289 TransportConnectJobHelper::STATE_TRANSPORT_CONNECT_COMPLETE); | 275 TransportConnectJobHelper::STATE_TRANSPORT_CONNECT_COMPLETE); |
290 transport_socket_ = | 276 transport_socket_ = |
291 helper_.client_socket_factory()->CreateTransportClientSocket( | 277 helper_.client_socket_factory()->CreateTransportClientSocket( |
292 helper_.addresses(), net_log().net_log(), net_log().source()); | 278 helper_.addresses(), net_log().net_log(), net_log().source()); |
293 | 279 |
294 // If the list contains IPv6 and IPv4 addresses, the first address will | 280 // If the list contains IPv6 and IPv4 addresses, the first address will |
295 // be IPv6, and the IPv4 addresses will be tried as fallback addresses, | 281 // be IPv6, and the IPv4 addresses will be tried as fallback addresses, |
296 // per "Happy Eyeballs" (RFC 6555). | 282 // per "Happy Eyeballs" (RFC 6555). |
297 bool try_ipv6_connect_with_ipv4_fallback = | 283 bool try_ipv6_connect_with_ipv4_fallback = |
298 helper_.addresses().front().GetFamily() == ADDRESS_FAMILY_IPV6 && | 284 helper_.addresses().front().GetFamily() == ADDRESS_FAMILY_IPV6 && |
299 !AddressListOnlyContainsIPv6(helper_.addresses()); | 285 !AddressListOnlyContainsIPv6(helper_.addresses()); |
300 | 286 |
301 // Enable TCP FastOpen if indicated by transport socket params. | 287 // Enable TCP FastOpen if indicated by transport socket params. |
302 // Note: We currently do not turn on TCP FastOpen for destinations where | 288 // Note: We currently do not turn on TCP FastOpen for destinations where |
303 // we try a TCP connect over IPv6 with fallback to IPv4. | 289 // we try a TCP connect over IPv6 with fallback to IPv4. |
304 if (!try_ipv6_connect_with_ipv4_fallback && | 290 if (!try_ipv6_connect_with_ipv4_fallback && |
305 helper_.params()->combine_connect_and_write() == | 291 helper_.params()->combine_connect_and_write() == |
306 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DESIRED) { | 292 TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DESIRED) { |
307 transport_socket_->EnableTCPFastOpenIfSupported(); | 293 transport_socket_->EnableTCPFastOpenIfSupported(); |
308 } | 294 } |
309 | 295 |
310 // TODO(vadimt): Remove ScopedTracker below once crbug.com/436634 is fixed. | |
311 tracked_objects::ScopedTracker tracking_profile2( | |
312 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
313 "436634 TransportConnectJob::DoTransportConnect2")); | |
314 | |
315 int rv = transport_socket_->Connect(helper_.on_io_complete()); | 296 int rv = transport_socket_->Connect(helper_.on_io_complete()); |
316 | |
317 // TODO(vadimt): Remove ScopedTracker below once crbug.com/436634 is fixed. | |
318 tracked_objects::ScopedTracker tracking_profile3( | |
319 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
320 "436634 TransportConnectJob::DoTransportConnect3")); | |
321 | |
322 if (rv == ERR_IO_PENDING && try_ipv6_connect_with_ipv4_fallback) { | 297 if (rv == ERR_IO_PENDING && try_ipv6_connect_with_ipv4_fallback) { |
323 fallback_timer_.Start( | 298 fallback_timer_.Start( |
324 FROM_HERE, | 299 FROM_HERE, |
325 base::TimeDelta::FromMilliseconds( | 300 base::TimeDelta::FromMilliseconds( |
326 TransportConnectJobHelper::kIPv6FallbackTimerInMs), | 301 TransportConnectJobHelper::kIPv6FallbackTimerInMs), |
327 this, | 302 this, |
328 &TransportConnectJob::DoIPv6FallbackTransportConnect); | 303 &TransportConnectJob::DoIPv6FallbackTransportConnect); |
329 } | 304 } |
330 return rv; | 305 return rv; |
331 } | 306 } |
332 | 307 |
333 int TransportConnectJob::DoTransportConnectComplete(int result) { | 308 int TransportConnectJob::DoTransportConnectComplete(int result) { |
334 // TODO(vadimt): Remove ScopedTracker below once crbug.com/436634 is fixed. | |
335 tracked_objects::ScopedTracker tracking_profile( | |
336 FROM_HERE_WITH_EXPLICIT_FUNCTION( | |
337 "436634 TransportConnectJob::DoTransportConnectComplete")); | |
338 | |
339 if (result == OK) { | 309 if (result == OK) { |
340 bool is_ipv4 = | 310 bool is_ipv4 = |
341 helper_.addresses().front().GetFamily() == ADDRESS_FAMILY_IPV4; | 311 helper_.addresses().front().GetFamily() == ADDRESS_FAMILY_IPV4; |
342 TransportConnectJobHelper::ConnectionLatencyHistogram race_result = | 312 TransportConnectJobHelper::ConnectionLatencyHistogram race_result = |
343 TransportConnectJobHelper::CONNECTION_LATENCY_UNKNOWN; | 313 TransportConnectJobHelper::CONNECTION_LATENCY_UNKNOWN; |
344 if (is_ipv4) { | 314 if (is_ipv4) { |
345 race_result = TransportConnectJobHelper::CONNECTION_LATENCY_IPV4_NO_RACE; | 315 race_result = TransportConnectJobHelper::CONNECTION_LATENCY_IPV4_NO_RACE; |
346 } else { | 316 } else { |
347 if (AddressListOnlyContainsIPv6(helper_.addresses())) { | 317 if (AddressListOnlyContainsIPv6(helper_.addresses())) { |
348 race_result = TransportConnectJobHelper::CONNECTION_LATENCY_IPV6_SOLO; | 318 race_result = TransportConnectJobHelper::CONNECTION_LATENCY_IPV6_SOLO; |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
593 HigherLayeredPool* higher_pool) { | 563 HigherLayeredPool* higher_pool) { |
594 base_.AddHigherLayeredPool(higher_pool); | 564 base_.AddHigherLayeredPool(higher_pool); |
595 } | 565 } |
596 | 566 |
597 void TransportClientSocketPool::RemoveHigherLayeredPool( | 567 void TransportClientSocketPool::RemoveHigherLayeredPool( |
598 HigherLayeredPool* higher_pool) { | 568 HigherLayeredPool* higher_pool) { |
599 base_.RemoveHigherLayeredPool(higher_pool); | 569 base_.RemoveHigherLayeredPool(higher_pool); |
600 } | 570 } |
601 | 571 |
602 } // namespace net | 572 } // namespace net |
OLD | NEW |