Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(87)

Side by Side Diff: net/quic/quic_connection_logger.cc

Issue 159143007: Log QUIC public reset client address mismatch to a histogram. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Undo experimental changes Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback.h" 8 #include "base/callback.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"
11 #include "base/strings/string_number_conversions.h" 11 #include "base/strings/string_number_conversions.h"
12 #include "base/values.h" 12 #include "base/values.h"
13 #include "net/base/net_log.h" 13 #include "net/base/net_log.h"
14 #include "net/quic/crypto/crypto_handshake_message.h" 14 #include "net/quic/crypto/crypto_handshake_message.h"
15 #include "net/quic/crypto/crypto_protocol.h"
16 #include "net/quic/quic_socket_address_coder.h"
15 17
18 using base::StringPiece;
16 using std::string; 19 using std::string;
17 20
18 namespace net { 21 namespace net {
19 22
20 namespace { 23 namespace {
21 24
22 base::Value* NetLogQuicPacketCallback(const IPEndPoint* self_address, 25 base::Value* NetLogQuicPacketCallback(const IPEndPoint* self_address,
23 const IPEndPoint* peer_address, 26 const IPEndPoint* peer_address,
24 size_t packet_size, 27 size_t packet_size,
25 NetLog::LogLevel /* log_level */) { 28 NetLog::LogLevel /* log_level */) {
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 dict->SetInteger("quic_error", error); 191 dict->SetInteger("quic_error", error);
189 dict->SetBoolean("from_peer", from_peer); 192 dict->SetBoolean("from_peer", from_peer);
190 return dict; 193 return dict;
191 } 194 }
192 195
193 void UpdatePacketGapSentHistogram(size_t num_consecutive_missing_packets) { 196 void UpdatePacketGapSentHistogram(size_t num_consecutive_missing_packets) {
194 UMA_HISTOGRAM_COUNTS("Net.QuicSession.PacketGapSent", 197 UMA_HISTOGRAM_COUNTS("Net.QuicSession.PacketGapSent",
195 num_consecutive_missing_packets); 198 num_consecutive_missing_packets);
196 } 199 }
197 200
201 void UpdatePublicResetAddressMismatchHistogram(
202 const IPEndPoint& server_hello_address,
203 const IPEndPoint& public_reset_address) {
204 enum {
205 kAddressAndPortMatch_base = 0,
206 kAddressAndPortMatch_v4_v4 = 0,
wtc 2014/02/13 02:04:10 Is it correct for the histogram enumeration to sta
jar (doing other things) 2014/02/13 03:24:48 Perfectly correct.
207 kAddressAndPortMatch_v6_v6 = 1,
208 kAddressAndPortMatch_v4_v6 = 2,
209 kAddressAndPortMatch_v6_v4 = 3,
210
211 // The addresses match, but the ports don't match.
212 kPortMismatch_base = 4,
213 kPortMismatch_v4_v4 = 4,
214 kPortMismatch_v6_v6 = 5,
215 kPortMismatch_v4_v6 = 6,
216 kPortMismatch_v6_v4 = 7,
217
218 // The addresses don't match.
219 kAddressMismatch_base = 8,
220 kAddressMismatch_v4_v4 = 8,
221 kAddressMismatch_v6_v6 = 9,
222 kAddressMismatch_v4_v6 = 10,
223 kAddressMismatch_v6_v4 = 11,
Ryan Hamilton 2014/02/13 04:44:05 An alternative to consider which might make the co
wtc 2014/02/14 00:53:57 Done. (Not in the way you suggested though.)
224
225 kBoundaryValue,
226 };
227
228 // TODO(wtc): should we report these two cases?
jar (doing other things) 2014/02/13 03:24:48 This is fine IMO. You are seemingly talking to an
wtc 2014/02/14 00:53:57 Done.
229 if (server_hello_address.address().empty() ||
230 public_reset_address.address().empty()) {
231 return;
232 }
233
234 bool first_ipv4 =
235 (server_hello_address.address().size() == kIPv4AddressSize);
236 bool second_ipv4 =
237 (public_reset_address.address().size() == kIPv4AddressSize);
238 int offset;
239 if (first_ipv4 == second_ipv4) {
240 if (first_ipv4) {
241 offset = 0; // v4_v4
242 } else {
243 offset = 1; // v6_v6
244 }
245 } else {
246 if (first_ipv4) {
247 offset = 2; // v4_v6
248 } else {
249 offset = 3; // v6_v4
250 }
251 }
252
253 int sample;
254 if (server_hello_address.address() != public_reset_address.address()) {
255 sample = kAddressMismatch_base;
256 } else if (server_hello_address.port() != public_reset_address.port()) {
257 sample = kPortMismatch_base;
258 } else {
259 sample = kAddressAndPortMatch_base;
260 }
261 sample += offset;
262 HISTOGRAM_ENUMERATION("Net.QuicSession.PublicResetAddressMismatch",
wtc 2014/02/13 02:04:10 Is this histogram name OK? All the histograms in t
jar (doing other things) 2014/02/13 03:24:48 Critical is the "UMA" prefix, as otherwise the his
wtc 2014/02/14 00:53:57 Done.
263 sample, kBoundaryValue);
264 }
265
198 } // namespace 266 } // namespace
199 267
200 QuicConnectionLogger::QuicConnectionLogger(const BoundNetLog& net_log) 268 QuicConnectionLogger::QuicConnectionLogger(const BoundNetLog& net_log)
201 : net_log_(net_log), 269 : net_log_(net_log),
202 last_received_packet_sequence_number_(0), 270 last_received_packet_sequence_number_(0),
203 largest_received_packet_sequence_number_(0), 271 largest_received_packet_sequence_number_(0),
204 largest_received_missing_packet_sequence_number_(0), 272 largest_received_missing_packet_sequence_number_(0),
205 out_of_order_recieved_packet_count_(0), 273 out_of_order_recieved_packet_count_(0),
206 num_truncated_acks_sent_(0), 274 num_truncated_acks_sent_(0),
207 num_truncated_acks_received_(0) { 275 num_truncated_acks_received_(0) {
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
386 void QuicConnectionLogger::OnConnectionCloseFrame( 454 void QuicConnectionLogger::OnConnectionCloseFrame(
387 const QuicConnectionCloseFrame& frame) { 455 const QuicConnectionCloseFrame& frame) {
388 net_log_.AddEvent( 456 net_log_.AddEvent(
389 NetLog::TYPE_QUIC_SESSION_CONNECTION_CLOSE_FRAME_RECEIVED, 457 NetLog::TYPE_QUIC_SESSION_CONNECTION_CLOSE_FRAME_RECEIVED,
390 base::Bind(&NetLogQuicConnectionCloseFrameCallback, &frame)); 458 base::Bind(&NetLogQuicConnectionCloseFrameCallback, &frame));
391 } 459 }
392 460
393 void QuicConnectionLogger::OnPublicResetPacket( 461 void QuicConnectionLogger::OnPublicResetPacket(
394 const QuicPublicResetPacket& packet) { 462 const QuicPublicResetPacket& packet) {
395 net_log_.AddEvent(NetLog::TYPE_QUIC_SESSION_PUBLIC_RESET_PACKET_RECEIVED); 463 net_log_.AddEvent(NetLog::TYPE_QUIC_SESSION_PUBLIC_RESET_PACKET_RECEIVED);
464 UpdatePublicResetAddressMismatchHistogram(client_address_,
465 packet.client_address);
396 } 466 }
397 467
398 void QuicConnectionLogger::OnVersionNegotiationPacket( 468 void QuicConnectionLogger::OnVersionNegotiationPacket(
399 const QuicVersionNegotiationPacket& packet) { 469 const QuicVersionNegotiationPacket& packet) {
400 net_log_.AddEvent( 470 net_log_.AddEvent(
401 NetLog::TYPE_QUIC_SESSION_VERSION_NEGOTIATION_PACKET_RECEIVED, 471 NetLog::TYPE_QUIC_SESSION_VERSION_NEGOTIATION_PACKET_RECEIVED,
402 base::Bind(&NetLogQuicVersionNegotiationPacketCallback, &packet)); 472 base::Bind(&NetLogQuicVersionNegotiationPacketCallback, &packet));
403 } 473 }
404 474
405 void QuicConnectionLogger::OnRevivedPacket( 475 void QuicConnectionLogger::OnRevivedPacket(
406 const QuicPacketHeader& revived_header, 476 const QuicPacketHeader& revived_header,
407 base::StringPiece payload) { 477 base::StringPiece payload) {
408 net_log_.AddEvent( 478 net_log_.AddEvent(
409 NetLog::TYPE_QUIC_SESSION_PACKET_HEADER_REVIVED, 479 NetLog::TYPE_QUIC_SESSION_PACKET_HEADER_REVIVED,
410 base::Bind(&NetLogQuicPacketHeaderCallback, &revived_header)); 480 base::Bind(&NetLogQuicPacketHeaderCallback, &revived_header));
411 } 481 }
412 482
413 void QuicConnectionLogger::OnCryptoHandshakeMessageReceived( 483 void QuicConnectionLogger::OnCryptoHandshakeMessageReceived(
414 const CryptoHandshakeMessage& message) { 484 const CryptoHandshakeMessage& message) {
415 net_log_.AddEvent( 485 net_log_.AddEvent(
416 NetLog::TYPE_QUIC_SESSION_CRYPTO_HANDSHAKE_MESSAGE_RECEIVED, 486 NetLog::TYPE_QUIC_SESSION_CRYPTO_HANDSHAKE_MESSAGE_RECEIVED,
417 base::Bind(&NetLogQuicCryptoHandshakeMessageCallback, &message)); 487 base::Bind(&NetLogQuicCryptoHandshakeMessageCallback, &message));
488
489 if (message.tag() == kSHLO) {
490 StringPiece address;
491 QuicSocketAddressCoder decoder;
492 if (message.GetStringPiece(kCADR, &address) &&
493 decoder.Decode(address.data(), address.size())) {
494 client_address_ = IPEndPoint(decoder.ip(), decoder.port());
495 }
496 }
418 } 497 }
419 498
420 void QuicConnectionLogger::OnCryptoHandshakeMessageSent( 499 void QuicConnectionLogger::OnCryptoHandshakeMessageSent(
421 const CryptoHandshakeMessage& message) { 500 const CryptoHandshakeMessage& message) {
422 net_log_.AddEvent( 501 net_log_.AddEvent(
423 NetLog::TYPE_QUIC_SESSION_CRYPTO_HANDSHAKE_MESSAGE_SENT, 502 NetLog::TYPE_QUIC_SESSION_CRYPTO_HANDSHAKE_MESSAGE_SENT,
424 base::Bind(&NetLogQuicCryptoHandshakeMessageCallback, &message)); 503 base::Bind(&NetLogQuicCryptoHandshakeMessageCallback, &message));
425 } 504 }
426 505
427 void QuicConnectionLogger::OnConnectionClosed(QuicErrorCode error, 506 void QuicConnectionLogger::OnConnectionClosed(QuicErrorCode error,
428 bool from_peer) { 507 bool from_peer) {
429 net_log_.AddEvent( 508 net_log_.AddEvent(
430 NetLog::TYPE_QUIC_SESSION_CLOSED, 509 NetLog::TYPE_QUIC_SESSION_CLOSED,
431 base::Bind(&NetLogQuicOnConnectionClosedCallback, error, from_peer)); 510 base::Bind(&NetLogQuicOnConnectionClosedCallback, error, from_peer));
432 } 511 }
433 512
434 void QuicConnectionLogger::OnSuccessfulVersionNegotiation( 513 void QuicConnectionLogger::OnSuccessfulVersionNegotiation(
435 const QuicVersion& version) { 514 const QuicVersion& version) {
436 string quic_version = QuicVersionToString(version); 515 string quic_version = QuicVersionToString(version);
437 net_log_.AddEvent(NetLog::TYPE_QUIC_SESSION_VERSION_NEGOTIATED, 516 net_log_.AddEvent(NetLog::TYPE_QUIC_SESSION_VERSION_NEGOTIATED,
438 NetLog::StringCallback("version", &quic_version)); 517 NetLog::StringCallback("version", &quic_version));
439 } 518 }
440 519
441 } // namespace net 520 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698