| 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 |