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 | 10 |
10 #include "base/bind.h" | 11 #include "base/bind.h" |
11 #include "base/callback.h" | 12 #include "base/callback.h" |
12 #include "base/metrics/histogram_macros.h" | 13 #include "base/metrics/histogram_macros.h" |
13 #include "base/metrics/sparse_histogram.h" | 14 #include "base/metrics/sparse_histogram.h" |
14 #include "base/profiler/scoped_tracker.h" | 15 #include "base/profiler/scoped_tracker.h" |
15 #include "base/strings/string_number_conversions.h" | 16 #include "base/strings/string_number_conversions.h" |
16 #include "base/values.h" | 17 #include "base/values.h" |
17 #include "net/cert/cert_verify_result.h" | 18 #include "net/cert/cert_verify_result.h" |
18 #include "net/cert/x509_certificate.h" | 19 #include "net/cert/x509_certificate.h" |
(...skipping 18 matching lines...) Expand all Loading... |
37 | 38 |
38 scoped_ptr<base::Value> NetLogQuicPacketCallback( | 39 scoped_ptr<base::Value> NetLogQuicPacketCallback( |
39 const IPEndPoint* self_address, | 40 const IPEndPoint* self_address, |
40 const IPEndPoint* peer_address, | 41 const IPEndPoint* peer_address, |
41 size_t packet_size, | 42 size_t packet_size, |
42 NetLogCaptureMode /* capture_mode */) { | 43 NetLogCaptureMode /* capture_mode */) { |
43 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 44 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
44 dict->SetString("self_address", self_address->ToString()); | 45 dict->SetString("self_address", self_address->ToString()); |
45 dict->SetString("peer_address", peer_address->ToString()); | 46 dict->SetString("peer_address", peer_address->ToString()); |
46 dict->SetInteger("size", packet_size); | 47 dict->SetInteger("size", packet_size); |
47 return dict.Pass(); | 48 return std::move(dict); |
48 } | 49 } |
49 | 50 |
50 scoped_ptr<base::Value> NetLogQuicPacketSentCallback( | 51 scoped_ptr<base::Value> NetLogQuicPacketSentCallback( |
51 const SerializedPacket& serialized_packet, | 52 const SerializedPacket& serialized_packet, |
52 TransmissionType transmission_type, | 53 TransmissionType transmission_type, |
53 size_t packet_size, | 54 size_t packet_size, |
54 QuicTime sent_time, | 55 QuicTime sent_time, |
55 NetLogCaptureMode /* capture_mode */) { | 56 NetLogCaptureMode /* capture_mode */) { |
56 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 57 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
57 dict->SetInteger("transmission_type", transmission_type); | 58 dict->SetInteger("transmission_type", transmission_type); |
58 dict->SetString("packet_number", | 59 dict->SetString("packet_number", |
59 base::Uint64ToString(serialized_packet.packet_number)); | 60 base::Uint64ToString(serialized_packet.packet_number)); |
60 dict->SetInteger("size", packet_size); | 61 dict->SetInteger("size", packet_size); |
61 dict->SetString("sent_time_us", | 62 dict->SetString("sent_time_us", |
62 base::Int64ToString(sent_time.ToDebuggingValue())); | 63 base::Int64ToString(sent_time.ToDebuggingValue())); |
63 return dict.Pass(); | 64 return std::move(dict); |
64 } | 65 } |
65 | 66 |
66 scoped_ptr<base::Value> NetLogQuicPacketRetransmittedCallback( | 67 scoped_ptr<base::Value> NetLogQuicPacketRetransmittedCallback( |
67 QuicPacketNumber old_packet_number, | 68 QuicPacketNumber old_packet_number, |
68 QuicPacketNumber new_packet_number, | 69 QuicPacketNumber new_packet_number, |
69 NetLogCaptureMode /* capture_mode */) { | 70 NetLogCaptureMode /* capture_mode */) { |
70 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 71 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
71 dict->SetString("old_packet_number", base::Uint64ToString(old_packet_number)); | 72 dict->SetString("old_packet_number", base::Uint64ToString(old_packet_number)); |
72 dict->SetString("new_packet_number", base::Uint64ToString(new_packet_number)); | 73 dict->SetString("new_packet_number", base::Uint64ToString(new_packet_number)); |
73 return dict.Pass(); | 74 return std::move(dict); |
74 } | 75 } |
75 | 76 |
76 scoped_ptr<base::Value> NetLogQuicDuplicatePacketCallback( | 77 scoped_ptr<base::Value> NetLogQuicDuplicatePacketCallback( |
77 QuicPacketNumber packet_number, | 78 QuicPacketNumber packet_number, |
78 NetLogCaptureMode /* capture_mode */) { | 79 NetLogCaptureMode /* capture_mode */) { |
79 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 80 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
80 dict->SetString("packet_number", base::Uint64ToString(packet_number)); | 81 dict->SetString("packet_number", base::Uint64ToString(packet_number)); |
81 return dict.Pass(); | 82 return std::move(dict); |
82 } | 83 } |
83 | 84 |
84 scoped_ptr<base::Value> NetLogQuicPacketHeaderCallback( | 85 scoped_ptr<base::Value> NetLogQuicPacketHeaderCallback( |
85 const QuicPacketHeader* header, | 86 const QuicPacketHeader* header, |
86 NetLogCaptureMode /* capture_mode */) { | 87 NetLogCaptureMode /* capture_mode */) { |
87 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 88 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
88 dict->SetString("connection_id", | 89 dict->SetString("connection_id", |
89 base::Uint64ToString(header->public_header.connection_id)); | 90 base::Uint64ToString(header->public_header.connection_id)); |
90 dict->SetInteger("reset_flag", header->public_header.reset_flag); | 91 dict->SetInteger("reset_flag", header->public_header.reset_flag); |
91 dict->SetInteger("version_flag", header->public_header.version_flag); | 92 dict->SetInteger("version_flag", header->public_header.version_flag); |
92 dict->SetString("packet_number", base::Uint64ToString(header->packet_number)); | 93 dict->SetString("packet_number", base::Uint64ToString(header->packet_number)); |
93 dict->SetInteger("entropy_flag", header->entropy_flag); | 94 dict->SetInteger("entropy_flag", header->entropy_flag); |
94 dict->SetInteger("fec_flag", header->fec_flag); | 95 dict->SetInteger("fec_flag", header->fec_flag); |
95 dict->SetInteger("fec_group", static_cast<int>(header->fec_group)); | 96 dict->SetInteger("fec_group", static_cast<int>(header->fec_group)); |
96 return dict.Pass(); | 97 return std::move(dict); |
97 } | 98 } |
98 | 99 |
99 scoped_ptr<base::Value> NetLogQuicStreamFrameCallback( | 100 scoped_ptr<base::Value> NetLogQuicStreamFrameCallback( |
100 const QuicStreamFrame* frame, | 101 const QuicStreamFrame* frame, |
101 NetLogCaptureMode /* capture_mode */) { | 102 NetLogCaptureMode /* capture_mode */) { |
102 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 103 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
103 dict->SetInteger("stream_id", frame->stream_id); | 104 dict->SetInteger("stream_id", frame->stream_id); |
104 dict->SetBoolean("fin", frame->fin); | 105 dict->SetBoolean("fin", frame->fin); |
105 dict->SetString("offset", base::Uint64ToString(frame->offset)); | 106 dict->SetString("offset", base::Uint64ToString(frame->offset)); |
106 dict->SetInteger("length", frame->frame_length); | 107 dict->SetInteger("length", frame->frame_length); |
107 return dict.Pass(); | 108 return std::move(dict); |
108 } | 109 } |
109 | 110 |
110 scoped_ptr<base::Value> NetLogQuicAckFrameCallback( | 111 scoped_ptr<base::Value> NetLogQuicAckFrameCallback( |
111 const QuicAckFrame* frame, | 112 const QuicAckFrame* frame, |
112 NetLogCaptureMode /* capture_mode */) { | 113 NetLogCaptureMode /* capture_mode */) { |
113 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 114 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
114 dict->SetString("largest_observed", | 115 dict->SetString("largest_observed", |
115 base::Uint64ToString(frame->largest_observed)); | 116 base::Uint64ToString(frame->largest_observed)); |
116 dict->SetString( | 117 dict->SetString( |
117 "delta_time_largest_observed_us", | 118 "delta_time_largest_observed_us", |
(...skipping 14 matching lines...) Expand all Loading... |
132 const PacketTimeVector& received_times = frame->received_packet_times; | 133 const PacketTimeVector& received_times = frame->received_packet_times; |
133 for (PacketTimeVector::const_iterator it = received_times.begin(); | 134 for (PacketTimeVector::const_iterator it = received_times.begin(); |
134 it != received_times.end(); ++it) { | 135 it != received_times.end(); ++it) { |
135 base::DictionaryValue* info = new base::DictionaryValue(); | 136 base::DictionaryValue* info = new base::DictionaryValue(); |
136 info->SetInteger("packet_number", static_cast<int>(it->first)); | 137 info->SetInteger("packet_number", static_cast<int>(it->first)); |
137 info->SetString("received", | 138 info->SetString("received", |
138 base::Int64ToString(it->second.ToDebuggingValue())); | 139 base::Int64ToString(it->second.ToDebuggingValue())); |
139 received->Append(info); | 140 received->Append(info); |
140 } | 141 } |
141 | 142 |
142 return dict.Pass(); | 143 return std::move(dict); |
143 } | 144 } |
144 | 145 |
145 scoped_ptr<base::Value> NetLogQuicRstStreamFrameCallback( | 146 scoped_ptr<base::Value> NetLogQuicRstStreamFrameCallback( |
146 const QuicRstStreamFrame* frame, | 147 const QuicRstStreamFrame* frame, |
147 NetLogCaptureMode /* capture_mode */) { | 148 NetLogCaptureMode /* capture_mode */) { |
148 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 149 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
149 dict->SetInteger("stream_id", frame->stream_id); | 150 dict->SetInteger("stream_id", frame->stream_id); |
150 dict->SetInteger("quic_rst_stream_error", frame->error_code); | 151 dict->SetInteger("quic_rst_stream_error", frame->error_code); |
151 return dict.Pass(); | 152 return std::move(dict); |
152 } | 153 } |
153 | 154 |
154 scoped_ptr<base::Value> NetLogQuicConnectionCloseFrameCallback( | 155 scoped_ptr<base::Value> NetLogQuicConnectionCloseFrameCallback( |
155 const QuicConnectionCloseFrame* frame, | 156 const QuicConnectionCloseFrame* frame, |
156 NetLogCaptureMode /* capture_mode */) { | 157 NetLogCaptureMode /* capture_mode */) { |
157 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 158 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
158 dict->SetInteger("quic_error", frame->error_code); | 159 dict->SetInteger("quic_error", frame->error_code); |
159 dict->SetString("details", frame->error_details); | 160 dict->SetString("details", frame->error_details); |
160 return dict.Pass(); | 161 return std::move(dict); |
161 } | 162 } |
162 | 163 |
163 scoped_ptr<base::Value> NetLogQuicWindowUpdateFrameCallback( | 164 scoped_ptr<base::Value> NetLogQuicWindowUpdateFrameCallback( |
164 const QuicWindowUpdateFrame* frame, | 165 const QuicWindowUpdateFrame* frame, |
165 NetLogCaptureMode /* capture_mode */) { | 166 NetLogCaptureMode /* capture_mode */) { |
166 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 167 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
167 dict->SetInteger("stream_id", frame->stream_id); | 168 dict->SetInteger("stream_id", frame->stream_id); |
168 dict->SetString("byte_offset", base::Uint64ToString(frame->byte_offset)); | 169 dict->SetString("byte_offset", base::Uint64ToString(frame->byte_offset)); |
169 return dict.Pass(); | 170 return std::move(dict); |
170 } | 171 } |
171 | 172 |
172 scoped_ptr<base::Value> NetLogQuicBlockedFrameCallback( | 173 scoped_ptr<base::Value> NetLogQuicBlockedFrameCallback( |
173 const QuicBlockedFrame* frame, | 174 const QuicBlockedFrame* frame, |
174 NetLogCaptureMode /* capture_mode */) { | 175 NetLogCaptureMode /* capture_mode */) { |
175 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 176 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
176 dict->SetInteger("stream_id", frame->stream_id); | 177 dict->SetInteger("stream_id", frame->stream_id); |
177 return dict.Pass(); | 178 return std::move(dict); |
178 } | 179 } |
179 | 180 |
180 scoped_ptr<base::Value> NetLogQuicGoAwayFrameCallback( | 181 scoped_ptr<base::Value> NetLogQuicGoAwayFrameCallback( |
181 const QuicGoAwayFrame* frame, | 182 const QuicGoAwayFrame* frame, |
182 NetLogCaptureMode /* capture_mode */) { | 183 NetLogCaptureMode /* capture_mode */) { |
183 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 184 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
184 dict->SetInteger("quic_error", frame->error_code); | 185 dict->SetInteger("quic_error", frame->error_code); |
185 dict->SetInteger("last_good_stream_id", frame->last_good_stream_id); | 186 dict->SetInteger("last_good_stream_id", frame->last_good_stream_id); |
186 dict->SetString("reason_phrase", frame->reason_phrase); | 187 dict->SetString("reason_phrase", frame->reason_phrase); |
187 return dict.Pass(); | 188 return std::move(dict); |
188 } | 189 } |
189 | 190 |
190 scoped_ptr<base::Value> NetLogQuicStopWaitingFrameCallback( | 191 scoped_ptr<base::Value> NetLogQuicStopWaitingFrameCallback( |
191 const QuicStopWaitingFrame* frame, | 192 const QuicStopWaitingFrame* frame, |
192 NetLogCaptureMode /* capture_mode */) { | 193 NetLogCaptureMode /* capture_mode */) { |
193 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 194 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
194 base::DictionaryValue* sent_info = new base::DictionaryValue(); | 195 base::DictionaryValue* sent_info = new base::DictionaryValue(); |
195 dict->Set("sent_info", sent_info); | 196 dict->Set("sent_info", sent_info); |
196 sent_info->SetString("least_unacked", | 197 sent_info->SetString("least_unacked", |
197 base::Uint64ToString(frame->least_unacked)); | 198 base::Uint64ToString(frame->least_unacked)); |
198 return dict.Pass(); | 199 return std::move(dict); |
199 } | 200 } |
200 | 201 |
201 scoped_ptr<base::Value> NetLogQuicVersionNegotiationPacketCallback( | 202 scoped_ptr<base::Value> NetLogQuicVersionNegotiationPacketCallback( |
202 const QuicVersionNegotiationPacket* packet, | 203 const QuicVersionNegotiationPacket* packet, |
203 NetLogCaptureMode /* capture_mode */) { | 204 NetLogCaptureMode /* capture_mode */) { |
204 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 205 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
205 base::ListValue* versions = new base::ListValue(); | 206 base::ListValue* versions = new base::ListValue(); |
206 dict->Set("versions", versions); | 207 dict->Set("versions", versions); |
207 for (QuicVersionVector::const_iterator it = packet->versions.begin(); | 208 for (QuicVersionVector::const_iterator it = packet->versions.begin(); |
208 it != packet->versions.end(); ++it) { | 209 it != packet->versions.end(); ++it) { |
209 versions->AppendString(QuicVersionToString(*it)); | 210 versions->AppendString(QuicVersionToString(*it)); |
210 } | 211 } |
211 return dict.Pass(); | 212 return std::move(dict); |
212 } | 213 } |
213 | 214 |
214 scoped_ptr<base::Value> NetLogQuicCryptoHandshakeMessageCallback( | 215 scoped_ptr<base::Value> NetLogQuicCryptoHandshakeMessageCallback( |
215 const CryptoHandshakeMessage* message, | 216 const CryptoHandshakeMessage* message, |
216 NetLogCaptureMode /* capture_mode */) { | 217 NetLogCaptureMode /* capture_mode */) { |
217 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 218 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
218 dict->SetString("quic_crypto_handshake_message", message->DebugString()); | 219 dict->SetString("quic_crypto_handshake_message", message->DebugString()); |
219 return dict.Pass(); | 220 return std::move(dict); |
220 } | 221 } |
221 | 222 |
222 scoped_ptr<base::Value> NetLogQuicOnConnectionClosedCallback( | 223 scoped_ptr<base::Value> NetLogQuicOnConnectionClosedCallback( |
223 QuicErrorCode error, | 224 QuicErrorCode error, |
224 bool from_peer, | 225 bool from_peer, |
225 NetLogCaptureMode /* capture_mode */) { | 226 NetLogCaptureMode /* capture_mode */) { |
226 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 227 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
227 dict->SetInteger("quic_error", error); | 228 dict->SetInteger("quic_error", error); |
228 dict->SetBoolean("from_peer", from_peer); | 229 dict->SetBoolean("from_peer", from_peer); |
229 return dict.Pass(); | 230 return std::move(dict); |
230 } | 231 } |
231 | 232 |
232 scoped_ptr<base::Value> NetLogQuicCertificateVerifiedCallback( | 233 scoped_ptr<base::Value> NetLogQuicCertificateVerifiedCallback( |
233 scoped_refptr<X509Certificate> cert, | 234 scoped_refptr<X509Certificate> cert, |
234 NetLogCaptureMode /* capture_mode */) { | 235 NetLogCaptureMode /* capture_mode */) { |
235 // Only the subjects are logged so that we can investigate connection pooling. | 236 // Only the subjects are logged so that we can investigate connection pooling. |
236 // More fields could be logged in the future. | 237 // More fields could be logged in the future. |
237 std::vector<std::string> dns_names; | 238 std::vector<std::string> dns_names; |
238 cert->GetDNSNames(&dns_names); | 239 cert->GetDNSNames(&dns_names); |
239 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); | 240 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
240 base::ListValue* subjects = new base::ListValue(); | 241 base::ListValue* subjects = new base::ListValue(); |
241 for (std::vector<std::string>::const_iterator it = dns_names.begin(); | 242 for (std::vector<std::string>::const_iterator it = dns_names.begin(); |
242 it != dns_names.end(); it++) { | 243 it != dns_names.end(); it++) { |
243 subjects->Append(new base::StringValue(*it)); | 244 subjects->Append(new base::StringValue(*it)); |
244 } | 245 } |
245 dict->Set("subjects", subjects); | 246 dict->Set("subjects", subjects); |
246 return dict.Pass(); | 247 return std::move(dict); |
247 } | 248 } |
248 | 249 |
249 void UpdatePacketGapSentHistogram(size_t num_consecutive_missing_packets) { | 250 void UpdatePacketGapSentHistogram(size_t num_consecutive_missing_packets) { |
250 UMA_HISTOGRAM_COUNTS("Net.QuicSession.PacketGapSent", | 251 UMA_HISTOGRAM_COUNTS("Net.QuicSession.PacketGapSent", |
251 num_consecutive_missing_packets); | 252 num_consecutive_missing_packets); |
252 } | 253 } |
253 | 254 |
254 void UpdatePublicResetAddressMismatchHistogram( | 255 void UpdatePublicResetAddressMismatchHistogram( |
255 const IPEndPoint& server_hello_address, | 256 const IPEndPoint& server_hello_address, |
256 const IPEndPoint& public_reset_address) { | 257 const IPEndPoint& public_reset_address) { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 num_truncated_acks_sent_(0), | 293 num_truncated_acks_sent_(0), |
293 num_truncated_acks_received_(0), | 294 num_truncated_acks_received_(0), |
294 num_frames_received_(0), | 295 num_frames_received_(0), |
295 num_duplicate_frames_received_(0), | 296 num_duplicate_frames_received_(0), |
296 num_incorrect_connection_ids_(0), | 297 num_incorrect_connection_ids_(0), |
297 num_undecryptable_packets_(0), | 298 num_undecryptable_packets_(0), |
298 num_duplicate_packets_(0), | 299 num_duplicate_packets_(0), |
299 num_blocked_frames_received_(0), | 300 num_blocked_frames_received_(0), |
300 num_blocked_frames_sent_(0), | 301 num_blocked_frames_sent_(0), |
301 connection_description_(connection_description), | 302 connection_description_(connection_description), |
302 socket_performance_watcher_(socket_performance_watcher.Pass()) {} | 303 socket_performance_watcher_(std::move(socket_performance_watcher)) {} |
303 | 304 |
304 QuicConnectionLogger::~QuicConnectionLogger() { | 305 QuicConnectionLogger::~QuicConnectionLogger() { |
305 UMA_HISTOGRAM_COUNTS("Net.QuicSession.OutOfOrderPacketsReceived", | 306 UMA_HISTOGRAM_COUNTS("Net.QuicSession.OutOfOrderPacketsReceived", |
306 num_out_of_order_received_packets_); | 307 num_out_of_order_received_packets_); |
307 UMA_HISTOGRAM_COUNTS("Net.QuicSession.OutOfOrderLargePacketsReceived", | 308 UMA_HISTOGRAM_COUNTS("Net.QuicSession.OutOfOrderLargePacketsReceived", |
308 num_out_of_order_large_received_packets_); | 309 num_out_of_order_large_received_packets_); |
309 UMA_HISTOGRAM_COUNTS("Net.QuicSession.TruncatedAcksSent", | 310 UMA_HISTOGRAM_COUNTS("Net.QuicSession.TruncatedAcksSent", |
310 num_truncated_acks_sent_); | 311 num_truncated_acks_sent_); |
311 UMA_HISTOGRAM_COUNTS("Net.QuicSession.TruncatedAcksReceived", | 312 UMA_HISTOGRAM_COUNTS("Net.QuicSession.TruncatedAcksReceived", |
312 num_truncated_acks_received_); | 313 num_truncated_acks_received_); |
(...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
872 continue; | 873 continue; |
873 } | 874 } |
874 // Record some overlapping patterns, to get a better picture, since this is | 875 // Record some overlapping patterns, to get a better picture, since this is |
875 // not very expensive. | 876 // not very expensive. |
876 if (i % 3 == 0) | 877 if (i % 3 == 0) |
877 six_packet_histogram->Add(recent_6_mask); | 878 six_packet_histogram->Add(recent_6_mask); |
878 } | 879 } |
879 } | 880 } |
880 | 881 |
881 } // namespace net | 882 } // namespace net |
OLD | NEW |