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