• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/quic/quic_connection_logger.h"
6 
7 #include <algorithm>
8 #include <limits>
9 #include <memory>
10 #include <utility>
11 #include <vector>
12 
13 #include "base/metrics/histogram_base.h"
14 #include "base/metrics/histogram_functions.h"
15 #include "base/metrics/histogram_macros.h"
16 #include "base/values.h"
17 #include "net/base/ip_address.h"
18 #include "net/cert/x509_certificate.h"
19 #include "net/quic/address_utils.h"
20 #include "net/quic/quic_address_mismatch.h"
21 #include "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_handshake_message.h"
22 #include "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h"
23 #include "net/third_party/quiche/src/quiche/quic/core/quic_connection_id.h"
24 #include "net/third_party/quiche/src/quiche/quic/core/quic_packets.h"
25 #include "net/third_party/quiche/src/quiche/quic/core/quic_socket_address_coder.h"
26 #include "net/third_party/quiche/src/quiche/quic/core/quic_time.h"
27 #include "net/third_party/quiche/src/quiche/quic/core/quic_utils.h"
28 
29 using quic::kMaxOutgoingPacketSize;
30 using std::string;
31 
32 namespace net {
33 
34 namespace {
35 
36 // If |address| is an IPv4-mapped IPv6 address, returns ADDRESS_FAMILY_IPV4
37 // instead of ADDRESS_FAMILY_IPV6. Othewise, behaves like GetAddressFamily().
GetRealAddressFamily(const IPAddress & address)38 AddressFamily GetRealAddressFamily(const IPAddress& address) {
39   return address.IsIPv4MappedIPv6() ? ADDRESS_FAMILY_IPV4
40                                     : GetAddressFamily(address);
41 }
42 
43 }  // namespace
44 
QuicConnectionLogger(quic::QuicSession * session,std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher,const NetLogWithSource & net_log)45 QuicConnectionLogger::QuicConnectionLogger(
46     quic::QuicSession* session,
47     std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher,
48     const NetLogWithSource& net_log)
49     : session_(session),
50       socket_performance_watcher_(std::move(socket_performance_watcher)),
51       event_logger_(session, net_log) {}
52 
~QuicConnectionLogger()53 QuicConnectionLogger::~QuicConnectionLogger() {
54   UMA_HISTOGRAM_COUNTS_1M("Net.QuicSession.OutOfOrderPacketsReceived",
55                           num_out_of_order_received_packets_);
56   UMA_HISTOGRAM_COUNTS_1M("Net.QuicSession.OutOfOrderLargePacketsReceived",
57                           num_out_of_order_large_received_packets_);
58   UMA_HISTOGRAM_COUNTS_1M("Net.QuicSession.IncorrectConnectionIDsReceived",
59                           num_incorrect_connection_ids_);
60   UMA_HISTOGRAM_COUNTS_1M("Net.QuicSession.UndecryptablePacketsReceived",
61                           num_undecryptable_packets_);
62   UMA_HISTOGRAM_COUNTS_1M("Net.QuicSession.DuplicatePacketsReceived",
63                           num_duplicate_packets_);
64   UMA_HISTOGRAM_COUNTS_1M("Net.QuicSession.BlockedFrames.Received",
65                           num_blocked_frames_received_);
66   UMA_HISTOGRAM_COUNTS_1M("Net.QuicSession.BlockedFrames.Sent",
67                           num_blocked_frames_sent_);
68 
69   const quic::QuicConnectionStats& stats = session_->connection()->GetStats();
70   UMA_HISTOGRAM_TIMES("Net.QuicSession.MinRTT",
71                       base::Microseconds(stats.min_rtt_us));
72   UMA_HISTOGRAM_TIMES("Net.QuicSession.SmoothedRTT",
73                       base::Microseconds(stats.srtt_us));
74 
75   if (num_frames_received_ > 0) {
76     int duplicate_stream_frame_per_thousand =
77         num_duplicate_frames_received_ * 1000 / num_frames_received_;
78     if (num_packets_received_ < 100) {
79       UMA_HISTOGRAM_CUSTOM_COUNTS(
80           "Net.QuicSession.StreamFrameDuplicatedShortConnection",
81           duplicate_stream_frame_per_thousand, 1, 1000, 75);
82     } else {
83       UMA_HISTOGRAM_CUSTOM_COUNTS(
84           "Net.QuicSession.StreamFrameDuplicatedLongConnection",
85           duplicate_stream_frame_per_thousand, 1, 1000, 75);
86     }
87   }
88 }
89 
OnFrameAddedToPacket(const quic::QuicFrame & frame)90 void QuicConnectionLogger::OnFrameAddedToPacket(const quic::QuicFrame& frame) {
91   switch (frame.type) {
92     case quic::PADDING_FRAME:
93       break;
94     case quic::STREAM_FRAME:
95       break;
96     case quic::ACK_FRAME: {
97       break;
98     }
99     case quic::RST_STREAM_FRAME:
100       base::UmaHistogramSparse("Net.QuicSession.RstStreamErrorCodeClient",
101                                frame.rst_stream_frame->error_code);
102       break;
103     case quic::CONNECTION_CLOSE_FRAME:
104       break;
105     case quic::GOAWAY_FRAME:
106       break;
107     case quic::WINDOW_UPDATE_FRAME:
108       break;
109     case quic::BLOCKED_FRAME:
110       ++num_blocked_frames_sent_;
111       break;
112     case quic::STOP_WAITING_FRAME:
113       break;
114     case quic::PING_FRAME:
115       UMA_HISTOGRAM_BOOLEAN("Net.QuicSession.ConnectionFlowControlBlocked",
116                             session_->IsConnectionFlowControlBlocked());
117       UMA_HISTOGRAM_BOOLEAN("Net.QuicSession.StreamFlowControlBlocked",
118                             session_->IsStreamFlowControlBlocked());
119       break;
120     case quic::MTU_DISCOVERY_FRAME:
121       break;
122     case quic::NEW_CONNECTION_ID_FRAME:
123       break;
124     case quic::MAX_STREAMS_FRAME:
125       break;
126     case quic::STREAMS_BLOCKED_FRAME:
127       break;
128     case quic::PATH_RESPONSE_FRAME:
129       break;
130     case quic::PATH_CHALLENGE_FRAME:
131       break;
132     case quic::STOP_SENDING_FRAME:
133       base::UmaHistogramSparse("Net.QuicSession.StopSendingErrorCodeClient",
134                                frame.stop_sending_frame.error_code);
135       break;
136     case quic::MESSAGE_FRAME:
137       break;
138     case quic::CRYPTO_FRAME:
139       break;
140     case quic::NEW_TOKEN_FRAME:
141       break;
142     case quic::RETIRE_CONNECTION_ID_FRAME:
143       break;
144     default:
145       DCHECK(false) << "Illegal frame type: " << frame.type;
146   }
147   event_logger_.OnFrameAddedToPacket(frame);
148 }
149 
OnStreamFrameCoalesced(const quic::QuicStreamFrame & frame)150 void QuicConnectionLogger::OnStreamFrameCoalesced(
151     const quic::QuicStreamFrame& frame) {
152   event_logger_.OnStreamFrameCoalesced(frame);
153 }
154 
OnPacketSent(quic::QuicPacketNumber packet_number,quic::QuicPacketLength packet_length,bool has_crypto_handshake,quic::TransmissionType transmission_type,quic::EncryptionLevel encryption_level,const quic::QuicFrames & retransmittable_frames,const quic::QuicFrames & nonretransmittable_frames,quic::QuicTime sent_time,uint32_t batch_id)155 void QuicConnectionLogger::OnPacketSent(
156     quic::QuicPacketNumber packet_number,
157     quic::QuicPacketLength packet_length,
158     bool has_crypto_handshake,
159     quic::TransmissionType transmission_type,
160     quic::EncryptionLevel encryption_level,
161     const quic::QuicFrames& retransmittable_frames,
162     const quic::QuicFrames& nonretransmittable_frames,
163     quic::QuicTime sent_time,
164     uint32_t batch_id) {
165   // 4.4.1.4.  Minimum Packet Size
166   // The payload of a UDP datagram carrying the Initial packet MUST be
167   // expanded to at least 1200 octets
168   const quic::QuicPacketLength kMinClientInitialPacketLength = 1200;
169   switch (encryption_level) {
170     case quic::ENCRYPTION_INITIAL:
171       UMA_HISTOGRAM_CUSTOM_COUNTS("Net.QuicSession.SendPacketSize.Initial",
172                                   packet_length, 1, kMaxOutgoingPacketSize, 50);
173       if (packet_length < kMinClientInitialPacketLength) {
174         UMA_HISTOGRAM_CUSTOM_COUNTS(
175             "Net.QuicSession.TooSmallInitialSentPacket",
176             kMinClientInitialPacketLength - packet_length, 1,
177             kMinClientInitialPacketLength, 50);
178       }
179       break;
180     case quic::ENCRYPTION_HANDSHAKE:
181       UMA_HISTOGRAM_CUSTOM_COUNTS("Net.QuicSession.SendPacketSize.Handshake",
182                                   packet_length, 1, kMaxOutgoingPacketSize, 50);
183       break;
184     case quic::ENCRYPTION_ZERO_RTT:
185       UMA_HISTOGRAM_CUSTOM_COUNTS("Net.QuicSession.SendPacketSize.0RTT",
186                                   packet_length, 1, kMaxOutgoingPacketSize, 50);
187       break;
188     case quic::ENCRYPTION_FORWARD_SECURE:
189       UMA_HISTOGRAM_CUSTOM_COUNTS(
190           "Net.QuicSession.SendPacketSize.ForwardSecure", packet_length, 1,
191           kMaxOutgoingPacketSize, 50);
192       break;
193     case quic::NUM_ENCRYPTION_LEVELS:
194       NOTREACHED();
195       break;
196   }
197 
198   event_logger_.OnPacketSent(packet_number, packet_length, has_crypto_handshake,
199                              transmission_type, encryption_level,
200                              retransmittable_frames, nonretransmittable_frames,
201                              sent_time, batch_id);
202 }
203 
OnPacketLoss(quic::QuicPacketNumber lost_packet_number,quic::EncryptionLevel encryption_level,quic::TransmissionType transmission_type,quic::QuicTime detection_time)204 void QuicConnectionLogger::OnPacketLoss(
205     quic::QuicPacketNumber lost_packet_number,
206     quic::EncryptionLevel encryption_level,
207     quic::TransmissionType transmission_type,
208     quic::QuicTime detection_time) {
209   event_logger_.OnPacketLoss(lost_packet_number, encryption_level,
210                              transmission_type, detection_time);
211 }
212 
OnConfigProcessed(const quic::QuicSentPacketManager::DebugDelegate::SendParameters & parameters)213 void QuicConnectionLogger::OnConfigProcessed(
214     const quic::QuicSentPacketManager::DebugDelegate::SendParameters&
215         parameters) {
216   event_logger_.OnConfigProcessed(parameters);
217 }
218 
OnPingSent()219 void QuicConnectionLogger::OnPingSent() {
220   no_packet_received_after_ping_ = true;
221 }
222 
OnPacketReceived(const quic::QuicSocketAddress & self_address,const quic::QuicSocketAddress & peer_address,const quic::QuicEncryptedPacket & packet)223 void QuicConnectionLogger::OnPacketReceived(
224     const quic::QuicSocketAddress& self_address,
225     const quic::QuicSocketAddress& peer_address,
226     const quic::QuicEncryptedPacket& packet) {
227   if (local_address_from_self_.GetFamily() == ADDRESS_FAMILY_UNSPECIFIED) {
228     local_address_from_self_ = ToIPEndPoint(self_address);
229     UMA_HISTOGRAM_ENUMERATION(
230         "Net.QuicSession.ConnectionTypeFromSelf",
231         GetRealAddressFamily(ToIPEndPoint(self_address).address()),
232         ADDRESS_FAMILY_LAST);
233   }
234 
235   previous_received_packet_size_ = last_received_packet_size_;
236   last_received_packet_size_ = packet.length();
237   event_logger_.OnPacketReceived(self_address, peer_address, packet);
238 }
239 
OnUnauthenticatedHeader(const quic::QuicPacketHeader & header)240 void QuicConnectionLogger::OnUnauthenticatedHeader(
241     const quic::QuicPacketHeader& header) {
242   event_logger_.OnUnauthenticatedHeader(header);
243 }
244 
OnIncorrectConnectionId(quic::QuicConnectionId connection_id)245 void QuicConnectionLogger::OnIncorrectConnectionId(
246     quic::QuicConnectionId connection_id) {
247   ++num_incorrect_connection_ids_;
248 }
249 
OnUndecryptablePacket(quic::EncryptionLevel decryption_level,bool dropped)250 void QuicConnectionLogger::OnUndecryptablePacket(
251     quic::EncryptionLevel decryption_level,
252     bool dropped) {
253   ++num_undecryptable_packets_;
254   event_logger_.OnUndecryptablePacket(decryption_level, dropped);
255 }
256 
OnAttemptingToProcessUndecryptablePacket(quic::EncryptionLevel decryption_level)257 void QuicConnectionLogger::OnAttemptingToProcessUndecryptablePacket(
258     quic::EncryptionLevel decryption_level) {
259   event_logger_.OnAttemptingToProcessUndecryptablePacket(decryption_level);
260 }
261 
OnDuplicatePacket(quic::QuicPacketNumber packet_number)262 void QuicConnectionLogger::OnDuplicatePacket(
263     quic::QuicPacketNumber packet_number) {
264   ++num_duplicate_packets_;
265   event_logger_.OnDuplicatePacket(packet_number);
266 }
267 
OnProtocolVersionMismatch(quic::ParsedQuicVersion received_version)268 void QuicConnectionLogger::OnProtocolVersionMismatch(
269     quic::ParsedQuicVersion received_version) {
270   // TODO(rtenneti): Add logging.
271 }
272 
OnPacketHeader(const quic::QuicPacketHeader & header,quic::QuicTime receive_time,quic::EncryptionLevel level)273 void QuicConnectionLogger::OnPacketHeader(const quic::QuicPacketHeader& header,
274                                           quic::QuicTime receive_time,
275                                           quic::EncryptionLevel level) {
276   if (!first_received_packet_number_.IsInitialized()) {
277     first_received_packet_number_ = header.packet_number;
278   } else if (header.packet_number < first_received_packet_number_) {
279     // Ignore packets with packet numbers less than
280     // first_received_packet_number_.
281     return;
282   }
283   ++num_packets_received_;
284   if (!largest_received_packet_number_.IsInitialized()) {
285     largest_received_packet_number_ = header.packet_number;
286   } else if (largest_received_packet_number_ < header.packet_number) {
287     uint64_t delta = header.packet_number - largest_received_packet_number_;
288     if (delta > 1) {
289       // There is a gap between the largest packet previously received and
290       // the current packet.  This indicates either loss, or out-of-order
291       // delivery.
292       UMA_HISTOGRAM_COUNTS_1M(
293           "Net.QuicSession.PacketGapReceived",
294           static_cast<base::HistogramBase::Sample>(delta - 1));
295     }
296     largest_received_packet_number_ = header.packet_number;
297   }
298   if (header.packet_number - first_received_packet_number_ <
299       received_packets_.size()) {
300     received_packets_[header.packet_number - first_received_packet_number_] =
301         true;
302   }
303   if (last_received_packet_number_.IsInitialized() &&
304       header.packet_number < last_received_packet_number_) {
305     ++num_out_of_order_received_packets_;
306     if (previous_received_packet_size_ < last_received_packet_size_)
307       ++num_out_of_order_large_received_packets_;
308     UMA_HISTOGRAM_COUNTS_1M(
309         "Net.QuicSession.OutOfOrderGapReceived",
310         static_cast<base::HistogramBase::Sample>(last_received_packet_number_ -
311                                                  header.packet_number));
312   } else if (no_packet_received_after_ping_) {
313     if (last_received_packet_number_.IsInitialized()) {
314       UMA_HISTOGRAM_COUNTS_1M(
315           "Net.QuicSession.PacketGapReceivedNearPing",
316           static_cast<base::HistogramBase::Sample>(
317               header.packet_number - last_received_packet_number_));
318     }
319     no_packet_received_after_ping_ = false;
320   }
321   last_received_packet_number_ = header.packet_number;
322   event_logger_.OnPacketHeader(header, receive_time, level);
323 }
324 
OnStreamFrame(const quic::QuicStreamFrame & frame)325 void QuicConnectionLogger::OnStreamFrame(const quic::QuicStreamFrame& frame) {
326   event_logger_.OnStreamFrame(frame);
327 }
328 
OnPathChallengeFrame(const quic::QuicPathChallengeFrame & frame)329 void QuicConnectionLogger::OnPathChallengeFrame(
330     const quic::QuicPathChallengeFrame& frame) {
331   event_logger_.OnPathChallengeFrame(frame);
332 }
333 
OnPathResponseFrame(const quic::QuicPathResponseFrame & frame)334 void QuicConnectionLogger::OnPathResponseFrame(
335     const quic::QuicPathResponseFrame& frame) {
336   event_logger_.OnPathResponseFrame(frame);
337 }
338 
OnCryptoFrame(const quic::QuicCryptoFrame & frame)339 void QuicConnectionLogger::OnCryptoFrame(const quic::QuicCryptoFrame& frame) {
340   event_logger_.OnCryptoFrame(frame);
341 }
342 
OnStopSendingFrame(const quic::QuicStopSendingFrame & frame)343 void QuicConnectionLogger::OnStopSendingFrame(
344     const quic::QuicStopSendingFrame& frame) {
345   base::UmaHistogramSparse("Net.QuicSession.StopSendingErrorCodeServer",
346                            frame.error_code);
347   event_logger_.OnStopSendingFrame(frame);
348 }
349 
OnStreamsBlockedFrame(const quic::QuicStreamsBlockedFrame & frame)350 void QuicConnectionLogger::OnStreamsBlockedFrame(
351     const quic::QuicStreamsBlockedFrame& frame) {
352   event_logger_.OnStreamsBlockedFrame(frame);
353 }
354 
OnMaxStreamsFrame(const quic::QuicMaxStreamsFrame & frame)355 void QuicConnectionLogger::OnMaxStreamsFrame(
356     const quic::QuicMaxStreamsFrame& frame) {
357   event_logger_.OnMaxStreamsFrame(frame);
358 }
359 
OnIncomingAck(quic::QuicPacketNumber ack_packet_number,quic::EncryptionLevel ack_decrypted_level,const quic::QuicAckFrame & frame,quic::QuicTime ack_receive_time,quic::QuicPacketNumber largest_observed,bool rtt_updated,quic::QuicPacketNumber least_unacked_sent_packet)360 void QuicConnectionLogger::OnIncomingAck(
361     quic::QuicPacketNumber ack_packet_number,
362     quic::EncryptionLevel ack_decrypted_level,
363     const quic::QuicAckFrame& frame,
364     quic::QuicTime ack_receive_time,
365     quic::QuicPacketNumber largest_observed,
366     bool rtt_updated,
367     quic::QuicPacketNumber least_unacked_sent_packet) {
368   const size_t kApproximateLargestSoloAckBytes = 100;
369   if (last_received_packet_number_ - first_received_packet_number_ <
370           received_acks_.size() &&
371       last_received_packet_size_ < kApproximateLargestSoloAckBytes) {
372     received_acks_[last_received_packet_number_ -
373                    first_received_packet_number_] = true;
374   }
375 
376   event_logger_.OnIncomingAck(ack_packet_number, ack_decrypted_level, frame,
377                               ack_receive_time, largest_observed, rtt_updated,
378                               least_unacked_sent_packet);
379 }
380 
OnRstStreamFrame(const quic::QuicRstStreamFrame & frame)381 void QuicConnectionLogger::OnRstStreamFrame(
382     const quic::QuicRstStreamFrame& frame) {
383   base::UmaHistogramSparse("Net.QuicSession.RstStreamErrorCodeServer",
384                            frame.error_code);
385   event_logger_.OnRstStreamFrame(frame);
386 }
387 
OnConnectionCloseFrame(const quic::QuicConnectionCloseFrame & frame)388 void QuicConnectionLogger::OnConnectionCloseFrame(
389     const quic::QuicConnectionCloseFrame& frame) {
390   event_logger_.OnConnectionCloseFrame(frame);
391 }
392 
OnWindowUpdateFrame(const quic::QuicWindowUpdateFrame & frame,const quic::QuicTime & receive_time)393 void QuicConnectionLogger::OnWindowUpdateFrame(
394     const quic::QuicWindowUpdateFrame& frame,
395     const quic::QuicTime& receive_time) {
396   event_logger_.OnWindowUpdateFrame(frame, receive_time);
397 }
398 
OnBlockedFrame(const quic::QuicBlockedFrame & frame)399 void QuicConnectionLogger::OnBlockedFrame(const quic::QuicBlockedFrame& frame) {
400   ++num_blocked_frames_received_;
401   event_logger_.OnBlockedFrame(frame);
402 }
403 
OnGoAwayFrame(const quic::QuicGoAwayFrame & frame)404 void QuicConnectionLogger::OnGoAwayFrame(const quic::QuicGoAwayFrame& frame) {
405   UMA_HISTOGRAM_BOOLEAN("Net.QuicSession.GoAwayReceivedForConnectionMigration",
406                         frame.error_code == quic::QUIC_ERROR_MIGRATING_PORT);
407 
408   event_logger_.OnGoAwayFrame(frame);
409 }
410 
OnPingFrame(const quic::QuicPingFrame & frame,quic::QuicTime::Delta ping_received_delay)411 void QuicConnectionLogger::OnPingFrame(
412     const quic::QuicPingFrame& frame,
413     quic::QuicTime::Delta ping_received_delay) {
414   event_logger_.OnPingFrame(frame, ping_received_delay);
415 }
416 
OnPaddingFrame(const quic::QuicPaddingFrame & frame)417 void QuicConnectionLogger::OnPaddingFrame(const quic::QuicPaddingFrame& frame) {
418   event_logger_.OnPaddingFrame(frame);
419 }
420 
OnNewConnectionIdFrame(const quic::QuicNewConnectionIdFrame & frame)421 void QuicConnectionLogger::OnNewConnectionIdFrame(
422     const quic::QuicNewConnectionIdFrame& frame) {
423   event_logger_.OnNewConnectionIdFrame(frame);
424 }
425 
OnNewTokenFrame(const quic::QuicNewTokenFrame & frame)426 void QuicConnectionLogger::OnNewTokenFrame(
427     const quic::QuicNewTokenFrame& frame) {
428   event_logger_.OnNewTokenFrame(frame);
429 }
430 
OnRetireConnectionIdFrame(const quic::QuicRetireConnectionIdFrame & frame)431 void QuicConnectionLogger::OnRetireConnectionIdFrame(
432     const quic::QuicRetireConnectionIdFrame& frame) {
433   event_logger_.OnRetireConnectionIdFrame(frame);
434 }
435 
OnMessageFrame(const quic::QuicMessageFrame & frame)436 void QuicConnectionLogger::OnMessageFrame(const quic::QuicMessageFrame& frame) {
437   event_logger_.OnMessageFrame(frame);
438 }
439 
OnHandshakeDoneFrame(const quic::QuicHandshakeDoneFrame & frame)440 void QuicConnectionLogger::OnHandshakeDoneFrame(
441     const quic::QuicHandshakeDoneFrame& frame) {
442   event_logger_.OnHandshakeDoneFrame(frame);
443 }
444 
OnCoalescedPacketSent(const quic::QuicCoalescedPacket & coalesced_packet,size_t length)445 void QuicConnectionLogger::OnCoalescedPacketSent(
446     const quic::QuicCoalescedPacket& coalesced_packet,
447     size_t length) {
448   event_logger_.OnCoalescedPacketSent(coalesced_packet, length);
449 }
450 
OnVersionNegotiationPacket(const quic::QuicVersionNegotiationPacket & packet)451 void QuicConnectionLogger::OnVersionNegotiationPacket(
452     const quic::QuicVersionNegotiationPacket& packet) {
453   event_logger_.OnVersionNegotiationPacket(packet);
454 }
455 
OnCryptoHandshakeMessageReceived(const quic::CryptoHandshakeMessage & message)456 void QuicConnectionLogger::OnCryptoHandshakeMessageReceived(
457     const quic::CryptoHandshakeMessage& message) {
458   if (message.tag() == quic::kSHLO) {
459     std::string_view address;
460     quic::QuicSocketAddressCoder decoder;
461     if (message.GetStringPiece(quic::kCADR, &address) &&
462         decoder.Decode(address.data(), address.size())) {
463       local_address_from_shlo_ =
464           IPEndPoint(ToIPAddress(decoder.ip()), decoder.port());
465       UMA_HISTOGRAM_ENUMERATION(
466           "Net.QuicSession.ConnectionTypeFromPeer",
467           GetRealAddressFamily(local_address_from_shlo_.address()),
468           ADDRESS_FAMILY_LAST);
469 
470       int sample = GetAddressMismatch(local_address_from_shlo_,
471                                       local_address_from_self_);
472       // If `sample` is negative, we are seemingly talking to an older server
473       // that does not support the feature, so we can't report the results in
474       // the histogram.
475       if (sample >= 0) {
476         UMA_HISTOGRAM_ENUMERATION("Net.QuicSession.SelfShloAddressMismatch",
477                                   static_cast<QuicAddressMismatch>(sample),
478                                   QUIC_ADDRESS_MISMATCH_MAX);
479       }
480     }
481   }
482   event_logger_.OnCryptoHandshakeMessageReceived(message);
483 }
484 
OnCryptoHandshakeMessageSent(const quic::CryptoHandshakeMessage & message)485 void QuicConnectionLogger::OnCryptoHandshakeMessageSent(
486     const quic::CryptoHandshakeMessage& message) {
487   event_logger_.OnCryptoHandshakeMessageSent(message);
488 }
489 
OnConnectionClosed(const quic::QuicConnectionCloseFrame & frame,quic::ConnectionCloseSource source)490 void QuicConnectionLogger::OnConnectionClosed(
491     const quic::QuicConnectionCloseFrame& frame,
492     quic::ConnectionCloseSource source) {
493   event_logger_.OnConnectionClosed(frame, source);
494 }
495 
OnSuccessfulVersionNegotiation(const quic::ParsedQuicVersion & version)496 void QuicConnectionLogger::OnSuccessfulVersionNegotiation(
497     const quic::ParsedQuicVersion& version) {
498   event_logger_.OnSuccessfulVersionNegotiation(version);
499 }
500 
UpdateReceivedFrameCounts(quic::QuicStreamId stream_id,int num_frames_received,int num_duplicate_frames_received)501 void QuicConnectionLogger::UpdateReceivedFrameCounts(
502     quic::QuicStreamId stream_id,
503     int num_frames_received,
504     int num_duplicate_frames_received) {
505   if (!quic::QuicUtils::IsCryptoStreamId(session_->transport_version(),
506                                          stream_id)) {
507     num_frames_received_ += num_frames_received;
508     num_duplicate_frames_received_ += num_duplicate_frames_received;
509   }
510 }
511 
OnCertificateVerified(const CertVerifyResult & result)512 void QuicConnectionLogger::OnCertificateVerified(
513     const CertVerifyResult& result) {
514   event_logger_.OnCertificateVerified(result);
515 }
516 
ReceivedPacketLossRate() const517 float QuicConnectionLogger::ReceivedPacketLossRate() const {
518   if (!largest_received_packet_number_.IsInitialized())
519     return 0.0f;
520   float num_packets =
521       largest_received_packet_number_ - first_received_packet_number_ + 1;
522   float num_missing = num_packets - num_packets_received_;
523   return num_missing / num_packets;
524 }
525 
OnRttChanged(quic::QuicTime::Delta rtt) const526 void QuicConnectionLogger::OnRttChanged(quic::QuicTime::Delta rtt) const {
527   // Notify socket performance watcher of the updated RTT value.
528   if (!socket_performance_watcher_)
529     return;
530 
531   int64_t microseconds = rtt.ToMicroseconds();
532   if (microseconds != 0 &&
533       socket_performance_watcher_->ShouldNotifyUpdatedRTT()) {
534     socket_performance_watcher_->OnUpdatedRTTAvailable(
535         base::Microseconds(rtt.ToMicroseconds()));
536   }
537 }
538 
OnTransportParametersSent(const quic::TransportParameters & transport_parameters)539 void QuicConnectionLogger::OnTransportParametersSent(
540     const quic::TransportParameters& transport_parameters) {
541   event_logger_.OnTransportParametersSent(transport_parameters);
542 }
543 
OnTransportParametersReceived(const quic::TransportParameters & transport_parameters)544 void QuicConnectionLogger::OnTransportParametersReceived(
545     const quic::TransportParameters& transport_parameters) {
546   event_logger_.OnTransportParametersReceived(transport_parameters);
547 }
548 
OnTransportParametersResumed(const quic::TransportParameters & transport_parameters)549 void QuicConnectionLogger::OnTransportParametersResumed(
550     const quic::TransportParameters& transport_parameters) {
551   event_logger_.OnTransportParametersResumed(transport_parameters);
552 }
553 
OnZeroRttRejected(int reason)554 void QuicConnectionLogger::OnZeroRttRejected(int reason) {
555   event_logger_.OnZeroRttRejected(reason);
556 }
557 
OnEncryptedClientHelloSent(std::string_view client_hello)558 void QuicConnectionLogger::OnEncryptedClientHelloSent(
559     std::string_view client_hello) {
560   event_logger_.OnEncryptedClientHelloSent(client_hello);
561 }
562 
563 }  // namespace net
564