| 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 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 TransmissionType transmission_type, | 51 TransmissionType transmission_type, |
| 52 size_t packet_size, | 52 size_t packet_size, |
| 53 QuicTime sent_time, | 53 QuicTime sent_time, |
| 54 NetLog::LogLevel /* log_level */) { | 54 NetLog::LogLevel /* log_level */) { |
| 55 base::DictionaryValue* dict = new base::DictionaryValue(); | 55 base::DictionaryValue* dict = new base::DictionaryValue(); |
| 56 dict->SetInteger("encryption_level", level); | 56 dict->SetInteger("encryption_level", level); |
| 57 dict->SetInteger("transmission_type", transmission_type); | 57 dict->SetInteger("transmission_type", transmission_type); |
| 58 dict->SetString("packet_sequence_number", | 58 dict->SetString("packet_sequence_number", |
| 59 base::Uint64ToString(serialized_packet.sequence_number)); | 59 base::Uint64ToString(serialized_packet.sequence_number)); |
| 60 dict->SetInteger("size", packet_size); | 60 dict->SetInteger("size", packet_size); |
| 61 dict->SetInteger("sent_time_us", sent_time.ToDebuggingValue()); | 61 dict->SetInteger("sent_time_us", |
| 62 static_cast<int>(sent_time.ToDebuggingValue())); |
| 62 return dict; | 63 return dict; |
| 63 } | 64 } |
| 64 | 65 |
| 65 base::Value* NetLogQuicPacketRetransmittedCallback( | 66 base::Value* NetLogQuicPacketRetransmittedCallback( |
| 66 QuicPacketSequenceNumber old_sequence_number, | 67 QuicPacketSequenceNumber old_sequence_number, |
| 67 QuicPacketSequenceNumber new_sequence_number, | 68 QuicPacketSequenceNumber new_sequence_number, |
| 68 NetLog::LogLevel /* log_level */) { | 69 NetLog::LogLevel /* log_level */) { |
| 69 base::DictionaryValue* dict = new base::DictionaryValue(); | 70 base::DictionaryValue* dict = new base::DictionaryValue(); |
| 70 dict->SetString("old_packet_sequence_number", | 71 dict->SetString("old_packet_sequence_number", |
| 71 base::Uint64ToString(old_sequence_number)); | 72 base::Uint64ToString(old_sequence_number)); |
| 72 dict->SetString("new_packet_sequence_number", | 73 dict->SetString("new_packet_sequence_number", |
| 73 base::Uint64ToString(new_sequence_number)); | 74 base::Uint64ToString(new_sequence_number)); |
| 74 return dict; | 75 return dict; |
| 75 } | 76 } |
| 76 | 77 |
| 77 base::Value* NetLogQuicPacketHeaderCallback(const QuicPacketHeader* header, | 78 base::Value* NetLogQuicPacketHeaderCallback(const QuicPacketHeader* header, |
| 78 NetLog::LogLevel /* log_level */) { | 79 NetLog::LogLevel /* log_level */) { |
| 79 base::DictionaryValue* dict = new base::DictionaryValue(); | 80 base::DictionaryValue* dict = new base::DictionaryValue(); |
| 80 dict->SetString("connection_id", | 81 dict->SetString("connection_id", |
| 81 base::Uint64ToString(header->public_header.connection_id)); | 82 base::Uint64ToString(header->public_header.connection_id)); |
| 82 dict->SetInteger("reset_flag", header->public_header.reset_flag); | 83 dict->SetInteger("reset_flag", header->public_header.reset_flag); |
| 83 dict->SetInteger("version_flag", header->public_header.version_flag); | 84 dict->SetInteger("version_flag", header->public_header.version_flag); |
| 84 dict->SetString("packet_sequence_number", | 85 dict->SetString("packet_sequence_number", |
| 85 base::Uint64ToString(header->packet_sequence_number)); | 86 base::Uint64ToString(header->packet_sequence_number)); |
| 86 dict->SetInteger("entropy_flag", header->entropy_flag); | 87 dict->SetInteger("entropy_flag", header->entropy_flag); |
| 87 dict->SetInteger("fec_flag", header->fec_flag); | 88 dict->SetInteger("fec_flag", header->fec_flag); |
| 88 dict->SetInteger("fec_group", header->fec_group); | 89 dict->SetInteger("fec_group", static_cast<int>(header->fec_group)); |
| 89 return dict; | 90 return dict; |
| 90 } | 91 } |
| 91 | 92 |
| 92 base::Value* NetLogQuicStreamFrameCallback(const QuicStreamFrame* frame, | 93 base::Value* NetLogQuicStreamFrameCallback(const QuicStreamFrame* frame, |
| 93 NetLog::LogLevel /* log_level */) { | 94 NetLog::LogLevel /* log_level */) { |
| 94 base::DictionaryValue* dict = new base::DictionaryValue(); | 95 base::DictionaryValue* dict = new base::DictionaryValue(); |
| 95 dict->SetInteger("stream_id", frame->stream_id); | 96 dict->SetInteger("stream_id", frame->stream_id); |
| 96 dict->SetBoolean("fin", frame->fin); | 97 dict->SetBoolean("fin", frame->fin); |
| 97 dict->SetString("offset", base::Uint64ToString(frame->offset)); | 98 dict->SetString("offset", base::Uint64ToString(frame->offset)); |
| 98 dict->SetInteger("length", frame->data.TotalBufferSize()); | 99 dict->SetInteger("length", frame->data.TotalBufferSize()); |
| 99 return dict; | 100 return dict; |
| 100 } | 101 } |
| 101 | 102 |
| 102 base::Value* NetLogQuicAckFrameCallback(const QuicAckFrame* frame, | 103 base::Value* NetLogQuicAckFrameCallback(const QuicAckFrame* frame, |
| 103 NetLog::LogLevel /* log_level */) { | 104 NetLog::LogLevel /* log_level */) { |
| 104 base::DictionaryValue* dict = new base::DictionaryValue(); | 105 base::DictionaryValue* dict = new base::DictionaryValue(); |
| 105 dict->SetString("largest_observed", | 106 dict->SetString("largest_observed", |
| 106 base::Uint64ToString(frame->largest_observed)); | 107 base::Uint64ToString(frame->largest_observed)); |
| 107 dict->SetInteger("delta_time_largest_observed_us", | 108 dict->SetInteger( |
| 108 frame->delta_time_largest_observed.ToMicroseconds()); | 109 "delta_time_largest_observed_us", |
| 110 static_cast<int>(frame->delta_time_largest_observed.ToMicroseconds())); |
| 109 dict->SetInteger("entropy_hash", | 111 dict->SetInteger("entropy_hash", |
| 110 frame->entropy_hash); | 112 frame->entropy_hash); |
| 111 dict->SetBoolean("truncated", frame->is_truncated); | 113 dict->SetBoolean("truncated", frame->is_truncated); |
| 112 | 114 |
| 113 base::ListValue* missing = new base::ListValue(); | 115 base::ListValue* missing = new base::ListValue(); |
| 114 dict->Set("missing_packets", missing); | 116 dict->Set("missing_packets", missing); |
| 115 const SequenceNumberSet& missing_packets = frame->missing_packets; | 117 const SequenceNumberSet& missing_packets = frame->missing_packets; |
| 116 for (SequenceNumberSet::const_iterator it = missing_packets.begin(); | 118 for (SequenceNumberSet::const_iterator it = missing_packets.begin(); |
| 117 it != missing_packets.end(); ++it) { | 119 it != missing_packets.end(); ++it) { |
| 118 missing->AppendString(base::Uint64ToString(*it)); | 120 missing->AppendString(base::Uint64ToString(*it)); |
| 119 } | 121 } |
| 120 | 122 |
| 121 base::ListValue* revived = new base::ListValue(); | 123 base::ListValue* revived = new base::ListValue(); |
| 122 dict->Set("revived_packets", revived); | 124 dict->Set("revived_packets", revived); |
| 123 const SequenceNumberSet& revived_packets = frame->revived_packets; | 125 const SequenceNumberSet& revived_packets = frame->revived_packets; |
| 124 for (SequenceNumberSet::const_iterator it = revived_packets.begin(); | 126 for (SequenceNumberSet::const_iterator it = revived_packets.begin(); |
| 125 it != revived_packets.end(); ++it) { | 127 it != revived_packets.end(); ++it) { |
| 126 revived->AppendString(base::Uint64ToString(*it)); | 128 revived->AppendString(base::Uint64ToString(*it)); |
| 127 } | 129 } |
| 128 | 130 |
| 129 base::ListValue* received = new base::ListValue(); | 131 base::ListValue* received = new base::ListValue(); |
| 130 dict->Set("received_packet_times", received); | 132 dict->Set("received_packet_times", received); |
| 131 const PacketTimeList& received_times = frame->received_packet_times; | 133 const PacketTimeList& received_times = frame->received_packet_times; |
| 132 for (PacketTimeList::const_iterator it = received_times.begin(); | 134 for (PacketTimeList::const_iterator it = received_times.begin(); |
| 133 it != received_times.end(); ++it) { | 135 it != received_times.end(); ++it) { |
| 134 base::DictionaryValue* info = new base::DictionaryValue(); | 136 base::DictionaryValue* info = new base::DictionaryValue(); |
| 135 info->SetInteger("sequence_number", it->first); | 137 info->SetInteger("sequence_number", static_cast<int>(it->first)); |
| 136 info->SetInteger("received", it->second.ToDebuggingValue()); | 138 info->SetInteger("received", |
| 139 static_cast<int>(it->second.ToDebuggingValue())); |
| 137 received->Append(info); | 140 received->Append(info); |
| 138 } | 141 } |
| 139 | 142 |
| 140 return dict; | 143 return dict; |
| 141 } | 144 } |
| 142 | 145 |
| 143 base::Value* NetLogQuicCongestionFeedbackFrameCallback( | 146 base::Value* NetLogQuicCongestionFeedbackFrameCallback( |
| 144 const QuicCongestionFeedbackFrame* frame, | 147 const QuicCongestionFeedbackFrame* frame, |
| 145 NetLog::LogLevel /* log_level */) { | 148 NetLog::LogLevel /* log_level */) { |
| 146 base::DictionaryValue* dict = new base::DictionaryValue(); | 149 base::DictionaryValue* dict = new base::DictionaryValue(); |
| 147 switch (frame->type) { | 150 switch (frame->type) { |
| 148 case kTCP: | 151 case kTCP: |
| 149 dict->SetString("type", "TCP"); | 152 dict->SetString("type", "TCP"); |
| 150 dict->SetInteger("receive_window", frame->tcp.receive_window); | 153 dict->SetInteger("receive_window", |
| 154 static_cast<int>(frame->tcp.receive_window)); |
| 151 break; | 155 break; |
| 152 } | 156 } |
| 153 | 157 |
| 154 return dict; | 158 return dict; |
| 155 } | 159 } |
| 156 | 160 |
| 157 base::Value* NetLogQuicRstStreamFrameCallback( | 161 base::Value* NetLogQuicRstStreamFrameCallback( |
| 158 const QuicRstStreamFrame* frame, | 162 const QuicRstStreamFrame* frame, |
| 159 NetLog::LogLevel /* log_level */) { | 163 NetLog::LogLevel /* log_level */) { |
| 160 base::DictionaryValue* dict = new base::DictionaryValue(); | 164 base::DictionaryValue* dict = new base::DictionaryValue(); |
| (...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 545 base::Bind(&NetLogQuicPacketHeaderCallback, &header)); | 549 base::Bind(&NetLogQuicPacketHeaderCallback, &header)); |
| 546 ++num_packets_received_; | 550 ++num_packets_received_; |
| 547 if (largest_received_packet_sequence_number_ < | 551 if (largest_received_packet_sequence_number_ < |
| 548 header.packet_sequence_number) { | 552 header.packet_sequence_number) { |
| 549 QuicPacketSequenceNumber delta = header.packet_sequence_number - | 553 QuicPacketSequenceNumber delta = header.packet_sequence_number - |
| 550 largest_received_packet_sequence_number_; | 554 largest_received_packet_sequence_number_; |
| 551 if (delta > 1) { | 555 if (delta > 1) { |
| 552 // There is a gap between the largest packet previously received and | 556 // There is a gap between the largest packet previously received and |
| 553 // the current packet. This indicates either loss, or out-of-order | 557 // the current packet. This indicates either loss, or out-of-order |
| 554 // delivery. | 558 // delivery. |
| 555 UMA_HISTOGRAM_COUNTS("Net.QuicSession.PacketGapReceived", delta - 1); | 559 UMA_HISTOGRAM_COUNTS("Net.QuicSession.PacketGapReceived", |
| 560 static_cast<base::HistogramBase::Sample>(delta - 1)); |
| 556 } | 561 } |
| 557 largest_received_packet_sequence_number_ = header.packet_sequence_number; | 562 largest_received_packet_sequence_number_ = header.packet_sequence_number; |
| 558 } | 563 } |
| 559 if (header.packet_sequence_number < received_packets_.size()) | 564 if (header.packet_sequence_number < received_packets_.size()) { |
| 560 received_packets_[header.packet_sequence_number] = true; | 565 received_packets_[static_cast<size_t>(header.packet_sequence_number)] = |
| 566 true; |
| 567 } |
| 561 if (header.packet_sequence_number < last_received_packet_sequence_number_) { | 568 if (header.packet_sequence_number < last_received_packet_sequence_number_) { |
| 562 ++num_out_of_order_received_packets_; | 569 ++num_out_of_order_received_packets_; |
| 563 UMA_HISTOGRAM_COUNTS("Net.QuicSession.OutOfOrderGapReceived", | 570 UMA_HISTOGRAM_COUNTS( |
| 564 last_received_packet_sequence_number_ - | 571 "Net.QuicSession.OutOfOrderGapReceived", |
| 565 header.packet_sequence_number); | 572 static_cast<base::HistogramBase::Sample>( |
| 573 last_received_packet_sequence_number_ - |
| 574 header.packet_sequence_number)); |
| 566 } | 575 } |
| 567 last_received_packet_sequence_number_ = header.packet_sequence_number; | 576 last_received_packet_sequence_number_ = header.packet_sequence_number; |
| 568 } | 577 } |
| 569 | 578 |
| 570 void QuicConnectionLogger::OnStreamFrame(const QuicStreamFrame& frame) { | 579 void QuicConnectionLogger::OnStreamFrame(const QuicStreamFrame& frame) { |
| 571 net_log_.AddEvent( | 580 net_log_.AddEvent( |
| 572 NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED, | 581 NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED, |
| 573 base::Bind(&NetLogQuicStreamFrameCallback, &frame)); | 582 base::Bind(&NetLogQuicStreamFrameCallback, &frame)); |
| 574 } | 583 } |
| 575 | 584 |
| 576 void QuicConnectionLogger::OnAckFrame(const QuicAckFrame& frame) { | 585 void QuicConnectionLogger::OnAckFrame(const QuicAckFrame& frame) { |
| 577 net_log_.AddEvent( | 586 net_log_.AddEvent( |
| 578 NetLog::TYPE_QUIC_SESSION_ACK_FRAME_RECEIVED, | 587 NetLog::TYPE_QUIC_SESSION_ACK_FRAME_RECEIVED, |
| 579 base::Bind(&NetLogQuicAckFrameCallback, &frame)); | 588 base::Bind(&NetLogQuicAckFrameCallback, &frame)); |
| 580 | 589 |
| 581 const size_t kApproximateLargestSoloAckBytes = 100; | 590 const size_t kApproximateLargestSoloAckBytes = 100; |
| 582 if (last_received_packet_sequence_number_ < received_acks_.size() && | 591 if (last_received_packet_sequence_number_ < received_acks_.size() && |
| 583 last_received_packet_size_ < kApproximateLargestSoloAckBytes) | 592 last_received_packet_size_ < kApproximateLargestSoloAckBytes) { |
| 584 received_acks_[last_received_packet_sequence_number_] = true; | 593 received_acks_[static_cast<size_t>(last_received_packet_sequence_number_)] = |
| 594 true; |
| 595 } |
| 585 | 596 |
| 586 if (frame.is_truncated) | 597 if (frame.is_truncated) |
| 587 ++num_truncated_acks_received_; | 598 ++num_truncated_acks_received_; |
| 588 | 599 |
| 589 if (frame.missing_packets.empty()) | 600 if (frame.missing_packets.empty()) |
| 590 return; | 601 return; |
| 591 | 602 |
| 592 SequenceNumberSet missing_packets = frame.missing_packets; | 603 SequenceNumberSet missing_packets = frame.missing_packets; |
| 593 SequenceNumberSet::const_iterator it = missing_packets.lower_bound( | 604 SequenceNumberSet::const_iterator it = missing_packets.lower_bound( |
| 594 largest_received_missing_packet_sequence_number_); | 605 largest_received_missing_packet_sequence_number_); |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 832 QuicPacketSequenceNumber divisor = largest_received_packet_sequence_number_; | 843 QuicPacketSequenceNumber divisor = largest_received_packet_sequence_number_; |
| 833 QuicPacketSequenceNumber numerator = divisor - num_packets_received_; | 844 QuicPacketSequenceNumber numerator = divisor - num_packets_received_; |
| 834 if (divisor < 100000) | 845 if (divisor < 100000) |
| 835 numerator *= 1000; | 846 numerator *= 1000; |
| 836 else | 847 else |
| 837 divisor /= 1000; | 848 divisor /= 1000; |
| 838 string prefix("Net.QuicSession.PacketLossRate_"); | 849 string prefix("Net.QuicSession.PacketLossRate_"); |
| 839 base::HistogramBase* histogram = base::Histogram::FactoryGet( | 850 base::HistogramBase* histogram = base::Histogram::FactoryGet( |
| 840 prefix + connection_description_, 1, 1000, 75, | 851 prefix + connection_description_, 1, 1000, 75, |
| 841 base::HistogramBase::kUmaTargetedHistogramFlag); | 852 base::HistogramBase::kUmaTargetedHistogramFlag); |
| 842 histogram->Add(numerator / divisor); | 853 histogram->Add(static_cast<base::HistogramBase::Sample>(numerator / divisor)); |
| 843 } | 854 } |
| 844 | 855 |
| 845 void QuicConnectionLogger::RecordLossHistograms() const { | 856 void QuicConnectionLogger::RecordLossHistograms() const { |
| 846 if (largest_received_packet_sequence_number_ == 0) | 857 if (largest_received_packet_sequence_number_ == 0) |
| 847 return; // Connection was never used. | 858 return; // Connection was never used. |
| 848 RecordAggregatePacketLossRate(); | 859 RecordAggregatePacketLossRate(); |
| 849 | 860 |
| 850 base::HistogramBase* is_not_ack_histogram = | 861 base::HistogramBase* is_not_ack_histogram = |
| 851 GetPacketSequenceNumberHistogram("IsNotAck_"); | 862 GetPacketSequenceNumberHistogram("IsNotAck_"); |
| 852 base::HistogramBase* is_an_ack_histogram = | 863 base::HistogramBase* is_an_ack_histogram = |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 908 continue; | 919 continue; |
| 909 } | 920 } |
| 910 // Record some overlapping patterns, to get a better picture, since this is | 921 // Record some overlapping patterns, to get a better picture, since this is |
| 911 // not very expensive. | 922 // not very expensive. |
| 912 if (i % 3 == 0) | 923 if (i % 3 == 0) |
| 913 six_packet_histogram->Add(recent_6_mask); | 924 six_packet_histogram->Add(recent_6_mask); |
| 914 } | 925 } |
| 915 } | 926 } |
| 916 | 927 |
| 917 } // namespace net | 928 } // namespace net |
| OLD | NEW |