OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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_connection_logger.h" | 5 #include "net/quic/quic_connection_logger.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
495 } | 495 } |
496 | 496 |
497 void QuicConnectionLogger::OnProtocolVersionMismatch( | 497 void QuicConnectionLogger::OnProtocolVersionMismatch( |
498 QuicVersion received_version) { | 498 QuicVersion received_version) { |
499 // TODO(rtenneti): Add logging. | 499 // TODO(rtenneti): Add logging. |
500 } | 500 } |
501 | 501 |
502 void QuicConnectionLogger::OnPacketHeader(const QuicPacketHeader& header) { | 502 void QuicConnectionLogger::OnPacketHeader(const QuicPacketHeader& header) { |
503 net_log_.AddEvent(NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED); | 503 net_log_.AddEvent(NetLog::TYPE_QUIC_SESSION_PACKET_AUTHENTICATED); |
504 ++num_packets_received_; | 504 ++num_packets_received_; |
| 505 |
| 506 const QuicPacketCount previous_largest_received_packet_number = |
| 507 largest_received_packet_number_; |
505 if (largest_received_packet_number_ < header.packet_number) { | 508 if (largest_received_packet_number_ < header.packet_number) { |
506 QuicPacketNumber delta = | 509 QuicPacketNumber delta = |
507 header.packet_number - largest_received_packet_number_; | 510 header.packet_number - largest_received_packet_number_; |
508 if (delta > 1) { | 511 if (delta > 1) { |
509 // There is a gap between the largest packet previously received and | 512 // There is a gap between the largest packet previously received and |
510 // the current packet. This indicates either loss, or out-of-order | 513 // the current packet. This indicates either loss, or out-of-order |
511 // delivery. | 514 // delivery. |
512 UMA_HISTOGRAM_COUNTS("Net.QuicSession.PacketGapReceived", | 515 UMA_HISTOGRAM_COUNTS("Net.QuicSession.PacketGapReceived", |
513 static_cast<base::HistogramBase::Sample>(delta - 1)); | 516 static_cast<base::HistogramBase::Sample>(delta - 1)); |
514 } | 517 } |
515 largest_received_packet_number_ = header.packet_number; | 518 largest_received_packet_number_ = header.packet_number; |
516 } | 519 } |
517 if (header.packet_number < received_packets_.size()) { | 520 if (header.packet_number < received_packets_.size()) { |
518 received_packets_[static_cast<size_t>(header.packet_number)] = true; | 521 received_packets_[static_cast<size_t>(header.packet_number)] = true; |
519 } | 522 } |
520 if (header.packet_number < last_received_packet_number_) { | 523 if (header.packet_number < last_received_packet_number_) { |
521 ++num_out_of_order_received_packets_; | 524 ++num_out_of_order_received_packets_; |
522 if (previous_received_packet_size_ < last_received_packet_size_) | 525 if (previous_received_packet_size_ < last_received_packet_size_) |
523 ++num_out_of_order_large_received_packets_; | 526 ++num_out_of_order_large_received_packets_; |
524 UMA_HISTOGRAM_COUNTS( | 527 UMA_HISTOGRAM_COUNTS( |
525 "Net.QuicSession.OutOfOrderGapReceived", | 528 "Net.QuicSession.OutOfOrderGapReceived", |
526 static_cast<base::HistogramBase::Sample>(last_received_packet_number_ - | 529 static_cast<base::HistogramBase::Sample>(last_received_packet_number_ - |
527 header.packet_number)); | 530 header.packet_number)); |
528 } | 531 } |
529 last_received_packet_number_ = header.packet_number; | 532 last_received_packet_number_ = header.packet_number; |
| 533 ReportPacketCounts(previous_largest_received_packet_number); |
| 534 } |
| 535 |
| 536 void QuicConnectionLogger::ReportPacketCounts( |
| 537 QuicPacketCount previous_largest_received_packet_number) const { |
| 538 DCHECK_GE(largest_received_packet_number_, |
| 539 previous_largest_received_packet_number); |
| 540 const uint64_t diff = |
| 541 largest_received_packet_number_ - previous_largest_received_packet_number; |
| 542 |
| 543 uint64_t num_packets_lost = 0; |
| 544 uint64_t num_packets_received_in_order = 0; |
| 545 uint64_t num_packets_received_not_in_order = 0; |
| 546 |
| 547 if (socket_performance_watcher_) { |
| 548 if (diff == 0) { |
| 549 // The received packet number has alower sequence number than the expected |
| 550 // sequence number. |
| 551 num_packets_received_not_in_order = 1; |
| 552 } else if (diff == 1) { |
| 553 // The received packet number has the same sequence number as the expected |
| 554 // sequence number. |
| 555 num_packets_received_in_order = 1; |
| 556 } else { |
| 557 // The received packet number has higher sequence number as the expected |
| 558 // sequence number. Report all packets with intermediate sequence numbers |
| 559 // as lost. |
| 560 num_packets_lost = diff - 1; |
| 561 num_packets_received_in_order = 1; |
| 562 } |
| 563 socket_performance_watcher_->OnUpdatedPacketCountAvailable( |
| 564 num_packets_lost, num_packets_received_in_order, |
| 565 num_packets_received_not_in_order); |
| 566 } |
530 } | 567 } |
531 | 568 |
532 void QuicConnectionLogger::OnStreamFrame(const QuicStreamFrame& frame) { | 569 void QuicConnectionLogger::OnStreamFrame(const QuicStreamFrame& frame) { |
533 net_log_.AddEvent(NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED, | 570 net_log_.AddEvent(NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED, |
534 base::Bind(&NetLogQuicStreamFrameCallback, &frame)); | 571 base::Bind(&NetLogQuicStreamFrameCallback, &frame)); |
535 } | 572 } |
536 | 573 |
537 void QuicConnectionLogger::OnAckFrame(const QuicAckFrame& frame) { | 574 void QuicConnectionLogger::OnAckFrame(const QuicAckFrame& frame) { |
538 net_log_.AddEvent(NetLog::TYPE_QUIC_SESSION_ACK_FRAME_RECEIVED, | 575 net_log_.AddEvent(NetLog::TYPE_QUIC_SESSION_ACK_FRAME_RECEIVED, |
539 base::Bind(&NetLogQuicAckFrameCallback, &frame)); | 576 base::Bind(&NetLogQuicAckFrameCallback, &frame)); |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
767 bit_mask_of_packets >>= 1; | 804 bit_mask_of_packets >>= 1; |
768 DCHECK_LT(range_start + bits_so_far, kBoundingSampleInCumulativeHistogram); | 805 DCHECK_LT(range_start + bits_so_far, kBoundingSampleInCumulativeHistogram); |
769 histogram->Add(range_start + bits_so_far); | 806 histogram->Add(range_start + bits_so_far); |
770 range_start += i + 1; | 807 range_start += i + 1; |
771 } | 808 } |
772 } | 809 } |
773 | 810 |
774 float QuicConnectionLogger::ReceivedPacketLossRate() const { | 811 float QuicConnectionLogger::ReceivedPacketLossRate() const { |
775 if (largest_received_packet_number_ <= num_packets_received_) | 812 if (largest_received_packet_number_ <= num_packets_received_) |
776 return 0.0f; | 813 return 0.0f; |
777 float num_received = largest_received_packet_number_ - num_packets_received_; | 814 float num_lost = largest_received_packet_number_ - num_packets_received_; |
778 return num_received / largest_received_packet_number_; | 815 return num_lost / largest_received_packet_number_; |
779 } | 816 } |
780 | 817 |
781 void QuicConnectionLogger::OnRttChanged(QuicTime::Delta rtt) const { | 818 void QuicConnectionLogger::OnRttChanged(QuicTime::Delta rtt) const { |
782 // Notify socket performance watcher of the updated RTT value. | 819 // Notify socket performance watcher of the updated RTT value. |
783 if (!socket_performance_watcher_) | 820 if (!socket_performance_watcher_) |
784 return; | 821 return; |
785 | 822 |
786 int64_t microseconds = rtt.ToMicroseconds(); | 823 int64_t microseconds = rtt.ToMicroseconds(); |
787 if (microseconds != 0) { | 824 if (microseconds != 0) { |
788 socket_performance_watcher_->OnUpdatedRTTAvailable( | 825 socket_performance_watcher_->OnUpdatedRTTAvailable( |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
873 continue; | 910 continue; |
874 } | 911 } |
875 // Record some overlapping patterns, to get a better picture, since this is | 912 // Record some overlapping patterns, to get a better picture, since this is |
876 // not very expensive. | 913 // not very expensive. |
877 if (i % 3 == 0) | 914 if (i % 3 == 0) |
878 six_packet_histogram->Add(recent_6_mask); | 915 six_packet_histogram->Add(recent_6_mask); |
879 } | 916 } |
880 } | 917 } |
881 | 918 |
882 } // namespace net | 919 } // namespace net |
OLD | NEW |