xref: /aosp_15_r20/external/cronet/net/quic/quic_event_logger.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2020 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_event_logger.h"
6 
7 #include "base/containers/span.h"
8 #include "base/strings/string_number_conversions.h"
9 #include "net/cert/x509_certificate.h"
10 #include "net/log/net_log_values.h"
11 #include "net/quic/address_utils.h"
12 #include "net/third_party/quiche/src/quiche/quic/core/quic_socket_address_coder.h"
13 #include "third_party/boringssl/src/include/openssl/ssl.h"
14 
15 namespace net {
16 
17 namespace {
18 
NetLogQuicPacketParams(const quic::QuicSocketAddress & self_address,const quic::QuicSocketAddress & peer_address,size_t packet_size)19 base::Value::Dict NetLogQuicPacketParams(
20     const quic::QuicSocketAddress& self_address,
21     const quic::QuicSocketAddress& peer_address,
22     size_t packet_size) {
23   return base::Value::Dict()
24       .Set("self_address", self_address.ToString())
25       .Set("peer_address", peer_address.ToString())
26       .Set("size", static_cast<int>(packet_size));
27 }
28 
NetLogQuicPacketSentParams(quic::QuicPacketNumber packet_number,quic::QuicPacketLength packet_length,quic::TransmissionType transmission_type,quic::EncryptionLevel encryption_level,quic::QuicTime sent_time,uint32_t batch_id)29 base::Value::Dict NetLogQuicPacketSentParams(
30     quic::QuicPacketNumber packet_number,
31     quic::QuicPacketLength packet_length,
32     quic::TransmissionType transmission_type,
33     quic::EncryptionLevel encryption_level,
34     quic::QuicTime sent_time,
35     uint32_t batch_id) {
36   return base::Value::Dict()
37       .Set("transmission_type",
38            quic::TransmissionTypeToString(transmission_type))
39       .Set("packet_number", NetLogNumberValue(packet_number.ToUint64()))
40       .Set("size", packet_length)
41       .Set("sent_time_us", NetLogNumberValue(sent_time.ToDebuggingValue()))
42       .Set("encryption_level", quic::EncryptionLevelToString(encryption_level))
43       .Set("batch_id", NetLogNumberValue(batch_id));
44 }
45 
NetLogQuicPacketLostParams(quic::QuicPacketNumber packet_number,quic::TransmissionType transmission_type,quic::QuicTime detection_time)46 base::Value::Dict NetLogQuicPacketLostParams(
47     quic::QuicPacketNumber packet_number,
48     quic::TransmissionType transmission_type,
49     quic::QuicTime detection_time) {
50   return base::Value::Dict()
51       .Set("transmission_type",
52            quic::TransmissionTypeToString(transmission_type))
53       .Set("packet_number", NetLogNumberValue(packet_number.ToUint64()))
54       .Set("detection_time_us",
55            NetLogNumberValue(detection_time.ToDebuggingValue()));
56 }
57 
NetLogQuicConfigProcessed(const quic::QuicSentPacketManager::DebugDelegate::SendParameters & parameters)58 base::Value::Dict NetLogQuicConfigProcessed(
59     const quic::QuicSentPacketManager::DebugDelegate::SendParameters&
60         parameters) {
61   return base::Value::Dict()
62       .Set("congestion_control_type", quic::CongestionControlTypeToString(
63                                           parameters.congestion_control_type))
64       .Set("use_pacing", parameters.use_pacing)
65       .Set("initial_congestion_window",
66            NetLogNumberValue(parameters.initial_congestion_window));
67 }
68 
NetLogQuicDuplicatePacketParams(quic::QuicPacketNumber packet_number)69 base::Value::Dict NetLogQuicDuplicatePacketParams(
70     quic::QuicPacketNumber packet_number) {
71   return base::Value::Dict().Set("packet_number",
72                                  NetLogNumberValue(packet_number.ToUint64()));
73 }
74 
NetLogReceivedQuicPacketHeaderParams(const quic::QuicPacketHeader & header,const quic::ParsedQuicVersion & session_version,const quic::QuicConnectionId & connection_id,const quic::QuicConnectionId & client_connection_id)75 base::Value::Dict NetLogReceivedQuicPacketHeaderParams(
76     const quic::QuicPacketHeader& header,
77     const quic::ParsedQuicVersion& session_version,
78     const quic::QuicConnectionId& connection_id,
79     const quic::QuicConnectionId& client_connection_id) {
80   base::Value::Dict dict;
81   quic::ParsedQuicVersion version = session_version;
82   if (header.version_flag &&
83       header.version != quic::ParsedQuicVersion::Unsupported()) {
84     version = header.version;
85     if (version != session_version) {
86       dict.Set("version", quic::ParsedQuicVersionToString(version));
87     }
88   }
89   dict.Set("connection_id", connection_id.ToString());
90   if (!client_connection_id.IsEmpty()) {
91     dict.Set("client_connection_id", client_connection_id.ToString());
92   }
93   if (header.destination_connection_id_included ==
94           quic::CONNECTION_ID_PRESENT &&
95       header.destination_connection_id != client_connection_id &&
96       !header.destination_connection_id.IsEmpty()) {
97     dict.Set("destination_connection_id",
98              header.destination_connection_id.ToString());
99   }
100   if (header.source_connection_id_included == quic::CONNECTION_ID_PRESENT &&
101       header.source_connection_id != connection_id &&
102       !header.source_connection_id.IsEmpty()) {
103     dict.Set("source_connection_id", header.source_connection_id.ToString());
104   }
105   dict.Set("packet_number", NetLogNumberValue(header.packet_number.ToUint64()));
106   dict.Set("header_format", quic::PacketHeaderFormatToString(header.form));
107   if (header.form == quic::IETF_QUIC_LONG_HEADER_PACKET) {
108     dict.Set("long_header_type",
109              quic::QuicLongHeaderTypeToString(header.long_packet_type));
110   }
111   return dict;
112 }
113 
NetLogQuicStreamFrameParams(const quic::QuicStreamFrame & frame)114 base::Value::Dict NetLogQuicStreamFrameParams(
115     const quic::QuicStreamFrame& frame) {
116   return base::Value::Dict()
117       .Set("stream_id", static_cast<int>(frame.stream_id))
118       .Set("fin", frame.fin)
119       .Set("offset", NetLogNumberValue(frame.offset))
120       .Set("length", frame.data_length);
121 }
122 
NetLogQuicAckFrameParams(const quic::QuicAckFrame * frame)123 base::Value::Dict NetLogQuicAckFrameParams(const quic::QuicAckFrame* frame) {
124   base::Value::List missing;
125   quic::QuicPacketNumber smallest_observed;
126   if (!frame->packets.Empty()) {
127     // V34 and above express acked packets, but only print
128     // missing packets, because it's typically a shorter list.
129     smallest_observed = frame->packets.Min();
130     for (quic::QuicPacketNumber packet = smallest_observed;
131          packet < frame->largest_acked; ++packet) {
132       if (!frame->packets.Contains(packet)) {
133         missing.Append(NetLogNumberValue(packet.ToUint64()));
134       }
135     }
136   } else {
137     smallest_observed = frame->largest_acked;
138   }
139 
140   base::Value::List received;
141   for (const auto& packet_time : frame->received_packet_times) {
142     received.Append(
143         base::Value::Dict()
144             .Set("packet_number",
145                  NetLogNumberValue(packet_time.first.ToUint64()))
146             .Set("received",
147                  NetLogNumberValue(packet_time.second.ToDebuggingValue())));
148   }
149 
150   base::Value::Dict rv;
151   rv.Set("largest_observed",
152          NetLogNumberValue(frame->largest_acked.ToUint64()));
153   rv.Set("delta_time_largest_observed_us",
154          NetLogNumberValue(frame->ack_delay_time.ToMicroseconds()));
155   rv.Set("smallest_observed", NetLogNumberValue(smallest_observed.ToUint64()));
156   rv.Set("missing_packets", std::move(missing));
157   rv.Set("received_packet_times", std::move(received));
158   if (frame->ecn_counters.has_value()) {
159     rv.Set("ECT0", NetLogNumberValue(frame->ecn_counters->ect0));
160     rv.Set("ECT1", NetLogNumberValue(frame->ecn_counters->ect1));
161     rv.Set("CE", NetLogNumberValue(frame->ecn_counters->ce));
162   }
163   return rv;
164 }
165 
NetLogQuicRstStreamFrameParams(const quic::QuicRstStreamFrame * frame)166 base::Value::Dict NetLogQuicRstStreamFrameParams(
167     const quic::QuicRstStreamFrame* frame) {
168   return base::Value::Dict()
169       .Set("stream_id", static_cast<int>(frame->stream_id))
170       .Set("quic_rst_stream_error", static_cast<int>(frame->error_code))
171       .Set("ietf_error_code", static_cast<int>(frame->ietf_error_code))
172       .Set("offset", NetLogNumberValue(frame->byte_offset));
173 }
174 
NetLogQuicConnectionCloseFrameParams(const quic::QuicConnectionCloseFrame * frame)175 base::Value::Dict NetLogQuicConnectionCloseFrameParams(
176     const quic::QuicConnectionCloseFrame* frame) {
177   base::Value::Dict dict;
178   dict.Set("quic_error", static_cast<int>(frame->quic_error_code));
179   if (frame->wire_error_code != frame->quic_error_code) {
180     dict.Set("quic_wire_error", static_cast<int>(frame->wire_error_code));
181   }
182   std::string close_type;
183   switch (frame->close_type) {
184     case quic::GOOGLE_QUIC_CONNECTION_CLOSE:
185       close_type = "gQUIC";
186       break;
187     case quic::IETF_QUIC_TRANSPORT_CONNECTION_CLOSE:
188       close_type = "Transport";
189       break;
190     case quic::IETF_QUIC_APPLICATION_CONNECTION_CLOSE:
191       close_type = "Application";
192       break;
193   }
194   dict.Set("close_type", close_type);
195   if (frame->transport_close_frame_type != 0) {
196     dict.Set("transport_close_frame_type",
197              NetLogNumberValue(frame->transport_close_frame_type));
198   }
199   dict.Set("details", frame->error_details);
200   return dict;
201 }
202 
NetLogQuicWindowUpdateFrameParams(const quic::QuicWindowUpdateFrame & frame)203 base::Value::Dict NetLogQuicWindowUpdateFrameParams(
204     const quic::QuicWindowUpdateFrame& frame) {
205   return base::Value::Dict()
206       .Set("stream_id", static_cast<int>(frame.stream_id))
207       .Set("byte_offset", NetLogNumberValue(frame.max_data));
208 }
209 
NetLogQuicBlockedFrameParams(const quic::QuicBlockedFrame & frame)210 base::Value::Dict NetLogQuicBlockedFrameParams(
211     const quic::QuicBlockedFrame& frame) {
212   return base::Value::Dict().Set("stream_id",
213                                  static_cast<int>(frame.stream_id));
214 }
215 
NetLogQuicGoAwayFrameParams(const quic::QuicGoAwayFrame * frame)216 base::Value::Dict NetLogQuicGoAwayFrameParams(
217     const quic::QuicGoAwayFrame* frame) {
218   return base::Value::Dict()
219       .Set("quic_error", static_cast<int>(frame->error_code))
220       .Set("last_good_stream_id", static_cast<int>(frame->last_good_stream_id))
221       .Set("reason_phrase", frame->reason_phrase);
222 }
223 
NetLogQuicStopWaitingFrameParams(const quic::QuicStopWaitingFrame * frame)224 base::Value::Dict NetLogQuicStopWaitingFrameParams(
225     const quic::QuicStopWaitingFrame* frame) {
226   return base::Value::Dict().Set(
227       "least_unacked", NetLogNumberValue(frame->least_unacked.ToUint64()));
228 }
229 
NetLogQuicVersionNegotiationPacketParams(const quic::QuicVersionNegotiationPacket * packet)230 base::Value::Dict NetLogQuicVersionNegotiationPacketParams(
231     const quic::QuicVersionNegotiationPacket* packet) {
232   base::Value::List versions;
233   for (const auto& version : packet->versions) {
234     versions.Append(ParsedQuicVersionToString(version));
235   }
236   return base::Value::Dict().Set("versions", std::move(versions));
237 }
238 
NetLogQuicPathData(const quic::QuicPathFrameBuffer & buffer)239 base::Value::Dict NetLogQuicPathData(const quic::QuicPathFrameBuffer& buffer) {
240   return base::Value::Dict().Set("data", NetLogBinaryValue(buffer));
241 }
242 
NetLogQuicCryptoHandshakeMessageParams(const quic::CryptoHandshakeMessage * message)243 base::Value::Dict NetLogQuicCryptoHandshakeMessageParams(
244     const quic::CryptoHandshakeMessage* message) {
245   return base::Value::Dict().Set("quic_crypto_handshake_message",
246                                  message->DebugString());
247 }
248 
NetLogQuicTransportParametersParams(const quic::TransportParameters & transport_parameters)249 base::Value::Dict NetLogQuicTransportParametersParams(
250     const quic::TransportParameters& transport_parameters) {
251   return base::Value::Dict().Set("quic_transport_parameters",
252                                  transport_parameters.ToString());
253 }
254 
NetLogQuicZeroRttRejectReason(int reason)255 base::Value::Dict NetLogQuicZeroRttRejectReason(int reason) {
256   base::Value::Dict dict;
257   const char* reason_detail = SSL_early_data_reason_string(
258       static_cast<ssl_early_data_reason_t>(reason));
259   if (reason_detail) {
260     dict.Set("reason", reason_detail);
261   } else {
262     dict.Set("reason", "Unknown reason " + base::NumberToString(reason));
263   }
264   return dict;
265 }
266 
NetLogQuicOnConnectionClosedParams(quic::QuicErrorCode error,std::string error_details,quic::ConnectionCloseSource source)267 base::Value::Dict NetLogQuicOnConnectionClosedParams(
268     quic::QuicErrorCode error,
269     std::string error_details,
270     quic::ConnectionCloseSource source) {
271   return base::Value::Dict()
272       .Set("quic_error", static_cast<int>(error))
273       .Set("details", error_details)
274       .Set("from_peer",
275            source == quic::ConnectionCloseSource::FROM_PEER ? true : false);
276 }
277 
NetLogQuicCertificateVerifiedParams(scoped_refptr<X509Certificate> cert)278 base::Value::Dict NetLogQuicCertificateVerifiedParams(
279     scoped_refptr<X509Certificate> cert) {
280   // Only the subjects are logged so that we can investigate connection pooling.
281   // More fields could be logged in the future.
282   std::vector<std::string> dns_names;
283   cert->GetSubjectAltName(&dns_names, nullptr);
284   base::Value::List subjects;
285   for (auto& dns_name : dns_names) {
286     subjects.Append(std::move(dns_name));
287   }
288   return base::Value::Dict().Set("subjects", std::move(subjects));
289 }
290 
NetLogQuicCryptoFrameParams(const quic::QuicCryptoFrame * frame,bool has_buffer)291 base::Value::Dict NetLogQuicCryptoFrameParams(
292     const quic::QuicCryptoFrame* frame,
293     bool has_buffer) {
294   auto dict =
295       base::Value::Dict()
296           .Set("encryption_level", quic::EncryptionLevelToString(frame->level))
297           .Set("data_length", frame->data_length)
298           .Set("offset", NetLogNumberValue(frame->offset));
299   if (has_buffer) {
300     dict.Set("bytes", NetLogBinaryValue(
301                           reinterpret_cast<const void*>(frame->data_buffer),
302                           frame->data_length));
303   }
304   return dict;
305 }
306 
NetLogQuicStopSendingFrameParams(const quic::QuicStopSendingFrame & frame)307 base::Value::Dict NetLogQuicStopSendingFrameParams(
308     const quic::QuicStopSendingFrame& frame) {
309   return base::Value::Dict()
310       .Set("stream_id", static_cast<int>(frame.stream_id))
311       .Set("quic_rst_stream_error", static_cast<int>(frame.error_code))
312       .Set("ietf_error_code", static_cast<int>(frame.ietf_error_code));
313 }
314 
NetLogQuicStreamsBlockedFrameParams(const quic::QuicStreamsBlockedFrame & frame)315 base::Value::Dict NetLogQuicStreamsBlockedFrameParams(
316     const quic::QuicStreamsBlockedFrame& frame) {
317   return base::Value::Dict()
318       .Set("stream_count", static_cast<int>(frame.stream_count))
319       .Set("is_unidirectional", frame.unidirectional);
320 }
321 
NetLogQuicMaxStreamsFrameParams(const quic::QuicMaxStreamsFrame & frame)322 base::Value::Dict NetLogQuicMaxStreamsFrameParams(
323     const quic::QuicMaxStreamsFrame& frame) {
324   return base::Value::Dict()
325       .Set("stream_count", static_cast<int>(frame.stream_count))
326       .Set("is_unidirectional", frame.unidirectional);
327 }
328 
NetLogQuicNewConnectionIdFrameParams(const quic::QuicNewConnectionIdFrame * frame)329 base::Value::Dict NetLogQuicNewConnectionIdFrameParams(
330     const quic::QuicNewConnectionIdFrame* frame) {
331   return base::Value::Dict()
332       .Set("connection_id", frame->connection_id.ToString())
333       .Set("sequence_number", NetLogNumberValue(frame->sequence_number))
334       .Set("retire_prior_to", NetLogNumberValue(frame->retire_prior_to));
335 }
336 
NetLogQuicRetireConnectionIdFrameParams(const quic::QuicRetireConnectionIdFrame * frame)337 base::Value::Dict NetLogQuicRetireConnectionIdFrameParams(
338     const quic::QuicRetireConnectionIdFrame* frame) {
339   return base::Value::Dict().Set("sequence_number",
340                                  NetLogNumberValue(frame->sequence_number));
341 }
342 
NetLogQuicNewTokenFrameParams(const quic::QuicNewTokenFrame * frame)343 base::Value::Dict NetLogQuicNewTokenFrameParams(
344     const quic::QuicNewTokenFrame* frame) {
345   return base::Value::Dict().Set(
346       "token",
347       NetLogBinaryValue(reinterpret_cast<const void*>(frame->token.data()),
348                         frame->token.length()));
349 }
350 
351 }  // namespace
352 
QuicEventLogger(quic::QuicSession * session,const NetLogWithSource & net_log)353 QuicEventLogger::QuicEventLogger(quic::QuicSession* session,
354                                  const NetLogWithSource& net_log)
355     : session_(session), net_log_(net_log) {}
356 
OnFrameAddedToPacket(const quic::QuicFrame & frame)357 void QuicEventLogger::OnFrameAddedToPacket(const quic::QuicFrame& frame) {
358   if (!net_log_.IsCapturing())
359     return;
360   switch (frame.type) {
361     case quic::PADDING_FRAME:
362       net_log_.AddEventWithIntParams(
363           NetLogEventType::QUIC_SESSION_PADDING_FRAME_SENT, "num_padding_bytes",
364           frame.padding_frame.num_padding_bytes);
365       break;
366     case quic::STREAM_FRAME:
367       net_log_.AddEvent(NetLogEventType::QUIC_SESSION_STREAM_FRAME_SENT, [&] {
368         return NetLogQuicStreamFrameParams(frame.stream_frame);
369       });
370       break;
371     case quic::ACK_FRAME: {
372       net_log_.AddEvent(NetLogEventType::QUIC_SESSION_ACK_FRAME_SENT, [&] {
373         return NetLogQuicAckFrameParams(frame.ack_frame);
374       });
375       break;
376     }
377     case quic::RST_STREAM_FRAME:
378       net_log_.AddEvent(
379           NetLogEventType::QUIC_SESSION_RST_STREAM_FRAME_SENT, [&] {
380             return NetLogQuicRstStreamFrameParams(frame.rst_stream_frame);
381           });
382       break;
383     case quic::CONNECTION_CLOSE_FRAME:
384       net_log_.AddEvent(
385           NetLogEventType::QUIC_SESSION_CONNECTION_CLOSE_FRAME_SENT, [&] {
386             return NetLogQuicConnectionCloseFrameParams(
387                 frame.connection_close_frame);
388           });
389       break;
390     case quic::GOAWAY_FRAME:
391       net_log_.AddEvent(NetLogEventType::QUIC_SESSION_GOAWAY_FRAME_SENT, [&] {
392         return NetLogQuicGoAwayFrameParams(frame.goaway_frame);
393       });
394       break;
395     case quic::WINDOW_UPDATE_FRAME:
396       net_log_.AddEvent(
397           NetLogEventType::QUIC_SESSION_WINDOW_UPDATE_FRAME_SENT, [&] {
398             return NetLogQuicWindowUpdateFrameParams(frame.window_update_frame);
399           });
400       break;
401     case quic::BLOCKED_FRAME:
402       net_log_.AddEvent(NetLogEventType::QUIC_SESSION_BLOCKED_FRAME_SENT, [&] {
403         return NetLogQuicBlockedFrameParams(frame.blocked_frame);
404       });
405       break;
406     case quic::STOP_WAITING_FRAME:
407       net_log_.AddEvent(
408           NetLogEventType::QUIC_SESSION_STOP_WAITING_FRAME_SENT, [&] {
409             return NetLogQuicStopWaitingFrameParams(&frame.stop_waiting_frame);
410           });
411       break;
412     case quic::PING_FRAME:
413       // PingFrame has no contents to log, so just record that it was sent.
414       net_log_.AddEvent(NetLogEventType::QUIC_SESSION_PING_FRAME_SENT);
415       break;
416     case quic::MTU_DISCOVERY_FRAME:
417       // MtuDiscoveryFrame is PingFrame on wire, it does not have any payload.
418       net_log_.AddEvent(NetLogEventType::QUIC_SESSION_MTU_DISCOVERY_FRAME_SENT);
419       break;
420     case quic::NEW_CONNECTION_ID_FRAME:
421       net_log_.AddEvent(
422           NetLogEventType::QUIC_SESSION_NEW_CONNECTION_ID_FRAME_SENT, [&] {
423             return NetLogQuicNewConnectionIdFrameParams(
424                 frame.new_connection_id_frame);
425           });
426       break;
427     case quic::MAX_STREAMS_FRAME:
428       net_log_.AddEvent(
429           NetLogEventType::QUIC_SESSION_MAX_STREAMS_FRAME_SENT, [&] {
430             return NetLogQuicMaxStreamsFrameParams(frame.max_streams_frame);
431           });
432       break;
433     case quic::STREAMS_BLOCKED_FRAME:
434       net_log_.AddEvent(
435           NetLogEventType::QUIC_SESSION_STREAMS_BLOCKED_FRAME_SENT, [&] {
436             return NetLogQuicStreamsBlockedFrameParams(
437                 frame.streams_blocked_frame);
438           });
439       break;
440     case quic::PATH_RESPONSE_FRAME:
441       net_log_.AddEvent(
442           NetLogEventType::QUIC_SESSION_PATH_RESPONSE_FRAME_SENT, [&] {
443             return NetLogQuicPathData(frame.path_response_frame.data_buffer);
444           });
445       break;
446     case quic::PATH_CHALLENGE_FRAME:
447       net_log_.AddEvent(
448           NetLogEventType::QUIC_SESSION_PATH_CHALLENGE_FRAME_SENT, [&] {
449             return NetLogQuicPathData(frame.path_challenge_frame.data_buffer);
450           });
451       break;
452     case quic::STOP_SENDING_FRAME:
453       net_log_.AddEvent(
454           NetLogEventType::QUIC_SESSION_STOP_SENDING_FRAME_SENT, [&] {
455             return NetLogQuicStopSendingFrameParams(frame.stop_sending_frame);
456           });
457       break;
458     case quic::MESSAGE_FRAME:
459       net_log_.AddEventWithIntParams(
460           NetLogEventType::QUIC_SESSION_MESSAGE_FRAME_SENT, "message_length",
461           frame.message_frame->message_length);
462       break;
463     case quic::CRYPTO_FRAME:
464       net_log_.AddEvent(NetLogEventType::QUIC_SESSION_CRYPTO_FRAME_SENT, [&] {
465         return NetLogQuicCryptoFrameParams(frame.crypto_frame,
466                                            /*has_buffer = */ false);
467       });
468       break;
469     case quic::NEW_TOKEN_FRAME:
470       net_log_.AddEvent(
471           NetLogEventType::QUIC_SESSION_NEW_TOKEN_FRAME_SENT,
472           [&] { return NetLogQuicNewTokenFrameParams(frame.new_token_frame); });
473       break;
474     case quic::RETIRE_CONNECTION_ID_FRAME:
475       net_log_.AddEvent(
476           NetLogEventType::QUIC_SESSION_RETIRE_CONNECTION_ID_FRAME_SENT, [&] {
477             return NetLogQuicRetireConnectionIdFrameParams(
478                 frame.retire_connection_id_frame);
479           });
480       break;
481     default:
482       DCHECK(false) << "Illegal frame type: " << frame.type;
483   }
484 }
485 
OnStreamFrameCoalesced(const quic::QuicStreamFrame & frame)486 void QuicEventLogger::OnStreamFrameCoalesced(
487     const quic::QuicStreamFrame& frame) {
488   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_STREAM_FRAME_COALESCED,
489                     [&] { return NetLogQuicStreamFrameParams(frame); });
490 }
491 
OnPacketSent(quic::QuicPacketNumber packet_number,quic::QuicPacketLength packet_length,bool,quic::TransmissionType transmission_type,quic::EncryptionLevel encryption_level,const quic::QuicFrames &,const quic::QuicFrames &,quic::QuicTime sent_time,uint32_t batch_id)492 void QuicEventLogger::OnPacketSent(
493     quic::QuicPacketNumber packet_number,
494     quic::QuicPacketLength packet_length,
495     bool /*has_crypto_handshake*/,
496     quic::TransmissionType transmission_type,
497     quic::EncryptionLevel encryption_level,
498     const quic::QuicFrames& /*retransmittable_frames*/,
499     const quic::QuicFrames& /*nonretransmittable_frames*/,
500     quic::QuicTime sent_time,
501     uint32_t batch_id) {
502   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_PACKET_SENT, [&] {
503     return NetLogQuicPacketSentParams(packet_number, packet_length,
504                                       transmission_type, encryption_level,
505                                       sent_time, batch_id);
506   });
507 }
508 
OnIncomingAck(quic::QuicPacketNumber ack_packet_number,quic::EncryptionLevel,const quic::QuicAckFrame & frame,quic::QuicTime ack_receive_time,quic::QuicPacketNumber largest_observed,bool rtt_updated,quic::QuicPacketNumber least_unacked_sent_packet)509 void QuicEventLogger::OnIncomingAck(
510     quic::QuicPacketNumber ack_packet_number,
511     quic::EncryptionLevel /*ack_decrypted_level*/,
512     const quic::QuicAckFrame& frame,
513     quic::QuicTime ack_receive_time,
514     quic::QuicPacketNumber largest_observed,
515     bool rtt_updated,
516     quic::QuicPacketNumber least_unacked_sent_packet) {
517   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_ACK_FRAME_RECEIVED,
518                     [&] { return NetLogQuicAckFrameParams(&frame); });
519 }
520 
OnPacketLoss(quic::QuicPacketNumber lost_packet_number,quic::EncryptionLevel,quic::TransmissionType transmission_type,quic::QuicTime detection_time)521 void QuicEventLogger::OnPacketLoss(quic::QuicPacketNumber lost_packet_number,
522                                    quic::EncryptionLevel /*encryption_level*/,
523                                    quic::TransmissionType transmission_type,
524                                    quic::QuicTime detection_time) {
525   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_PACKET_LOST, [&] {
526     return NetLogQuicPacketLostParams(lost_packet_number, transmission_type,
527                                       detection_time);
528   });
529 }
530 
OnConfigProcessed(const quic::QuicSentPacketManager::DebugDelegate::SendParameters & parameters)531 void QuicEventLogger::OnConfigProcessed(
532     const quic::QuicSentPacketManager::DebugDelegate::SendParameters&
533         parameters) {
534   net_log_.AddEvent(NetLogEventType::QUIC_CONGESTION_CONTROL_CONFIGURED,
535                     [&] { return NetLogQuicConfigProcessed(parameters); });
536 }
537 
OnPacketReceived(const quic::QuicSocketAddress & self_address,const quic::QuicSocketAddress & peer_address,const quic::QuicEncryptedPacket & packet)538 void QuicEventLogger::OnPacketReceived(
539     const quic::QuicSocketAddress& self_address,
540     const quic::QuicSocketAddress& peer_address,
541     const quic::QuicEncryptedPacket& packet) {
542   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_PACKET_RECEIVED, [&] {
543     return NetLogQuicPacketParams(self_address, peer_address, packet.length());
544   });
545 }
546 
OnUnauthenticatedHeader(const quic::QuicPacketHeader & header)547 void QuicEventLogger::OnUnauthenticatedHeader(
548     const quic::QuicPacketHeader& header) {
549   net_log_.AddEvent(
550       NetLogEventType::QUIC_SESSION_UNAUTHENTICATED_PACKET_HEADER_RECEIVED,
551       [&] {
552         return NetLogReceivedQuicPacketHeaderParams(
553             header, session_->version(),
554             session_->connection()->connection_id(),
555             session_->connection()->client_connection_id());
556       });
557 }
558 
OnUndecryptablePacket(quic::EncryptionLevel decryption_level,bool dropped)559 void QuicEventLogger::OnUndecryptablePacket(
560     quic::EncryptionLevel decryption_level,
561     bool dropped) {
562   if (dropped) {
563     net_log_.AddEventWithStringParams(
564         NetLogEventType::QUIC_SESSION_DROPPED_UNDECRYPTABLE_PACKET,
565         "encryption_level", quic::EncryptionLevelToString(decryption_level));
566     return;
567   }
568   net_log_.AddEventWithStringParams(
569       NetLogEventType::QUIC_SESSION_BUFFERED_UNDECRYPTABLE_PACKET,
570       "encryption_level", quic::EncryptionLevelToString(decryption_level));
571 }
572 
OnAttemptingToProcessUndecryptablePacket(quic::EncryptionLevel decryption_level)573 void QuicEventLogger::OnAttemptingToProcessUndecryptablePacket(
574     quic::EncryptionLevel decryption_level) {
575   net_log_.AddEventWithStringParams(
576       NetLogEventType::QUIC_SESSION_ATTEMPTING_TO_PROCESS_UNDECRYPTABLE_PACKET,
577       "encryption_level", quic::EncryptionLevelToString(decryption_level));
578 }
579 
OnDuplicatePacket(quic::QuicPacketNumber packet_number)580 void QuicEventLogger::OnDuplicatePacket(quic::QuicPacketNumber packet_number) {
581   net_log_.AddEvent(
582       NetLogEventType::QUIC_SESSION_DUPLICATE_PACKET_RECEIVED,
583       [&] { return NetLogQuicDuplicatePacketParams(packet_number); });
584 }
585 
OnPacketHeader(const quic::QuicPacketHeader & header,quic::QuicTime,quic::EncryptionLevel)586 void QuicEventLogger::OnPacketHeader(const quic::QuicPacketHeader& header,
587                                      quic::QuicTime /*receive_time*/,
588                                      quic::EncryptionLevel /*level*/) {
589   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_PACKET_AUTHENTICATED);
590 }
591 
OnStreamFrame(const quic::QuicStreamFrame & frame)592 void QuicEventLogger::OnStreamFrame(const quic::QuicStreamFrame& frame) {
593   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_STREAM_FRAME_RECEIVED,
594                     [&] { return NetLogQuicStreamFrameParams(frame); });
595 }
596 
OnPathChallengeFrame(const quic::QuicPathChallengeFrame & frame)597 void QuicEventLogger::OnPathChallengeFrame(
598     const quic::QuicPathChallengeFrame& frame) {
599   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_PATH_CHALLENGE_FRAME_RECEIVED,
600                     [&] { return NetLogQuicPathData(frame.data_buffer); });
601 }
602 
OnPathResponseFrame(const quic::QuicPathResponseFrame & frame)603 void QuicEventLogger::OnPathResponseFrame(
604     const quic::QuicPathResponseFrame& frame) {
605   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_PATH_RESPONSE_FRAME_RECEIVED,
606                     [&] { return NetLogQuicPathData(frame.data_buffer); });
607 }
608 
OnCryptoFrame(const quic::QuicCryptoFrame & frame)609 void QuicEventLogger::OnCryptoFrame(const quic::QuicCryptoFrame& frame) {
610   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_CRYPTO_FRAME_RECEIVED, [&] {
611     return NetLogQuicCryptoFrameParams(&frame, /*has_buffer = */ true);
612   });
613 }
614 
OnStopSendingFrame(const quic::QuicStopSendingFrame & frame)615 void QuicEventLogger::OnStopSendingFrame(
616     const quic::QuicStopSendingFrame& frame) {
617   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_STOP_SENDING_FRAME_RECEIVED,
618                     [&] { return NetLogQuicStopSendingFrameParams(frame); });
619 }
620 
OnStreamsBlockedFrame(const quic::QuicStreamsBlockedFrame & frame)621 void QuicEventLogger::OnStreamsBlockedFrame(
622     const quic::QuicStreamsBlockedFrame& frame) {
623   net_log_.AddEvent(
624       NetLogEventType::QUIC_SESSION_STREAMS_BLOCKED_FRAME_RECEIVED,
625       [&] { return NetLogQuicStreamsBlockedFrameParams(frame); });
626 }
627 
OnMaxStreamsFrame(const quic::QuicMaxStreamsFrame & frame)628 void QuicEventLogger::OnMaxStreamsFrame(
629     const quic::QuicMaxStreamsFrame& frame) {
630   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_MAX_STREAMS_FRAME_RECEIVED,
631                     [&] { return NetLogQuicMaxStreamsFrameParams(frame); });
632 }
633 
OnRstStreamFrame(const quic::QuicRstStreamFrame & frame)634 void QuicEventLogger::OnRstStreamFrame(const quic::QuicRstStreamFrame& frame) {
635   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_RST_STREAM_FRAME_RECEIVED,
636                     [&] { return NetLogQuicRstStreamFrameParams(&frame); });
637 }
638 
OnConnectionCloseFrame(const quic::QuicConnectionCloseFrame & frame)639 void QuicEventLogger::OnConnectionCloseFrame(
640     const quic::QuicConnectionCloseFrame& frame) {
641   net_log_.AddEvent(
642       NetLogEventType::QUIC_SESSION_CONNECTION_CLOSE_FRAME_RECEIVED,
643       [&] { return NetLogQuicConnectionCloseFrameParams(&frame); });
644 }
645 
OnWindowUpdateFrame(const quic::QuicWindowUpdateFrame & frame,const quic::QuicTime & receive_time)646 void QuicEventLogger::OnWindowUpdateFrame(
647     const quic::QuicWindowUpdateFrame& frame,
648     const quic::QuicTime& receive_time) {
649   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_WINDOW_UPDATE_FRAME_RECEIVED,
650                     [&] { return NetLogQuicWindowUpdateFrameParams(frame); });
651 }
652 
OnBlockedFrame(const quic::QuicBlockedFrame & frame)653 void QuicEventLogger::OnBlockedFrame(const quic::QuicBlockedFrame& frame) {
654   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_BLOCKED_FRAME_RECEIVED,
655                     [&] { return NetLogQuicBlockedFrameParams(frame); });
656 }
657 
OnGoAwayFrame(const quic::QuicGoAwayFrame & frame)658 void QuicEventLogger::OnGoAwayFrame(const quic::QuicGoAwayFrame& frame) {
659   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_GOAWAY_FRAME_RECEIVED,
660                     [&] { return NetLogQuicGoAwayFrameParams(&frame); });
661 }
662 
OnPingFrame(const quic::QuicPingFrame & frame,quic::QuicTime::Delta)663 void QuicEventLogger::OnPingFrame(
664     const quic::QuicPingFrame& frame,
665     quic::QuicTime::Delta /*ping_received_delay*/) {
666   // PingFrame has no contents to log, so just record that it was received.
667   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_PING_FRAME_RECEIVED);
668 }
669 
OnPaddingFrame(const quic::QuicPaddingFrame & frame)670 void QuicEventLogger::OnPaddingFrame(const quic::QuicPaddingFrame& frame) {
671   net_log_.AddEventWithIntParams(
672       NetLogEventType::QUIC_SESSION_PADDING_FRAME_RECEIVED, "num_padding_bytes",
673       frame.num_padding_bytes);
674 }
675 
OnNewConnectionIdFrame(const quic::QuicNewConnectionIdFrame & frame)676 void QuicEventLogger::OnNewConnectionIdFrame(
677     const quic::QuicNewConnectionIdFrame& frame) {
678   net_log_.AddEvent(
679       NetLogEventType::QUIC_SESSION_NEW_CONNECTION_ID_FRAME_RECEIVED,
680       [&] { return NetLogQuicNewConnectionIdFrameParams(&frame); });
681 }
682 
OnNewTokenFrame(const quic::QuicNewTokenFrame & frame)683 void QuicEventLogger::OnNewTokenFrame(const quic::QuicNewTokenFrame& frame) {
684   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_NEW_TOKEN_FRAME_RECEIVED,
685                     [&] { return NetLogQuicNewTokenFrameParams(&frame); });
686 }
687 
OnRetireConnectionIdFrame(const quic::QuicRetireConnectionIdFrame & frame)688 void QuicEventLogger::OnRetireConnectionIdFrame(
689     const quic::QuicRetireConnectionIdFrame& frame) {
690   net_log_.AddEvent(
691       NetLogEventType::QUIC_SESSION_RETIRE_CONNECTION_ID_FRAME_RECEIVED,
692       [&] { return NetLogQuicRetireConnectionIdFrameParams(&frame); });
693 }
694 
OnMessageFrame(const quic::QuicMessageFrame & frame)695 void QuicEventLogger::OnMessageFrame(const quic::QuicMessageFrame& frame) {
696   net_log_.AddEventWithIntParams(
697       NetLogEventType::QUIC_SESSION_MESSAGE_FRAME_RECEIVED, "message_length",
698       frame.message_length);
699 }
700 
OnHandshakeDoneFrame(const quic::QuicHandshakeDoneFrame & frame)701 void QuicEventLogger::OnHandshakeDoneFrame(
702     const quic::QuicHandshakeDoneFrame& frame) {
703   net_log_.AddEvent(
704       NetLogEventType::QUIC_SESSION_HANDSHAKE_DONE_FRAME_RECEIVED);
705 }
706 
OnCoalescedPacketSent(const quic::QuicCoalescedPacket & coalesced_packet,size_t length)707 void QuicEventLogger::OnCoalescedPacketSent(
708     const quic::QuicCoalescedPacket& coalesced_packet,
709     size_t length) {
710   net_log_.AddEventWithStringParams(
711       NetLogEventType::QUIC_SESSION_COALESCED_PACKET_SENT, "info",
712       coalesced_packet.ToString(length));
713 }
714 
OnVersionNegotiationPacket(const quic::QuicVersionNegotiationPacket & packet)715 void QuicEventLogger::OnVersionNegotiationPacket(
716     const quic::QuicVersionNegotiationPacket& packet) {
717   net_log_.AddEvent(
718       NetLogEventType::QUIC_SESSION_VERSION_NEGOTIATION_PACKET_RECEIVED,
719       [&] { return NetLogQuicVersionNegotiationPacketParams(&packet); });
720 }
721 
OnCryptoHandshakeMessageReceived(const quic::CryptoHandshakeMessage & message)722 void QuicEventLogger::OnCryptoHandshakeMessageReceived(
723     const quic::CryptoHandshakeMessage& message) {
724   if (message.tag() == quic::kSHLO) {
725     std::string_view address;
726     quic::QuicSocketAddressCoder decoder;
727     if (message.GetStringPiece(quic::kCADR, &address) &&
728         decoder.Decode(address.data(), address.size())) {
729       local_address_from_shlo_ =
730           IPEndPoint(ToIPAddress(decoder.ip()), decoder.port());
731     }
732   }
733 
734   net_log_.AddEvent(
735       NetLogEventType::QUIC_SESSION_CRYPTO_HANDSHAKE_MESSAGE_RECEIVED,
736       [&] { return NetLogQuicCryptoHandshakeMessageParams(&message); });
737 }
738 
OnCryptoHandshakeMessageSent(const quic::CryptoHandshakeMessage & message)739 void QuicEventLogger::OnCryptoHandshakeMessageSent(
740     const quic::CryptoHandshakeMessage& message) {
741   net_log_.AddEvent(
742       NetLogEventType::QUIC_SESSION_CRYPTO_HANDSHAKE_MESSAGE_SENT,
743       [&] { return NetLogQuicCryptoHandshakeMessageParams(&message); });
744 }
745 
OnConnectionClosed(const quic::QuicConnectionCloseFrame & frame,quic::ConnectionCloseSource source)746 void QuicEventLogger::OnConnectionClosed(
747     const quic::QuicConnectionCloseFrame& frame,
748     quic::ConnectionCloseSource source) {
749   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_CLOSED, [&] {
750     return NetLogQuicOnConnectionClosedParams(frame.quic_error_code,
751                                               frame.error_details, source);
752   });
753 }
754 
OnSuccessfulVersionNegotiation(const quic::ParsedQuicVersion & version)755 void QuicEventLogger::OnSuccessfulVersionNegotiation(
756     const quic::ParsedQuicVersion& version) {
757   if (!net_log_.IsCapturing())
758     return;
759   std::string quic_version = quic::ParsedQuicVersionToString(version);
760   net_log_.AddEventWithStringParams(
761       NetLogEventType::QUIC_SESSION_VERSION_NEGOTIATED, "version",
762       quic_version);
763 }
764 
OnCertificateVerified(const CertVerifyResult & result)765 void QuicEventLogger::OnCertificateVerified(const CertVerifyResult& result) {
766   if (result.cert_status == CERT_STATUS_INVALID) {
767     net_log_.AddEvent(NetLogEventType::QUIC_SESSION_CERTIFICATE_VERIFY_FAILED);
768     return;
769   }
770   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_CERTIFICATE_VERIFIED, [&] {
771     return NetLogQuicCertificateVerifiedParams(result.verified_cert);
772   });
773 }
774 
OnTransportParametersSent(const quic::TransportParameters & transport_parameters)775 void QuicEventLogger::OnTransportParametersSent(
776     const quic::TransportParameters& transport_parameters) {
777   net_log_.AddEvent(
778       NetLogEventType::QUIC_SESSION_TRANSPORT_PARAMETERS_SENT, [&] {
779         return NetLogQuicTransportParametersParams(transport_parameters);
780       });
781 }
782 
OnTransportParametersReceived(const quic::TransportParameters & transport_parameters)783 void QuicEventLogger::OnTransportParametersReceived(
784     const quic::TransportParameters& transport_parameters) {
785   net_log_.AddEvent(
786       NetLogEventType::QUIC_SESSION_TRANSPORT_PARAMETERS_RECEIVED, [&] {
787         return NetLogQuicTransportParametersParams(transport_parameters);
788       });
789 }
790 
OnTransportParametersResumed(const quic::TransportParameters & transport_parameters)791 void QuicEventLogger::OnTransportParametersResumed(
792     const quic::TransportParameters& transport_parameters) {
793   net_log_.AddEvent(
794       NetLogEventType::QUIC_SESSION_TRANSPORT_PARAMETERS_RESUMED, [&] {
795         return NetLogQuicTransportParametersParams(transport_parameters);
796       });
797 }
798 
OnZeroRttRejected(int reason)799 void QuicEventLogger::OnZeroRttRejected(int reason) {
800   net_log_.AddEvent(NetLogEventType::QUIC_SESSION_ZERO_RTT_REJECTED,
801                     [reason] { return NetLogQuicZeroRttRejectReason(reason); });
802 }
803 
OnEncryptedClientHelloSent(std::string_view client_hello)804 void QuicEventLogger::OnEncryptedClientHelloSent(
805     std::string_view client_hello) {
806   net_log_.AddEvent(NetLogEventType::SSL_ENCRYPTED_CLIENT_HELLO, [&] {
807     return base::Value::Dict().Set(
808         "bytes", NetLogBinaryValue(base::as_byte_span(client_hello)));
809   });
810 }
811 
812 }  // namespace net
813