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