| 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/quic_client_session.h" | 5 #include "net/quic/quic_client_session.h" |
| 6 | 6 |
| 7 #include "base/callback_helpers.h" | 7 #include "base/callback_helpers.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
| 10 #include "base/metrics/sparse_histogram.h" | 10 #include "base/metrics/sparse_histogram.h" |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.QuicSession.ConnectRandomPortForHTTPS", | 279 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.QuicSession.ConnectRandomPortForHTTPS", |
| 280 round_trip_handshakes, 0, 3, 4); | 280 round_trip_handshakes, 0, 3, 4); |
| 281 if (require_confirmation_) { | 281 if (require_confirmation_) { |
| 282 UMA_HISTOGRAM_CUSTOM_COUNTS( | 282 UMA_HISTOGRAM_CUSTOM_COUNTS( |
| 283 "Net.QuicSession.ConnectRandomPortRequiringConfirmationForHTTPS", | 283 "Net.QuicSession.ConnectRandomPortRequiringConfirmationForHTTPS", |
| 284 round_trip_handshakes, 0, 3, 4); | 284 round_trip_handshakes, 0, 3, 4); |
| 285 } | 285 } |
| 286 } | 286 } |
| 287 } | 287 } |
| 288 const QuicConnectionStats stats = connection()->GetStats(); | 288 const QuicConnectionStats stats = connection()->GetStats(); |
| 289 if (server_info_ && stats.min_rtt_us > 0) { |
| 290 base::TimeTicks wait_for_data_start_time = |
| 291 server_info_->wait_for_data_start_time(); |
| 292 base::TimeTicks wait_for_data_end_time = |
| 293 server_info_->wait_for_data_end_time(); |
| 294 if (!wait_for_data_start_time.is_null() && |
| 295 !wait_for_data_end_time.is_null()) { |
| 296 base::TimeDelta wait_time = |
| 297 wait_for_data_end_time - wait_for_data_start_time; |
| 298 const base::HistogramBase::Sample kMaxWaitToRtt = 1000; |
| 299 base::HistogramBase::Sample wait_to_rtt = |
| 300 static_cast<base::HistogramBase::Sample>( |
| 301 100 * wait_time.InMicroseconds() / stats.min_rtt_us); |
| 302 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.QuicServerInfo.WaitForDataReadyToRtt", |
| 303 wait_to_rtt, 0, kMaxWaitToRtt, 50); |
| 304 } |
| 305 } |
| 306 |
| 289 if (stats.max_sequence_reordering == 0) | 307 if (stats.max_sequence_reordering == 0) |
| 290 return; | 308 return; |
| 291 const base::HistogramBase::Sample kMaxReordering = 100; | 309 const base::HistogramBase::Sample kMaxReordering = 100; |
| 292 base::HistogramBase::Sample reordering = kMaxReordering; | 310 base::HistogramBase::Sample reordering = kMaxReordering; |
| 293 if (stats.min_rtt_us > 0) { | 311 if (stats.min_rtt_us > 0) { |
| 294 reordering = static_cast<base::HistogramBase::Sample>( | 312 reordering = static_cast<base::HistogramBase::Sample>( |
| 295 100 * stats.max_time_reordering_us / stats.min_rtt_us); | 313 100 * stats.max_time_reordering_us / stats.min_rtt_us); |
| 296 } | 314 } |
| 297 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.QuicSession.MaxReorderingTime", | 315 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.QuicSession.MaxReorderingTime", |
| 298 reordering, 0, kMaxReordering, 50); | 316 reordering, 0, kMaxReordering, 50); |
| 299 if (stats.min_rtt_us > 100 * 1000) { | 317 if (stats.min_rtt_us > 100 * 1000) { |
| 300 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.QuicSession.MaxReorderingTimeLongRtt", | 318 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.QuicSession.MaxReorderingTimeLongRtt", |
| 301 reordering, 0, kMaxReordering, 50); | 319 reordering, 0, kMaxReordering, 50); |
| 302 } | 320 } |
| 303 UMA_HISTOGRAM_COUNTS("Net.QuicSession.MaxReordering", | 321 UMA_HISTOGRAM_COUNTS( |
| 304 stats.max_sequence_reordering); | 322 "Net.QuicSession.MaxReordering", |
| 323 static_cast<base::HistogramBase::Sample>(stats.max_sequence_reordering)); |
| 305 } | 324 } |
| 306 | 325 |
| 307 void QuicClientSession::OnStreamFrames( | 326 void QuicClientSession::OnStreamFrames( |
| 308 const std::vector<QuicStreamFrame>& frames) { | 327 const std::vector<QuicStreamFrame>& frames) { |
| 309 // Record total number of stream frames. | 328 // Record total number of stream frames. |
| 310 UMA_HISTOGRAM_COUNTS("Net.QuicNumStreamFramesInPacket", frames.size()); | 329 UMA_HISTOGRAM_COUNTS("Net.QuicNumStreamFramesInPacket", frames.size()); |
| 311 | 330 |
| 312 // Record number of frames per stream in packet. | 331 // Record number of frames per stream in packet. |
| 313 typedef std::map<QuicStreamId, size_t> FrameCounter; | 332 typedef std::map<QuicStreamId, size_t> FrameCounter; |
| 314 FrameCounter frames_per_stream; | 333 FrameCounter frames_per_stream; |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 426 return false; | 445 return false; |
| 427 } | 446 } |
| 428 | 447 |
| 429 ssl_info->cert_status = cert_verify_result_->cert_status; | 448 ssl_info->cert_status = cert_verify_result_->cert_status; |
| 430 ssl_info->cert = cert_verify_result_->verified_cert; | 449 ssl_info->cert = cert_verify_result_->verified_cert; |
| 431 | 450 |
| 432 // TODO(wtc): Define QUIC "cipher suites". | 451 // TODO(wtc): Define QUIC "cipher suites". |
| 433 // Report the TLS cipher suite that most closely resembles the crypto | 452 // Report the TLS cipher suite that most closely resembles the crypto |
| 434 // parameters of the QUIC connection. | 453 // parameters of the QUIC connection. |
| 435 QuicTag aead = crypto_stream_->crypto_negotiated_params().aead; | 454 QuicTag aead = crypto_stream_->crypto_negotiated_params().aead; |
| 436 int cipher_suite; | 455 uint16 cipher_suite; |
| 437 int security_bits; | 456 int security_bits; |
| 438 switch (aead) { | 457 switch (aead) { |
| 439 case kAESG: | 458 case kAESG: |
| 440 cipher_suite = 0xc02f; // TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 | 459 cipher_suite = 0xc02f; // TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 |
| 441 security_bits = 128; | 460 security_bits = 128; |
| 442 break; | 461 break; |
| 443 case kCC12: | 462 case kCC12: |
| 444 cipher_suite = 0xcc13; // TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 | 463 cipher_suite = 0xcc13; // TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 |
| 445 security_bits = 256; | 464 security_bits = 256; |
| 446 break; | 465 break; |
| 447 default: | 466 default: |
| 448 NOTREACHED(); | 467 NOTREACHED(); |
| 449 return false; | 468 return false; |
| 450 } | 469 } |
| 451 int ssl_connection_status = 0; | 470 int ssl_connection_status = 0; |
| 452 ssl_connection_status |= | 471 ssl_connection_status |= cipher_suite; |
| 453 (cipher_suite & SSL_CONNECTION_CIPHERSUITE_MASK) << | |
| 454 SSL_CONNECTION_CIPHERSUITE_SHIFT; | |
| 455 ssl_connection_status |= | 472 ssl_connection_status |= |
| 456 (SSL_CONNECTION_VERSION_QUIC & SSL_CONNECTION_VERSION_MASK) << | 473 (SSL_CONNECTION_VERSION_QUIC & SSL_CONNECTION_VERSION_MASK) << |
| 457 SSL_CONNECTION_VERSION_SHIFT; | 474 SSL_CONNECTION_VERSION_SHIFT; |
| 458 | 475 |
| 459 ssl_info->public_key_hashes = cert_verify_result_->public_key_hashes; | 476 ssl_info->public_key_hashes = cert_verify_result_->public_key_hashes; |
| 460 ssl_info->is_issued_by_known_root = | 477 ssl_info->is_issued_by_known_root = |
| 461 cert_verify_result_->is_issued_by_known_root; | 478 cert_verify_result_->is_issued_by_known_root; |
| 462 | 479 |
| 463 ssl_info->connection_status = ssl_connection_status; | 480 ssl_info->connection_status = ssl_connection_status; |
| 464 ssl_info->client_cert_sent = false; | 481 ssl_info->client_cert_sent = false; |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 577 event == HANDSHAKE_CONFIRMED || event == ENCRYPTION_REESTABLISHED)) { | 594 event == HANDSHAKE_CONFIRMED || event == ENCRYPTION_REESTABLISHED)) { |
| 578 // TODO(rtenneti): Currently for all CryptoHandshakeEvent events, callback_ | 595 // TODO(rtenneti): Currently for all CryptoHandshakeEvent events, callback_ |
| 579 // could be called because there are no error events in CryptoHandshakeEvent | 596 // could be called because there are no error events in CryptoHandshakeEvent |
| 580 // enum. If error events are added to CryptoHandshakeEvent, then the | 597 // enum. If error events are added to CryptoHandshakeEvent, then the |
| 581 // following code needs to changed. | 598 // following code needs to changed. |
| 582 base::ResetAndReturn(&callback_).Run(OK); | 599 base::ResetAndReturn(&callback_).Run(OK); |
| 583 } | 600 } |
| 584 if (event == HANDSHAKE_CONFIRMED) { | 601 if (event == HANDSHAKE_CONFIRMED) { |
| 585 UMA_HISTOGRAM_TIMES("Net.QuicSession.HandshakeConfirmedTime", | 602 UMA_HISTOGRAM_TIMES("Net.QuicSession.HandshakeConfirmedTime", |
| 586 base::TimeTicks::Now() - handshake_start_); | 603 base::TimeTicks::Now() - handshake_start_); |
| 604 if (server_info_) { |
| 605 // Track how long it has taken to finish handshake once we start waiting |
| 606 // for reading of QUIC server information from disk cache. We could use |
| 607 // this data to compare total time taken if we were to cancel the disk |
| 608 // cache read vs waiting for the read to complete. |
| 609 base::TimeTicks wait_for_data_start_time = |
| 610 server_info_->wait_for_data_start_time(); |
| 611 if (!wait_for_data_start_time.is_null()) { |
| 612 UMA_HISTOGRAM_TIMES( |
| 613 "Net.QuicServerInfo.WaitForDataReady.HandshakeConfirmedTime", |
| 614 base::TimeTicks::Now() - wait_for_data_start_time); |
| 615 } |
| 616 } |
| 617 |
| 587 ObserverSet::iterator it = observers_.begin(); | 618 ObserverSet::iterator it = observers_.begin(); |
| 588 while (it != observers_.end()) { | 619 while (it != observers_.end()) { |
| 589 Observer* observer = *it; | 620 Observer* observer = *it; |
| 590 ++it; | 621 ++it; |
| 591 observer->OnCryptoHandshakeConfirmed(); | 622 observer->OnCryptoHandshakeConfirmed(); |
| 592 } | 623 } |
| 593 if (server_info_) | 624 if (server_info_) |
| 594 server_info_->OnExternalCacheHit(); | 625 server_info_->OnExternalCacheHit(); |
| 595 } | 626 } |
| 596 QuicSession::OnCryptoHandshakeEvent(event); | 627 QuicSession::OnCryptoHandshakeEvent(event); |
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 901 return; | 932 return; |
| 902 | 933 |
| 903 // TODO(rch): re-enable this code once beta is cut. | 934 // TODO(rch): re-enable this code once beta is cut. |
| 904 // if (stream_factory_) | 935 // if (stream_factory_) |
| 905 // stream_factory_->OnSessionConnectTimeout(this); | 936 // stream_factory_->OnSessionConnectTimeout(this); |
| 906 // CloseAllStreams(ERR_QUIC_HANDSHAKE_FAILED); | 937 // CloseAllStreams(ERR_QUIC_HANDSHAKE_FAILED); |
| 907 // DCHECK_EQ(0u, GetNumOpenStreams()); | 938 // DCHECK_EQ(0u, GetNumOpenStreams()); |
| 908 } | 939 } |
| 909 | 940 |
| 910 } // namespace net | 941 } // namespace net |
| OLD | NEW |