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