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