| 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/quic/chromium/quic_stream_factory.h" | 5 #include "net/quic/chromium/quic_stream_factory.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <tuple> | 8 #include <tuple> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 #include "net/socket/udp_client_socket.h" | 60 #include "net/socket/udp_client_socket.h" |
| 61 #include "net/ssl/token_binding.h" | 61 #include "net/ssl/token_binding.h" |
| 62 #include "third_party/boringssl/src/include/openssl/aead.h" | 62 #include "third_party/boringssl/src/include/openssl/aead.h" |
| 63 #include "url/gurl.h" | 63 #include "url/gurl.h" |
| 64 #include "url/url_constants.h" | 64 #include "url/url_constants.h" |
| 65 | 65 |
| 66 using NetworkHandle = net::NetworkChangeNotifier::NetworkHandle; | 66 using NetworkHandle = net::NetworkChangeNotifier::NetworkHandle; |
| 67 | 67 |
| 68 namespace net { | 68 namespace net { |
| 69 | 69 |
| 70 // Returns the estimate of dynamically allocated memory of an IPEndPoint in |
| 71 // bytes. Used in tracking IPAliasMap. |
| 72 size_t EstimateMemoryUsage(const IPEndPoint& end_point) { |
| 73 return 0; |
| 74 } |
| 75 |
| 70 namespace { | 76 namespace { |
| 71 | 77 |
| 72 enum CreateSessionFailure { | 78 enum CreateSessionFailure { |
| 73 CREATION_ERROR_CONNECTING_SOCKET, | 79 CREATION_ERROR_CONNECTING_SOCKET, |
| 74 CREATION_ERROR_SETTING_RECEIVE_BUFFER, | 80 CREATION_ERROR_SETTING_RECEIVE_BUFFER, |
| 75 CREATION_ERROR_SETTING_SEND_BUFFER, | 81 CREATION_ERROR_SETTING_SEND_BUFFER, |
| 76 CREATION_ERROR_SETTING_DO_NOT_FRAGMENT, | 82 CREATION_ERROR_SETTING_DO_NOT_FRAGMENT, |
| 77 CREATION_ERROR_MAX | 83 CREATION_ERROR_MAX |
| 78 }; | 84 }; |
| 79 | 85 |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 283 | 289 |
| 284 void OnComplete() { | 290 void OnComplete() { |
| 285 UMA_HISTOGRAM_TIMES("Net.QuicSession.CertVerifierJob.CompleteTime", | 291 UMA_HISTOGRAM_TIMES("Net.QuicSession.CertVerifierJob.CompleteTime", |
| 286 base::TimeTicks::Now() - start_time_); | 292 base::TimeTicks::Now() - start_time_); |
| 287 if (!callback_.is_null()) | 293 if (!callback_.is_null()) |
| 288 base::ResetAndReturn(&callback_).Run(OK); | 294 base::ResetAndReturn(&callback_).Run(OK); |
| 289 } | 295 } |
| 290 | 296 |
| 291 const QuicServerId& server_id() const { return server_id_; } | 297 const QuicServerId& server_id() const { return server_id_; } |
| 292 | 298 |
| 299 size_t EstimateMemoryUsage() const { |
| 300 // TODO(xunjieli): crbug.com/669108. Track |verify_context_| and |
| 301 // |verify_details_|. |
| 302 return base::trace_event::EstimateMemoryUsage(verify_error_details_); |
| 303 } |
| 304 |
| 293 private: | 305 private: |
| 294 const QuicServerId server_id_; | 306 const QuicServerId server_id_; |
| 295 ProofVerifierCallbackImpl* verify_callback_; | 307 ProofVerifierCallbackImpl* verify_callback_; |
| 296 std::unique_ptr<ProofVerifyContext> verify_context_; | 308 std::unique_ptr<ProofVerifyContext> verify_context_; |
| 297 std::unique_ptr<ProofVerifyDetails> verify_details_; | 309 std::unique_ptr<ProofVerifyDetails> verify_details_; |
| 298 std::string verify_error_details_; | 310 std::string verify_error_details_; |
| 299 const base::TimeTicks start_time_; | 311 const base::TimeTicks start_time_; |
| 300 const NetLogWithSource net_log_; | 312 const NetLogWithSource net_log_; |
| 301 CompletionCallback callback_; | 313 CompletionCallback callback_; |
| 302 base::WeakPtrFactory<CertVerifierJob> weak_factory_; | 314 base::WeakPtrFactory<CertVerifierJob> weak_factory_; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 void RunAuxilaryJob(); | 352 void RunAuxilaryJob(); |
| 341 | 353 |
| 342 void Cancel(); | 354 void Cancel(); |
| 343 | 355 |
| 344 void CancelWaitForDataReadyCallback(); | 356 void CancelWaitForDataReadyCallback(); |
| 345 | 357 |
| 346 const QuicSessionKey& key() const { return key_; } | 358 const QuicSessionKey& key() const { return key_; } |
| 347 | 359 |
| 348 base::WeakPtr<Job> GetWeakPtr() { return weak_factory_.GetWeakPtr(); } | 360 base::WeakPtr<Job> GetWeakPtr() { return weak_factory_.GetWeakPtr(); } |
| 349 | 361 |
| 362 // Returns the estimate of dynamically allocated memory in bytes. |
| 363 size_t EstimateMemoryUsage() const; |
| 364 |
| 350 private: | 365 private: |
| 351 enum IoState { | 366 enum IoState { |
| 352 STATE_NONE, | 367 STATE_NONE, |
| 353 STATE_RESOLVE_HOST, | 368 STATE_RESOLVE_HOST, |
| 354 STATE_RESOLVE_HOST_COMPLETE, | 369 STATE_RESOLVE_HOST_COMPLETE, |
| 355 STATE_LOAD_SERVER_INFO, | 370 STATE_LOAD_SERVER_INFO, |
| 356 STATE_LOAD_SERVER_INFO_COMPLETE, | 371 STATE_LOAD_SERVER_INFO_COMPLETE, |
| 357 STATE_CONNECT, | 372 STATE_CONNECT, |
| 358 STATE_CONNECT_COMPLETE, | 373 STATE_CONNECT_COMPLETE, |
| 359 }; | 374 }; |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 486 } | 501 } |
| 487 | 502 |
| 488 void QuicStreamFactory::Job::CancelWaitForDataReadyCallback() { | 503 void QuicStreamFactory::Job::CancelWaitForDataReadyCallback() { |
| 489 // If we are waiting for WaitForDataReadyCallback, then cancel the callback. | 504 // If we are waiting for WaitForDataReadyCallback, then cancel the callback. |
| 490 if (io_state_ != STATE_LOAD_SERVER_INFO_COMPLETE) | 505 if (io_state_ != STATE_LOAD_SERVER_INFO_COMPLETE) |
| 491 return; | 506 return; |
| 492 server_info_->CancelWaitForDataReadyCallback(); | 507 server_info_->CancelWaitForDataReadyCallback(); |
| 493 OnIOComplete(OK); | 508 OnIOComplete(OK); |
| 494 } | 509 } |
| 495 | 510 |
| 511 size_t QuicStreamFactory::Job::EstimateMemoryUsage() const { |
| 512 return base::trace_event::EstimateMemoryUsage(key_) + |
| 513 base::trace_event::EstimateMemoryUsage(server_info_); |
| 514 } |
| 515 |
| 496 int QuicStreamFactory::Job::DoResolveHost() { | 516 int QuicStreamFactory::Job::DoResolveHost() { |
| 497 dns_resolution_start_time_ = base::TimeTicks::Now(); | 517 dns_resolution_start_time_ = base::TimeTicks::Now(); |
| 498 // Start loading the data now, and wait for it after we resolve the host. | 518 // Start loading the data now, and wait for it after we resolve the host. |
| 499 if (server_info_) | 519 if (server_info_) |
| 500 server_info_->Start(); | 520 server_info_->Start(); |
| 501 | 521 |
| 502 io_state_ = STATE_RESOLVE_HOST_COMPLETE; | 522 io_state_ = STATE_RESOLVE_HOST_COMPLETE; |
| 503 return host_resolver_->Resolve( | 523 return host_resolver_->Resolve( |
| 504 HostResolver::RequestInfo(key_.destination()), DEFAULT_PRIORITY, | 524 HostResolver::RequestInfo(key_.destination()), DEFAULT_PRIORITY, |
| 505 &address_list_, | 525 &address_list_, |
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 917 } | 937 } |
| 918 | 938 |
| 919 void QuicStreamFactory::set_quic_server_info_factory( | 939 void QuicStreamFactory::set_quic_server_info_factory( |
| 920 QuicServerInfoFactory* quic_server_info_factory) { | 940 QuicServerInfoFactory* quic_server_info_factory) { |
| 921 quic_server_info_factory_.reset(quic_server_info_factory); | 941 quic_server_info_factory_.reset(quic_server_info_factory); |
| 922 } | 942 } |
| 923 | 943 |
| 924 void QuicStreamFactory::DumpMemoryStats( | 944 void QuicStreamFactory::DumpMemoryStats( |
| 925 base::trace_event::ProcessMemoryDump* pmd, | 945 base::trace_event::ProcessMemoryDump* pmd, |
| 926 const std::string& parent_absolute_name) const { | 946 const std::string& parent_absolute_name) const { |
| 927 if (all_sessions_.empty()) | 947 if (all_sessions_.empty() && active_jobs_.empty()) |
| 928 return; | 948 return; |
| 929 base::trace_event::MemoryAllocatorDump* factory_dump = | 949 base::trace_event::MemoryAllocatorDump* factory_dump = |
| 930 pmd->CreateAllocatorDump(parent_absolute_name + "/quic_stream_factory"); | 950 pmd->CreateAllocatorDump(parent_absolute_name + "/quic_stream_factory"); |
| 931 size_t memory_estimate = | 951 size_t memory_estimate = |
| 932 base::trace_event::EstimateMemoryUsage(all_sessions_); | 952 base::trace_event::EstimateMemoryUsage(all_sessions_) + |
| 953 base::trace_event::EstimateMemoryUsage(active_sessions_) + |
| 954 base::trace_event::EstimateMemoryUsage(session_aliases_) + |
| 955 base::trace_event::EstimateMemoryUsage(ip_aliases_) + |
| 956 base::trace_event::EstimateMemoryUsage(session_peer_ip_) + |
| 957 base::trace_event::EstimateMemoryUsage(gone_away_aliases_) + |
| 958 base::trace_event::EstimateMemoryUsage(active_jobs_) + |
| 959 base::trace_event::EstimateMemoryUsage(job_requests_map_) + |
| 960 base::trace_event::EstimateMemoryUsage(active_cert_verifier_jobs_); |
| 933 factory_dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, | 961 factory_dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, |
| 934 base::trace_event::MemoryAllocatorDump::kUnitsBytes, | 962 base::trace_event::MemoryAllocatorDump::kUnitsBytes, |
| 935 memory_estimate); | 963 memory_estimate); |
| 936 factory_dump->AddScalar( | 964 factory_dump->AddScalar("all_sessions", |
| 937 base::trace_event::MemoryAllocatorDump::kNameObjectCount, | 965 base::trace_event::MemoryAllocatorDump::kUnitsObjects, |
| 938 base::trace_event::MemoryAllocatorDump::kUnitsObjects, | 966 all_sessions_.size()); |
| 939 all_sessions_.size()); | 967 factory_dump->AddScalar("active_jobs", |
| 968 base::trace_event::MemoryAllocatorDump::kUnitsObjects, |
| 969 active_jobs_.size()); |
| 970 factory_dump->AddScalar("active_cert_jobs", |
| 971 base::trace_event::MemoryAllocatorDump::kUnitsObjects, |
| 972 active_cert_verifier_jobs_.size()); |
| 940 } | 973 } |
| 941 | 974 |
| 942 bool QuicStreamFactory::CanUseExistingSession(const QuicServerId& server_id, | 975 bool QuicStreamFactory::CanUseExistingSession(const QuicServerId& server_id, |
| 943 const HostPortPair& destination) { | 976 const HostPortPair& destination) { |
| 944 // TODO(zhongyi): delete active_sessions_.empty() checks once the | 977 // TODO(zhongyi): delete active_sessions_.empty() checks once the |
| 945 // android crash issue(crbug.com/498823) is resolved. | 978 // android crash issue(crbug.com/498823) is resolved. |
| 946 if (active_sessions_.empty()) | 979 if (active_sessions_.empty()) |
| 947 return false; | 980 return false; |
| 948 | 981 |
| 949 if (base::ContainsKey(active_sessions_, server_id)) | 982 if (base::ContainsKey(active_sessions_, server_id)) |
| (...skipping 977 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1927 // Since the session was active, there's no longer an | 1960 // Since the session was active, there's no longer an |
| 1928 // HttpStreamFactoryImpl::Job running which can mark it broken, unless the TCP | 1961 // HttpStreamFactoryImpl::Job running which can mark it broken, unless the TCP |
| 1929 // job also fails. So to avoid not using QUIC when we otherwise could, we mark | 1962 // job also fails. So to avoid not using QUIC when we otherwise could, we mark |
| 1930 // it as recently broken, which means that 0-RTT will be disabled but we'll | 1963 // it as recently broken, which means that 0-RTT will be disabled but we'll |
| 1931 // still race. | 1964 // still race. |
| 1932 http_server_properties_->MarkAlternativeServiceRecentlyBroken( | 1965 http_server_properties_->MarkAlternativeServiceRecentlyBroken( |
| 1933 alternative_service); | 1966 alternative_service); |
| 1934 } | 1967 } |
| 1935 | 1968 |
| 1936 } // namespace net | 1969 } // namespace net |
| OLD | NEW |