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