| 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 <openssl/aead.h> | 7 #include <openssl/aead.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <tuple> | 10 #include <tuple> |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 NetLogCaptureMode capture_mode) { | 106 NetLogCaptureMode capture_mode) { |
| 107 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 107 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
| 108 dict->SetString("connection_id", base::Uint64ToString(connection_id)); | 108 dict->SetString("connection_id", base::Uint64ToString(connection_id)); |
| 109 return std::move(dict); | 109 return std::move(dict); |
| 110 } | 110 } |
| 111 | 111 |
| 112 // Helper class that is used to log a connection migration event. | 112 // Helper class that is used to log a connection migration event. |
| 113 class ScopedConnectionMigrationEventLog { | 113 class ScopedConnectionMigrationEventLog { |
| 114 public: | 114 public: |
| 115 ScopedConnectionMigrationEventLog(NetLog* net_log, std::string trigger) | 115 ScopedConnectionMigrationEventLog(NetLog* net_log, std::string trigger) |
| 116 : net_log_( | 116 : net_log_(NetLogWithSource::Make( |
| 117 BoundNetLog::Make(net_log, | 117 net_log, |
| 118 NetLogSourceType::QUIC_CONNECTION_MIGRATION)) { | 118 NetLogSourceType::QUIC_CONNECTION_MIGRATION)) { |
| 119 net_log_.BeginEvent( | 119 net_log_.BeginEvent( |
| 120 NetLogEventType::QUIC_CONNECTION_MIGRATION_TRIGGERED, | 120 NetLogEventType::QUIC_CONNECTION_MIGRATION_TRIGGERED, |
| 121 base::Bind(&NetLogQuicConnectionMigrationTriggerCallback, trigger)); | 121 base::Bind(&NetLogQuicConnectionMigrationTriggerCallback, trigger)); |
| 122 } | 122 } |
| 123 | 123 |
| 124 ~ScopedConnectionMigrationEventLog() { | 124 ~ScopedConnectionMigrationEventLog() { |
| 125 net_log_.EndEvent(NetLogEventType::QUIC_CONNECTION_MIGRATION_TRIGGERED); | 125 net_log_.EndEvent(NetLogEventType::QUIC_CONNECTION_MIGRATION_TRIGGERED); |
| 126 } | 126 } |
| 127 | 127 |
| 128 const BoundNetLog& net_log() { return net_log_; } | 128 const NetLogWithSource& net_log() { return net_log_; } |
| 129 | 129 |
| 130 private: | 130 private: |
| 131 const BoundNetLog net_log_; | 131 const NetLogWithSource net_log_; |
| 132 }; | 132 }; |
| 133 | 133 |
| 134 void HistogramCreateSessionFailure(enum CreateSessionFailure error) { | 134 void HistogramCreateSessionFailure(enum CreateSessionFailure error) { |
| 135 UMA_HISTOGRAM_ENUMERATION("Net.QuicSession.CreationError", error, | 135 UMA_HISTOGRAM_ENUMERATION("Net.QuicSession.CreationError", error, |
| 136 CREATION_ERROR_MAX); | 136 CREATION_ERROR_MAX); |
| 137 } | 137 } |
| 138 | 138 |
| 139 void HistogramAndLogMigrationFailure(const BoundNetLog& net_log, | 139 void HistogramAndLogMigrationFailure(const NetLogWithSource& net_log, |
| 140 enum QuicConnectionMigrationStatus status, | 140 enum QuicConnectionMigrationStatus status, |
| 141 QuicConnectionId connection_id, | 141 QuicConnectionId connection_id, |
| 142 std::string reason) { | 142 std::string reason) { |
| 143 UMA_HISTOGRAM_ENUMERATION("Net.QuicSession.ConnectionMigration", status, | 143 UMA_HISTOGRAM_ENUMERATION("Net.QuicSession.ConnectionMigration", status, |
| 144 MIGRATION_STATUS_MAX); | 144 MIGRATION_STATUS_MAX); |
| 145 net_log.AddEvent(NetLogEventType::QUIC_CONNECTION_MIGRATION_FAILURE, | 145 net_log.AddEvent(NetLogEventType::QUIC_CONNECTION_MIGRATION_FAILURE, |
| 146 base::Bind(&NetLogQuicConnectionMigrationFailureCallback, | 146 base::Bind(&NetLogQuicConnectionMigrationFailureCallback, |
| 147 connection_id, reason)); | 147 connection_id, reason)); |
| 148 } | 148 } |
| 149 | 149 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 } | 211 } |
| 212 | 212 |
| 213 void Cancel() { job_ = nullptr; } | 213 void Cancel() { job_ = nullptr; } |
| 214 | 214 |
| 215 private: | 215 private: |
| 216 CertVerifierJob* job_; | 216 CertVerifierJob* job_; |
| 217 }; | 217 }; |
| 218 | 218 |
| 219 CertVerifierJob(const QuicServerId& server_id, | 219 CertVerifierJob(const QuicServerId& server_id, |
| 220 int cert_verify_flags, | 220 int cert_verify_flags, |
| 221 const BoundNetLog& net_log) | 221 const NetLogWithSource& net_log) |
| 222 : server_id_(server_id), | 222 : server_id_(server_id), |
| 223 verify_callback_(nullptr), | 223 verify_callback_(nullptr), |
| 224 verify_context_(base::WrapUnique( | 224 verify_context_(base::WrapUnique( |
| 225 new ProofVerifyContextChromium(cert_verify_flags, net_log))), | 225 new ProofVerifyContextChromium(cert_verify_flags, net_log))), |
| 226 start_time_(base::TimeTicks::Now()), | 226 start_time_(base::TimeTicks::Now()), |
| 227 net_log_(net_log), | 227 net_log_(net_log), |
| 228 weak_factory_(this) {} | 228 weak_factory_(this) {} |
| 229 | 229 |
| 230 ~CertVerifierJob() { | 230 ~CertVerifierJob() { |
| 231 if (verify_callback_) | 231 if (verify_callback_) |
| (...skipping 27 matching lines...) Expand all Loading... |
| 259 | 259 |
| 260 const QuicServerId& server_id() const { return server_id_; } | 260 const QuicServerId& server_id() const { return server_id_; } |
| 261 | 261 |
| 262 private: | 262 private: |
| 263 QuicServerId server_id_; | 263 QuicServerId server_id_; |
| 264 ProofVerifierCallbackImpl* verify_callback_; | 264 ProofVerifierCallbackImpl* verify_callback_; |
| 265 std::unique_ptr<ProofVerifyContext> verify_context_; | 265 std::unique_ptr<ProofVerifyContext> verify_context_; |
| 266 std::unique_ptr<ProofVerifyDetails> verify_details_; | 266 std::unique_ptr<ProofVerifyDetails> verify_details_; |
| 267 std::string verify_error_details_; | 267 std::string verify_error_details_; |
| 268 base::TimeTicks start_time_; | 268 base::TimeTicks start_time_; |
| 269 const BoundNetLog net_log_; | 269 const NetLogWithSource net_log_; |
| 270 CompletionCallback callback_; | 270 CompletionCallback callback_; |
| 271 base::WeakPtrFactory<CertVerifierJob> weak_factory_; | 271 base::WeakPtrFactory<CertVerifierJob> weak_factory_; |
| 272 | 272 |
| 273 DISALLOW_COPY_AND_ASSIGN(CertVerifierJob); | 273 DISALLOW_COPY_AND_ASSIGN(CertVerifierJob); |
| 274 }; | 274 }; |
| 275 | 275 |
| 276 // Responsible for creating a new QUIC session to the specified server, and | 276 // Responsible for creating a new QUIC session to the specified server, and |
| 277 // for notifying any associated requests when complete. | 277 // for notifying any associated requests when complete. |
| 278 class QuicStreamFactory::Job { | 278 class QuicStreamFactory::Job { |
| 279 public: | 279 public: |
| 280 Job(QuicStreamFactory* factory, | 280 Job(QuicStreamFactory* factory, |
| 281 HostResolver* host_resolver, | 281 HostResolver* host_resolver, |
| 282 const QuicSessionKey& key, | 282 const QuicSessionKey& key, |
| 283 bool was_alternative_service_recently_broken, | 283 bool was_alternative_service_recently_broken, |
| 284 int cert_verify_flags, | 284 int cert_verify_flags, |
| 285 QuicServerInfo* server_info, | 285 QuicServerInfo* server_info, |
| 286 const BoundNetLog& net_log); | 286 const NetLogWithSource& net_log); |
| 287 | 287 |
| 288 // Creates a new job to handle the resumption of for connecting an | 288 // Creates a new job to handle the resumption of for connecting an |
| 289 // existing session. | 289 // existing session. |
| 290 Job(QuicStreamFactory* factory, | 290 Job(QuicStreamFactory* factory, |
| 291 HostResolver* host_resolver, | 291 HostResolver* host_resolver, |
| 292 QuicChromiumClientSession* session, | 292 QuicChromiumClientSession* session, |
| 293 const QuicSessionKey& key); | 293 const QuicSessionKey& key); |
| 294 | 294 |
| 295 ~Job(); | 295 ~Job(); |
| 296 | 296 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 331 IoState io_state_; | 331 IoState io_state_; |
| 332 | 332 |
| 333 QuicStreamFactory* factory_; | 333 QuicStreamFactory* factory_; |
| 334 HostResolver* host_resolver_; | 334 HostResolver* host_resolver_; |
| 335 std::unique_ptr<HostResolver::Request> request_; | 335 std::unique_ptr<HostResolver::Request> request_; |
| 336 QuicSessionKey key_; | 336 QuicSessionKey key_; |
| 337 int cert_verify_flags_; | 337 int cert_verify_flags_; |
| 338 bool was_alternative_service_recently_broken_; | 338 bool was_alternative_service_recently_broken_; |
| 339 std::unique_ptr<QuicServerInfo> server_info_; | 339 std::unique_ptr<QuicServerInfo> server_info_; |
| 340 bool started_another_job_; | 340 bool started_another_job_; |
| 341 const BoundNetLog net_log_; | 341 const NetLogWithSource net_log_; |
| 342 int num_sent_client_hellos_; | 342 int num_sent_client_hellos_; |
| 343 QuicChromiumClientSession* session_; | 343 QuicChromiumClientSession* session_; |
| 344 CompletionCallback callback_; | 344 CompletionCallback callback_; |
| 345 AddressList address_list_; | 345 AddressList address_list_; |
| 346 base::TimeTicks dns_resolution_start_time_; | 346 base::TimeTicks dns_resolution_start_time_; |
| 347 base::TimeTicks dns_resolution_end_time_; | 347 base::TimeTicks dns_resolution_end_time_; |
| 348 base::WeakPtrFactory<Job> weak_factory_; | 348 base::WeakPtrFactory<Job> weak_factory_; |
| 349 DISALLOW_COPY_AND_ASSIGN(Job); | 349 DISALLOW_COPY_AND_ASSIGN(Job); |
| 350 }; | 350 }; |
| 351 | 351 |
| 352 QuicStreamFactory::Job::Job(QuicStreamFactory* factory, | 352 QuicStreamFactory::Job::Job(QuicStreamFactory* factory, |
| 353 HostResolver* host_resolver, | 353 HostResolver* host_resolver, |
| 354 const QuicSessionKey& key, | 354 const QuicSessionKey& key, |
| 355 bool was_alternative_service_recently_broken, | 355 bool was_alternative_service_recently_broken, |
| 356 int cert_verify_flags, | 356 int cert_verify_flags, |
| 357 QuicServerInfo* server_info, | 357 QuicServerInfo* server_info, |
| 358 const BoundNetLog& net_log) | 358 const NetLogWithSource& net_log) |
| 359 : io_state_(STATE_RESOLVE_HOST), | 359 : io_state_(STATE_RESOLVE_HOST), |
| 360 factory_(factory), | 360 factory_(factory), |
| 361 host_resolver_(host_resolver), | 361 host_resolver_(host_resolver), |
| 362 key_(key), | 362 key_(key), |
| 363 cert_verify_flags_(cert_verify_flags), | 363 cert_verify_flags_(cert_verify_flags), |
| 364 was_alternative_service_recently_broken_( | 364 was_alternative_service_recently_broken_( |
| 365 was_alternative_service_recently_broken), | 365 was_alternative_service_recently_broken), |
| 366 server_info_(server_info), | 366 server_info_(server_info), |
| 367 started_another_job_(false), | 367 started_another_job_(false), |
| 368 net_log_(net_log), | 368 net_log_(net_log), |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 643 QuicStreamRequest::~QuicStreamRequest() { | 643 QuicStreamRequest::~QuicStreamRequest() { |
| 644 if (factory_ && !callback_.is_null()) | 644 if (factory_ && !callback_.is_null()) |
| 645 factory_->CancelRequest(this); | 645 factory_->CancelRequest(this); |
| 646 } | 646 } |
| 647 | 647 |
| 648 int QuicStreamRequest::Request(const HostPortPair& destination, | 648 int QuicStreamRequest::Request(const HostPortPair& destination, |
| 649 PrivacyMode privacy_mode, | 649 PrivacyMode privacy_mode, |
| 650 int cert_verify_flags, | 650 int cert_verify_flags, |
| 651 const GURL& url, | 651 const GURL& url, |
| 652 base::StringPiece method, | 652 base::StringPiece method, |
| 653 const BoundNetLog& net_log, | 653 const NetLogWithSource& net_log, |
| 654 const CompletionCallback& callback) { | 654 const CompletionCallback& callback) { |
| 655 DCHECK(callback_.is_null()); | 655 DCHECK(callback_.is_null()); |
| 656 DCHECK(factory_); | 656 DCHECK(factory_); |
| 657 server_id_ = QuicServerId(HostPortPair::FromURL(url), privacy_mode); | 657 server_id_ = QuicServerId(HostPortPair::FromURL(url), privacy_mode); |
| 658 | 658 |
| 659 int rv = factory_->Create(server_id_, destination, cert_verify_flags, url, | 659 int rv = factory_->Create(server_id_, destination, cert_verify_flags, url, |
| 660 method, net_log, this); | 660 method, net_log, this); |
| 661 if (rv == ERR_IO_PENDING) { | 661 if (rv == ERR_IO_PENDING) { |
| 662 net_log_ = net_log; | 662 net_log_ = net_log; |
| 663 callback_ = callback; | 663 callback_ = callback; |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 918 } | 918 } |
| 919 | 919 |
| 920 return false; | 920 return false; |
| 921 } | 921 } |
| 922 | 922 |
| 923 int QuicStreamFactory::Create(const QuicServerId& server_id, | 923 int QuicStreamFactory::Create(const QuicServerId& server_id, |
| 924 const HostPortPair& destination, | 924 const HostPortPair& destination, |
| 925 int cert_verify_flags, | 925 int cert_verify_flags, |
| 926 const GURL& url, | 926 const GURL& url, |
| 927 base::StringPiece method, | 927 base::StringPiece method, |
| 928 const BoundNetLog& net_log, | 928 const NetLogWithSource& net_log, |
| 929 QuicStreamRequest* request) { | 929 QuicStreamRequest* request) { |
| 930 DCHECK(server_id.host_port_pair().Equals(HostPortPair::FromURL(url))); | 930 DCHECK(server_id.host_port_pair().Equals(HostPortPair::FromURL(url))); |
| 931 // Enforce session affinity for promised streams. | 931 // Enforce session affinity for promised streams. |
| 932 QuicClientPromisedInfo* promised = | 932 QuicClientPromisedInfo* promised = |
| 933 push_promise_index_.GetPromised(url.spec()); | 933 push_promise_index_.GetPromised(url.spec()); |
| 934 if (promised) { | 934 if (promised) { |
| 935 QuicChromiumClientSession* session = | 935 QuicChromiumClientSession* session = |
| 936 static_cast<QuicChromiumClientSession*>(promised->session()); | 936 static_cast<QuicChromiumClientSession*>(promised->session()); |
| 937 DCHECK(session); | 937 DCHECK(session); |
| 938 if (session->server_id().privacy_mode() == server_id.privacy_mode()) { | 938 if (session->server_id().privacy_mode() == server_id.privacy_mode()) { |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1035 } | 1035 } |
| 1036 | 1036 |
| 1037 bool QuicStreamFactory::QuicSessionKey::operator==( | 1037 bool QuicStreamFactory::QuicSessionKey::operator==( |
| 1038 const QuicSessionKey& other) const { | 1038 const QuicSessionKey& other) const { |
| 1039 return destination_.Equals(other.destination_) && | 1039 return destination_.Equals(other.destination_) && |
| 1040 server_id_ == other.server_id_; | 1040 server_id_ == other.server_id_; |
| 1041 } | 1041 } |
| 1042 | 1042 |
| 1043 void QuicStreamFactory::CreateAuxilaryJob(const QuicSessionKey& key, | 1043 void QuicStreamFactory::CreateAuxilaryJob(const QuicSessionKey& key, |
| 1044 int cert_verify_flags, | 1044 int cert_verify_flags, |
| 1045 const BoundNetLog& net_log) { | 1045 const NetLogWithSource& net_log) { |
| 1046 Job* aux_job = | 1046 Job* aux_job = |
| 1047 new Job(this, host_resolver_, key, WasQuicRecentlyBroken(key.server_id()), | 1047 new Job(this, host_resolver_, key, WasQuicRecentlyBroken(key.server_id()), |
| 1048 cert_verify_flags, nullptr, net_log); | 1048 cert_verify_flags, nullptr, net_log); |
| 1049 active_jobs_[key.server_id()].insert(aux_job); | 1049 active_jobs_[key.server_id()].insert(aux_job); |
| 1050 task_runner_->PostTask(FROM_HERE, | 1050 task_runner_->PostTask(FROM_HERE, |
| 1051 base::Bind(&QuicStreamFactory::Job::RunAuxilaryJob, | 1051 base::Bind(&QuicStreamFactory::Job::RunAuxilaryJob, |
| 1052 aux_job->GetWeakPtr())); | 1052 aux_job->GetWeakPtr())); |
| 1053 } | 1053 } |
| 1054 | 1054 |
| 1055 bool QuicStreamFactory::OnResolution(const QuicSessionKey& key, | 1055 bool QuicStreamFactory::OnResolution(const QuicSessionKey& key, |
| (...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1321 for (NetworkHandle new_network : network_list) { | 1321 for (NetworkHandle new_network : network_list) { |
| 1322 if (new_network != old_network) | 1322 if (new_network != old_network) |
| 1323 return new_network; | 1323 return new_network; |
| 1324 } | 1324 } |
| 1325 return NetworkChangeNotifier::kInvalidNetworkHandle; | 1325 return NetworkChangeNotifier::kInvalidNetworkHandle; |
| 1326 } | 1326 } |
| 1327 | 1327 |
| 1328 void QuicStreamFactory::MaybeMigrateOrCloseSessions( | 1328 void QuicStreamFactory::MaybeMigrateOrCloseSessions( |
| 1329 NetworkHandle new_network, | 1329 NetworkHandle new_network, |
| 1330 bool close_if_cannot_migrate, | 1330 bool close_if_cannot_migrate, |
| 1331 const BoundNetLog& bound_net_log) { | 1331 const NetLogWithSource& net_log) { |
| 1332 QuicStreamFactory::SessionIdMap::iterator it = all_sessions_.begin(); | 1332 QuicStreamFactory::SessionIdMap::iterator it = all_sessions_.begin(); |
| 1333 while (it != all_sessions_.end()) { | 1333 while (it != all_sessions_.end()) { |
| 1334 QuicChromiumClientSession* session = it->first; | 1334 QuicChromiumClientSession* session = it->first; |
| 1335 ++it; | 1335 ++it; |
| 1336 | 1336 |
| 1337 // If session is already bound to |new_network|, move on. | 1337 // If session is already bound to |new_network|, move on. |
| 1338 if (session->GetDefaultSocket()->GetBoundNetwork() == new_network) { | 1338 if (session->GetDefaultSocket()->GetBoundNetwork() == new_network) { |
| 1339 HistogramAndLogMigrationFailure( | 1339 HistogramAndLogMigrationFailure( |
| 1340 bound_net_log, MIGRATION_STATUS_ALREADY_MIGRATED, | 1340 net_log, MIGRATION_STATUS_ALREADY_MIGRATED, session->connection_id(), |
| 1341 session->connection_id(), "Already bound to new network"); | 1341 "Already bound to new network"); |
| 1342 continue; | 1342 continue; |
| 1343 } | 1343 } |
| 1344 | 1344 |
| 1345 // Close idle sessions. | 1345 // Close idle sessions. |
| 1346 if (session->GetNumActiveStreams() == 0) { | 1346 if (session->GetNumActiveStreams() == 0) { |
| 1347 HistogramAndLogMigrationFailure( | 1347 HistogramAndLogMigrationFailure( |
| 1348 bound_net_log, MIGRATION_STATUS_NO_MIGRATABLE_STREAMS, | 1348 net_log, MIGRATION_STATUS_NO_MIGRATABLE_STREAMS, |
| 1349 session->connection_id(), "No active sessions"); | 1349 session->connection_id(), "No active sessions"); |
| 1350 session->CloseSessionOnError( | 1350 session->CloseSessionOnError( |
| 1351 ERR_NETWORK_CHANGED, QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS); | 1351 ERR_NETWORK_CHANGED, QUIC_CONNECTION_MIGRATION_NO_MIGRATABLE_STREAMS); |
| 1352 continue; | 1352 continue; |
| 1353 } | 1353 } |
| 1354 | 1354 |
| 1355 // If session has active streams, mark it as going away. | 1355 // If session has active streams, mark it as going away. |
| 1356 OnSessionGoingAway(session); | 1356 OnSessionGoingAway(session); |
| 1357 | 1357 |
| 1358 // Do not migrate sessions where connection migration is disabled. | 1358 // Do not migrate sessions where connection migration is disabled. |
| 1359 if (session->config()->DisableConnectionMigration()) { | 1359 if (session->config()->DisableConnectionMigration()) { |
| 1360 HistogramAndLogMigrationFailure(bound_net_log, MIGRATION_STATUS_DISABLED, | 1360 HistogramAndLogMigrationFailure(net_log, MIGRATION_STATUS_DISABLED, |
| 1361 session->connection_id(), | 1361 session->connection_id(), |
| 1362 "Migration disabled"); | 1362 "Migration disabled"); |
| 1363 if (close_if_cannot_migrate) { | 1363 if (close_if_cannot_migrate) { |
| 1364 session->CloseSessionOnError(ERR_NETWORK_CHANGED, | 1364 session->CloseSessionOnError(ERR_NETWORK_CHANGED, |
| 1365 QUIC_IP_ADDRESS_CHANGED); | 1365 QUIC_IP_ADDRESS_CHANGED); |
| 1366 } | 1366 } |
| 1367 continue; | 1367 continue; |
| 1368 } | 1368 } |
| 1369 | 1369 |
| 1370 // Do not migrate sessions with non-migratable streams. | 1370 // Do not migrate sessions with non-migratable streams. |
| 1371 if (session->HasNonMigratableStreams()) { | 1371 if (session->HasNonMigratableStreams()) { |
| 1372 HistogramAndLogMigrationFailure( | 1372 HistogramAndLogMigrationFailure( |
| 1373 bound_net_log, MIGRATION_STATUS_NON_MIGRATABLE_STREAM, | 1373 net_log, MIGRATION_STATUS_NON_MIGRATABLE_STREAM, |
| 1374 session->connection_id(), "Non-migratable stream"); | 1374 session->connection_id(), "Non-migratable stream"); |
| 1375 if (close_if_cannot_migrate) { | 1375 if (close_if_cannot_migrate) { |
| 1376 session->CloseSessionOnError( | 1376 session->CloseSessionOnError( |
| 1377 ERR_NETWORK_CHANGED, | 1377 ERR_NETWORK_CHANGED, |
| 1378 QUIC_CONNECTION_MIGRATION_NON_MIGRATABLE_STREAM); | 1378 QUIC_CONNECTION_MIGRATION_NON_MIGRATABLE_STREAM); |
| 1379 } | 1379 } |
| 1380 continue; | 1380 continue; |
| 1381 } | 1381 } |
| 1382 | 1382 |
| 1383 // No new network was found. Notify session, so it can wait for a | 1383 // No new network was found. Notify session, so it can wait for a |
| 1384 // new network. | 1384 // new network. |
| 1385 if (new_network == NetworkChangeNotifier::kInvalidNetworkHandle) { | 1385 if (new_network == NetworkChangeNotifier::kInvalidNetworkHandle) { |
| 1386 session->OnNoNewNetwork(); | 1386 session->OnNoNewNetwork(); |
| 1387 continue; | 1387 continue; |
| 1388 } | 1388 } |
| 1389 | 1389 |
| 1390 MigrateSessionToNewNetwork(session, new_network, | 1390 MigrateSessionToNewNetwork(session, new_network, |
| 1391 /*close_session_on_error=*/true, bound_net_log); | 1391 /*close_session_on_error=*/true, net_log); |
| 1392 } | 1392 } |
| 1393 } | 1393 } |
| 1394 | 1394 |
| 1395 MigrationResult QuicStreamFactory::MaybeMigrateSingleSession( | 1395 MigrationResult QuicStreamFactory::MaybeMigrateSingleSession( |
| 1396 QuicChromiumClientSession* session, | 1396 QuicChromiumClientSession* session, |
| 1397 MigrationCause migration_cause) { | 1397 MigrationCause migration_cause) { |
| 1398 ScopedConnectionMigrationEventLog scoped_event_log( | 1398 ScopedConnectionMigrationEventLog scoped_event_log( |
| 1399 net_log_, | 1399 net_log_, |
| 1400 migration_cause == EARLY_MIGRATION ? "EarlyMigration" : "WriteError"); | 1400 migration_cause == EARLY_MIGRATION ? "EarlyMigration" : "WriteError"); |
| 1401 if (!migrate_sessions_on_network_change_ || | 1401 if (!migrate_sessions_on_network_change_ || |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1418 } | 1418 } |
| 1419 OnSessionGoingAway(session); | 1419 OnSessionGoingAway(session); |
| 1420 return MigrateSessionToNewNetwork(session, new_network, | 1420 return MigrateSessionToNewNetwork(session, new_network, |
| 1421 migration_cause != WRITE_ERROR, | 1421 migration_cause != WRITE_ERROR, |
| 1422 scoped_event_log.net_log()); | 1422 scoped_event_log.net_log()); |
| 1423 } | 1423 } |
| 1424 | 1424 |
| 1425 void QuicStreamFactory::MigrateSessionToNewPeerAddress( | 1425 void QuicStreamFactory::MigrateSessionToNewPeerAddress( |
| 1426 QuicChromiumClientSession* session, | 1426 QuicChromiumClientSession* session, |
| 1427 IPEndPoint peer_address, | 1427 IPEndPoint peer_address, |
| 1428 const BoundNetLog& bound_net_log) { | 1428 const NetLogWithSource& net_log) { |
| 1429 if (!allow_server_migration_) | 1429 if (!allow_server_migration_) |
| 1430 return; | 1430 return; |
| 1431 | 1431 |
| 1432 IPEndPoint old_address; | 1432 IPEndPoint old_address; |
| 1433 session->GetDefaultSocket()->GetPeerAddress(&old_address); | 1433 session->GetDefaultSocket()->GetPeerAddress(&old_address); |
| 1434 DCHECK_EQ(old_address.GetFamily(), peer_address.GetFamily()); | 1434 DCHECK_EQ(old_address.GetFamily(), peer_address.GetFamily()); |
| 1435 | 1435 |
| 1436 // Specifying kInvalidNetworkHandle for the |network| parameter | 1436 // Specifying kInvalidNetworkHandle for the |network| parameter |
| 1437 // causes the session to use the default network for the new socket. | 1437 // causes the session to use the default network for the new socket. |
| 1438 MigrateSessionInner(session, peer_address, | 1438 MigrateSessionInner(session, peer_address, |
| 1439 NetworkChangeNotifier::kInvalidNetworkHandle, | 1439 NetworkChangeNotifier::kInvalidNetworkHandle, |
| 1440 /*close_session_on_error=*/true, bound_net_log); | 1440 /*close_session_on_error=*/true, net_log); |
| 1441 } | 1441 } |
| 1442 | 1442 |
| 1443 MigrationResult QuicStreamFactory::MigrateSessionToNewNetwork( | 1443 MigrationResult QuicStreamFactory::MigrateSessionToNewNetwork( |
| 1444 QuicChromiumClientSession* session, | 1444 QuicChromiumClientSession* session, |
| 1445 NetworkHandle network, | 1445 NetworkHandle network, |
| 1446 bool close_session_on_error, | 1446 bool close_session_on_error, |
| 1447 const BoundNetLog& bound_net_log) { | 1447 const NetLogWithSource& net_log) { |
| 1448 return MigrateSessionInner(session, session->connection()->peer_address(), | 1448 return MigrateSessionInner(session, session->connection()->peer_address(), |
| 1449 network, close_session_on_error, bound_net_log); | 1449 network, close_session_on_error, net_log); |
| 1450 } | 1450 } |
| 1451 | 1451 |
| 1452 MigrationResult QuicStreamFactory::MigrateSessionInner( | 1452 MigrationResult QuicStreamFactory::MigrateSessionInner( |
| 1453 QuicChromiumClientSession* session, | 1453 QuicChromiumClientSession* session, |
| 1454 IPEndPoint peer_address, | 1454 IPEndPoint peer_address, |
| 1455 NetworkHandle network, | 1455 NetworkHandle network, |
| 1456 bool close_session_on_error, | 1456 bool close_session_on_error, |
| 1457 const BoundNetLog& bound_net_log) { | 1457 const NetLogWithSource& net_log) { |
| 1458 // Use OS-specified port for socket (DEFAULT_BIND) instead of | 1458 // Use OS-specified port for socket (DEFAULT_BIND) instead of |
| 1459 // using the PortSuggester since the connection is being migrated | 1459 // using the PortSuggester since the connection is being migrated |
| 1460 // and not being newly created. | 1460 // and not being newly created. |
| 1461 std::unique_ptr<DatagramClientSocket> socket( | 1461 std::unique_ptr<DatagramClientSocket> socket( |
| 1462 client_socket_factory_->CreateDatagramClientSocket( | 1462 client_socket_factory_->CreateDatagramClientSocket( |
| 1463 DatagramSocket::DEFAULT_BIND, RandIntCallback(), | 1463 DatagramSocket::DEFAULT_BIND, RandIntCallback(), |
| 1464 session->net_log().net_log(), session->net_log().source())); | 1464 session->net_log().net_log(), session->net_log().source())); |
| 1465 if (ConfigureSocket(socket.get(), peer_address, network) != OK) { | 1465 if (ConfigureSocket(socket.get(), peer_address, network) != OK) { |
| 1466 HistogramAndLogMigrationFailure( | 1466 HistogramAndLogMigrationFailure(net_log, MIGRATION_STATUS_INTERNAL_ERROR, |
| 1467 bound_net_log, MIGRATION_STATUS_INTERNAL_ERROR, | 1467 session->connection_id(), |
| 1468 session->connection_id(), "Socket configuration failed"); | 1468 "Socket configuration failed"); |
| 1469 if (close_session_on_error) { | 1469 if (close_session_on_error) { |
| 1470 session->CloseSessionOnError(ERR_NETWORK_CHANGED, QUIC_INTERNAL_ERROR); | 1470 session->CloseSessionOnError(ERR_NETWORK_CHANGED, QUIC_INTERNAL_ERROR); |
| 1471 } | 1471 } |
| 1472 return MigrationResult::FAILURE; | 1472 return MigrationResult::FAILURE; |
| 1473 } | 1473 } |
| 1474 std::unique_ptr<QuicChromiumPacketReader> new_reader( | 1474 std::unique_ptr<QuicChromiumPacketReader> new_reader( |
| 1475 new QuicChromiumPacketReader(socket.get(), clock_.get(), session, | 1475 new QuicChromiumPacketReader(socket.get(), clock_.get(), session, |
| 1476 yield_after_packets_, yield_after_duration_, | 1476 yield_after_packets_, yield_after_duration_, |
| 1477 session->net_log())); | 1477 session->net_log())); |
| 1478 std::unique_ptr<QuicChromiumPacketWriter> new_writer( | 1478 std::unique_ptr<QuicChromiumPacketWriter> new_writer( |
| 1479 new QuicChromiumPacketWriter(socket.get())); | 1479 new QuicChromiumPacketWriter(socket.get())); |
| 1480 new_writer->set_delegate(session); | 1480 new_writer->set_delegate(session); |
| 1481 | 1481 |
| 1482 if (!session->MigrateToSocket(std::move(socket), std::move(new_reader), | 1482 if (!session->MigrateToSocket(std::move(socket), std::move(new_reader), |
| 1483 std::move(new_writer))) { | 1483 std::move(new_writer))) { |
| 1484 HistogramAndLogMigrationFailure( | 1484 HistogramAndLogMigrationFailure(net_log, MIGRATION_STATUS_TOO_MANY_CHANGES, |
| 1485 bound_net_log, MIGRATION_STATUS_TOO_MANY_CHANGES, | 1485 session->connection_id(), |
| 1486 session->connection_id(), "Too many migrations"); | 1486 "Too many migrations"); |
| 1487 if (close_session_on_error) { | 1487 if (close_session_on_error) { |
| 1488 session->CloseSessionOnError(ERR_NETWORK_CHANGED, | 1488 session->CloseSessionOnError(ERR_NETWORK_CHANGED, |
| 1489 QUIC_CONNECTION_MIGRATION_TOO_MANY_CHANGES); | 1489 QUIC_CONNECTION_MIGRATION_TOO_MANY_CHANGES); |
| 1490 } | 1490 } |
| 1491 return MigrationResult::FAILURE; | 1491 return MigrationResult::FAILURE; |
| 1492 } | 1492 } |
| 1493 HistogramMigrationStatus(MIGRATION_STATUS_SUCCESS); | 1493 HistogramMigrationStatus(MIGRATION_STATUS_SUCCESS); |
| 1494 bound_net_log.AddEvent( | 1494 net_log.AddEvent(NetLogEventType::QUIC_CONNECTION_MIGRATION_SUCCESS, |
| 1495 NetLogEventType::QUIC_CONNECTION_MIGRATION_SUCCESS, | 1495 base::Bind(&NetLogQuicConnectionMigrationSuccessCallback, |
| 1496 base::Bind(&NetLogQuicConnectionMigrationSuccessCallback, | 1496 session->connection_id())); |
| 1497 session->connection_id())); | |
| 1498 return MigrationResult::SUCCESS; | 1497 return MigrationResult::SUCCESS; |
| 1499 } | 1498 } |
| 1500 | 1499 |
| 1501 void QuicStreamFactory::OnSSLConfigChanged() { | 1500 void QuicStreamFactory::OnSSLConfigChanged() { |
| 1502 CloseAllSessions(ERR_CERT_DATABASE_CHANGED, QUIC_CONNECTION_CANCELLED); | 1501 CloseAllSessions(ERR_CERT_DATABASE_CHANGED, QUIC_CONNECTION_CANCELLED); |
| 1503 } | 1502 } |
| 1504 | 1503 |
| 1505 void QuicStreamFactory::OnCertAdded(const X509Certificate* cert) { | 1504 void QuicStreamFactory::OnCertAdded(const X509Certificate* cert) { |
| 1506 CloseAllSessions(ERR_CERT_DATABASE_CHANGED, QUIC_CONNECTION_CANCELLED); | 1505 CloseAllSessions(ERR_CERT_DATABASE_CHANGED, QUIC_CONNECTION_CANCELLED); |
| 1507 } | 1506 } |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1594 return OK; | 1593 return OK; |
| 1595 } | 1594 } |
| 1596 | 1595 |
| 1597 int QuicStreamFactory::CreateSession( | 1596 int QuicStreamFactory::CreateSession( |
| 1598 const QuicSessionKey& key, | 1597 const QuicSessionKey& key, |
| 1599 int cert_verify_flags, | 1598 int cert_verify_flags, |
| 1600 std::unique_ptr<QuicServerInfo> server_info, | 1599 std::unique_ptr<QuicServerInfo> server_info, |
| 1601 const AddressList& address_list, | 1600 const AddressList& address_list, |
| 1602 base::TimeTicks dns_resolution_start_time, | 1601 base::TimeTicks dns_resolution_start_time, |
| 1603 base::TimeTicks dns_resolution_end_time, | 1602 base::TimeTicks dns_resolution_end_time, |
| 1604 const BoundNetLog& net_log, | 1603 const NetLogWithSource& net_log, |
| 1605 QuicChromiumClientSession** session) { | 1604 QuicChromiumClientSession** session) { |
| 1606 if (need_to_evaluate_consecutive_disabled_count_) { | 1605 if (need_to_evaluate_consecutive_disabled_count_) { |
| 1607 task_runner_->PostDelayedTask( | 1606 task_runner_->PostDelayedTask( |
| 1608 FROM_HERE, | 1607 FROM_HERE, |
| 1609 base::Bind(&QuicStreamFactory::MaybeClearConsecutiveDisabledCount, | 1608 base::Bind(&QuicStreamFactory::MaybeClearConsecutiveDisabledCount, |
| 1610 weak_factory_.GetWeakPtr()), | 1609 weak_factory_.GetWeakPtr()), |
| 1611 base::TimeDelta::FromSeconds(kDisableQuicTimeoutSecs)); | 1610 base::TimeDelta::FromSeconds(kDisableQuicTimeoutSecs)); |
| 1612 | 1611 |
| 1613 need_to_evaluate_consecutive_disabled_count_ = false; | 1612 need_to_evaluate_consecutive_disabled_count_ = false; |
| 1614 } | 1613 } |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1756 bool QuicStreamFactory::CryptoConfigCacheIsEmpty( | 1755 bool QuicStreamFactory::CryptoConfigCacheIsEmpty( |
| 1757 const QuicServerId& server_id) { | 1756 const QuicServerId& server_id) { |
| 1758 QuicCryptoClientConfig::CachedState* cached = | 1757 QuicCryptoClientConfig::CachedState* cached = |
| 1759 crypto_config_.LookupOrCreate(server_id); | 1758 crypto_config_.LookupOrCreate(server_id); |
| 1760 return cached->IsEmpty(); | 1759 return cached->IsEmpty(); |
| 1761 } | 1760 } |
| 1762 | 1761 |
| 1763 QuicAsyncStatus QuicStreamFactory::StartCertVerifyJob( | 1762 QuicAsyncStatus QuicStreamFactory::StartCertVerifyJob( |
| 1764 const QuicServerId& server_id, | 1763 const QuicServerId& server_id, |
| 1765 int cert_verify_flags, | 1764 int cert_verify_flags, |
| 1766 const BoundNetLog& net_log) { | 1765 const NetLogWithSource& net_log) { |
| 1767 if (!race_cert_verification_) | 1766 if (!race_cert_verification_) |
| 1768 return QUIC_FAILURE; | 1767 return QUIC_FAILURE; |
| 1769 QuicCryptoClientConfig::CachedState* cached = | 1768 QuicCryptoClientConfig::CachedState* cached = |
| 1770 crypto_config_.LookupOrCreate(server_id); | 1769 crypto_config_.LookupOrCreate(server_id); |
| 1771 if (!cached || cached->certs().empty() || | 1770 if (!cached || cached->certs().empty() || |
| 1772 HasActiveCertVerifierJob(server_id)) { | 1771 HasActiveCertVerifierJob(server_id)) { |
| 1773 return QUIC_FAILURE; | 1772 return QUIC_FAILURE; |
| 1774 } | 1773 } |
| 1775 std::unique_ptr<CertVerifierJob> cert_verifier_job( | 1774 std::unique_ptr<CertVerifierJob> cert_verifier_job( |
| 1776 new CertVerifierJob(server_id, cert_verify_flags, net_log)); | 1775 new CertVerifierJob(server_id, cert_verify_flags, net_log)); |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1907 void QuicStreamFactory::OpenFactory() { | 1906 void QuicStreamFactory::OpenFactory() { |
| 1908 status_ = OPEN; | 1907 status_ = OPEN; |
| 1909 } | 1908 } |
| 1910 | 1909 |
| 1911 void QuicStreamFactory::MaybeClearConsecutiveDisabledCount() { | 1910 void QuicStreamFactory::MaybeClearConsecutiveDisabledCount() { |
| 1912 if (status_ == OPEN) | 1911 if (status_ == OPEN) |
| 1913 consecutive_disabled_count_ = 0; | 1912 consecutive_disabled_count_ = 0; |
| 1914 } | 1913 } |
| 1915 | 1914 |
| 1916 } // namespace net | 1915 } // namespace net |
| OLD | NEW |