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