xref: /aosp_15_r20/external/cronet/net/quic/quic_connection_logger.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef NET_QUIC_QUIC_CONNECTION_LOGGER_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_QUIC_QUIC_CONNECTION_LOGGER_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include <bitset>
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
13*6777b538SAndroid Build Coastguard Worker #include "net/base/ip_endpoint.h"
14*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/base/network_change_notifier.h"
16*6777b538SAndroid Build Coastguard Worker #include "net/cert/cert_verify_result.h"
17*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_with_source.h"
18*6777b538SAndroid Build Coastguard Worker #include "net/quic/quic_event_logger.h"
19*6777b538SAndroid Build Coastguard Worker #include "net/socket/socket_performance_watcher.h"
20*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_handshake_message.h"
21*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_session.h"
22*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/quic/core/quic_connection.h"
23*6777b538SAndroid Build Coastguard Worker #include "net/third_party/quiche/src/quiche/quic/core/quic_packets.h"
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker namespace net {
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker // Handles both NetLog support and UMA histograms for QUIC.
28*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE QuicConnectionLogger
29*6777b538SAndroid Build Coastguard Worker     : public quic::QuicConnectionDebugVisitor,
30*6777b538SAndroid Build Coastguard Worker       public quic::QuicPacketCreator::DebugDelegate {
31*6777b538SAndroid Build Coastguard Worker  public:
32*6777b538SAndroid Build Coastguard Worker   QuicConnectionLogger(
33*6777b538SAndroid Build Coastguard Worker       quic::QuicSession* session,
34*6777b538SAndroid Build Coastguard Worker       const char* const connection_description,
35*6777b538SAndroid Build Coastguard Worker       std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher,
36*6777b538SAndroid Build Coastguard Worker       const NetLogWithSource& net_log);
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker   QuicConnectionLogger(const QuicConnectionLogger&) = delete;
39*6777b538SAndroid Build Coastguard Worker   QuicConnectionLogger& operator=(const QuicConnectionLogger&) = delete;
40*6777b538SAndroid Build Coastguard Worker 
41*6777b538SAndroid Build Coastguard Worker   ~QuicConnectionLogger() override;
42*6777b538SAndroid Build Coastguard Worker 
43*6777b538SAndroid Build Coastguard Worker   // quic::QuicPacketCreator::DebugDelegateInterface
44*6777b538SAndroid Build Coastguard Worker   void OnFrameAddedToPacket(const quic::QuicFrame& frame) override;
45*6777b538SAndroid Build Coastguard Worker   void OnStreamFrameCoalesced(const quic::QuicStreamFrame& frame) override;
46*6777b538SAndroid Build Coastguard Worker 
47*6777b538SAndroid Build Coastguard Worker   // quic::QuicConnectionDebugVisitor Interface
48*6777b538SAndroid Build Coastguard Worker   void OnPacketSent(quic::QuicPacketNumber packet_number,
49*6777b538SAndroid Build Coastguard Worker                     quic::QuicPacketLength packet_length,
50*6777b538SAndroid Build Coastguard Worker                     bool has_crypto_handshake,
51*6777b538SAndroid Build Coastguard Worker                     quic::TransmissionType transmission_type,
52*6777b538SAndroid Build Coastguard Worker                     quic::EncryptionLevel encryption_level,
53*6777b538SAndroid Build Coastguard Worker                     const quic::QuicFrames& retransmittable_frames,
54*6777b538SAndroid Build Coastguard Worker                     const quic::QuicFrames& nonretransmittable_frames,
55*6777b538SAndroid Build Coastguard Worker                     quic::QuicTime sent_time,
56*6777b538SAndroid Build Coastguard Worker                     uint32_t batch_id) override;
57*6777b538SAndroid Build Coastguard Worker   void OnIncomingAck(quic::QuicPacketNumber ack_packet_number,
58*6777b538SAndroid Build Coastguard Worker                      quic::EncryptionLevel ack_decrypted_level,
59*6777b538SAndroid Build Coastguard Worker                      const quic::QuicAckFrame& frame,
60*6777b538SAndroid Build Coastguard Worker                      quic::QuicTime ack_receive_time,
61*6777b538SAndroid Build Coastguard Worker                      quic::QuicPacketNumber largest_observed,
62*6777b538SAndroid Build Coastguard Worker                      bool rtt_updated,
63*6777b538SAndroid Build Coastguard Worker                      quic::QuicPacketNumber least_unacked_sent_packet) override;
64*6777b538SAndroid Build Coastguard Worker   void OnPacketLoss(quic::QuicPacketNumber lost_packet_number,
65*6777b538SAndroid Build Coastguard Worker                     quic::EncryptionLevel encryption_level,
66*6777b538SAndroid Build Coastguard Worker                     quic::TransmissionType transmission_type,
67*6777b538SAndroid Build Coastguard Worker                     quic::QuicTime detection_time) override;
68*6777b538SAndroid Build Coastguard Worker   void OnConfigProcessed(const SendParameters& parameters) override;
69*6777b538SAndroid Build Coastguard Worker   void OnPingSent() override;
70*6777b538SAndroid Build Coastguard Worker   void OnPacketReceived(const quic::QuicSocketAddress& self_address,
71*6777b538SAndroid Build Coastguard Worker                         const quic::QuicSocketAddress& peer_address,
72*6777b538SAndroid Build Coastguard Worker                         const quic::QuicEncryptedPacket& packet) override;
73*6777b538SAndroid Build Coastguard Worker   void OnUnauthenticatedHeader(const quic::QuicPacketHeader& header) override;
74*6777b538SAndroid Build Coastguard Worker   void OnIncorrectConnectionId(quic::QuicConnectionId connection_id) override;
75*6777b538SAndroid Build Coastguard Worker   void OnUndecryptablePacket(quic::EncryptionLevel decryption_level,
76*6777b538SAndroid Build Coastguard Worker                              bool dropped) override;
77*6777b538SAndroid Build Coastguard Worker   void OnAttemptingToProcessUndecryptablePacket(
78*6777b538SAndroid Build Coastguard Worker       quic::EncryptionLevel decryption_level) override;
79*6777b538SAndroid Build Coastguard Worker   void OnDuplicatePacket(quic::QuicPacketNumber packet_number) override;
80*6777b538SAndroid Build Coastguard Worker   void OnProtocolVersionMismatch(quic::ParsedQuicVersion version) override;
81*6777b538SAndroid Build Coastguard Worker   void OnPacketHeader(const quic::QuicPacketHeader& header,
82*6777b538SAndroid Build Coastguard Worker                       quic::QuicTime receive_time,
83*6777b538SAndroid Build Coastguard Worker                       quic::EncryptionLevel level) override;
84*6777b538SAndroid Build Coastguard Worker   void OnPathChallengeFrame(const quic::QuicPathChallengeFrame& frame) override;
85*6777b538SAndroid Build Coastguard Worker   void OnPathResponseFrame(const quic::QuicPathResponseFrame& frame) override;
86*6777b538SAndroid Build Coastguard Worker   void OnCryptoFrame(const quic::QuicCryptoFrame& frame) override;
87*6777b538SAndroid Build Coastguard Worker   void OnStopSendingFrame(const quic::QuicStopSendingFrame& frame) override;
88*6777b538SAndroid Build Coastguard Worker   void OnStreamsBlockedFrame(
89*6777b538SAndroid Build Coastguard Worker       const quic::QuicStreamsBlockedFrame& frame) override;
90*6777b538SAndroid Build Coastguard Worker   void OnMaxStreamsFrame(const quic::QuicMaxStreamsFrame& frame) override;
91*6777b538SAndroid Build Coastguard Worker   void OnStreamFrame(const quic::QuicStreamFrame& frame) override;
92*6777b538SAndroid Build Coastguard Worker   void OnRstStreamFrame(const quic::QuicRstStreamFrame& frame) override;
93*6777b538SAndroid Build Coastguard Worker   void OnConnectionCloseFrame(
94*6777b538SAndroid Build Coastguard Worker       const quic::QuicConnectionCloseFrame& frame) override;
95*6777b538SAndroid Build Coastguard Worker   void OnWindowUpdateFrame(const quic::QuicWindowUpdateFrame& frame,
96*6777b538SAndroid Build Coastguard Worker                            const quic::QuicTime& receive_time) override;
97*6777b538SAndroid Build Coastguard Worker   void OnBlockedFrame(const quic::QuicBlockedFrame& frame) override;
98*6777b538SAndroid Build Coastguard Worker   void OnGoAwayFrame(const quic::QuicGoAwayFrame& frame) override;
99*6777b538SAndroid Build Coastguard Worker   void OnPingFrame(const quic::QuicPingFrame& frame,
100*6777b538SAndroid Build Coastguard Worker                    quic::QuicTime::Delta ping_received_delay) override;
101*6777b538SAndroid Build Coastguard Worker   void OnPaddingFrame(const quic::QuicPaddingFrame& frame) override;
102*6777b538SAndroid Build Coastguard Worker   void OnNewConnectionIdFrame(
103*6777b538SAndroid Build Coastguard Worker       const quic::QuicNewConnectionIdFrame& frame) override;
104*6777b538SAndroid Build Coastguard Worker   void OnNewTokenFrame(const quic::QuicNewTokenFrame& frame) override;
105*6777b538SAndroid Build Coastguard Worker   void OnRetireConnectionIdFrame(
106*6777b538SAndroid Build Coastguard Worker       const quic::QuicRetireConnectionIdFrame& frame) override;
107*6777b538SAndroid Build Coastguard Worker   void OnMessageFrame(const quic::QuicMessageFrame& frame) override;
108*6777b538SAndroid Build Coastguard Worker   void OnHandshakeDoneFrame(const quic::QuicHandshakeDoneFrame& frame) override;
109*6777b538SAndroid Build Coastguard Worker   void OnCoalescedPacketSent(const quic::QuicCoalescedPacket& coalesced_packet,
110*6777b538SAndroid Build Coastguard Worker                              size_t length) override;
111*6777b538SAndroid Build Coastguard Worker   void OnVersionNegotiationPacket(
112*6777b538SAndroid Build Coastguard Worker       const quic::QuicVersionNegotiationPacket& packet) override;
113*6777b538SAndroid Build Coastguard Worker   void OnConnectionClosed(const quic::QuicConnectionCloseFrame& frame,
114*6777b538SAndroid Build Coastguard Worker                           quic::ConnectionCloseSource source) override;
115*6777b538SAndroid Build Coastguard Worker   void OnSuccessfulVersionNegotiation(
116*6777b538SAndroid Build Coastguard Worker       const quic::ParsedQuicVersion& version) override;
117*6777b538SAndroid Build Coastguard Worker   void OnRttChanged(quic::QuicTime::Delta rtt) const override;
118*6777b538SAndroid Build Coastguard Worker   void OnTransportParametersSent(
119*6777b538SAndroid Build Coastguard Worker       const quic::TransportParameters& transport_parameters) override;
120*6777b538SAndroid Build Coastguard Worker   void OnTransportParametersReceived(
121*6777b538SAndroid Build Coastguard Worker       const quic::TransportParameters& transport_parameters) override;
122*6777b538SAndroid Build Coastguard Worker   void OnTransportParametersResumed(
123*6777b538SAndroid Build Coastguard Worker       const quic::TransportParameters& transport_parameters) override;
124*6777b538SAndroid Build Coastguard Worker   void OnZeroRttRejected(int reason) override;
125*6777b538SAndroid Build Coastguard Worker   void OnEncryptedClientHelloSent(std::string_view client_hello) override;
126*6777b538SAndroid Build Coastguard Worker 
127*6777b538SAndroid Build Coastguard Worker   void OnCryptoHandshakeMessageReceived(
128*6777b538SAndroid Build Coastguard Worker       const quic::CryptoHandshakeMessage& message);
129*6777b538SAndroid Build Coastguard Worker   void OnCryptoHandshakeMessageSent(
130*6777b538SAndroid Build Coastguard Worker       const quic::CryptoHandshakeMessage& message);
131*6777b538SAndroid Build Coastguard Worker   void UpdateReceivedFrameCounts(quic::QuicStreamId stream_id,
132*6777b538SAndroid Build Coastguard Worker                                  int num_frames_received,
133*6777b538SAndroid Build Coastguard Worker                                  int num_duplicate_frames_received);
134*6777b538SAndroid Build Coastguard Worker   void OnCertificateVerified(const CertVerifyResult& result);
135*6777b538SAndroid Build Coastguard Worker 
136*6777b538SAndroid Build Coastguard Worker   // Returns connection's overall packet loss rate in fraction.
137*6777b538SAndroid Build Coastguard Worker   float ReceivedPacketLossRate() const;
138*6777b538SAndroid Build Coastguard Worker 
139*6777b538SAndroid Build Coastguard Worker  private:
140*6777b538SAndroid Build Coastguard Worker   // For connections longer than 21 received packets, this call will calculate
141*6777b538SAndroid Build Coastguard Worker   // the overall packet loss rate, and record it into a histogram.
142*6777b538SAndroid Build Coastguard Worker   void RecordAggregatePacketLossRate() const;
143*6777b538SAndroid Build Coastguard Worker 
144*6777b538SAndroid Build Coastguard Worker   raw_ptr<quic::QuicSession> session_;  // Unowned.
145*6777b538SAndroid Build Coastguard Worker   // The last packet number received.
146*6777b538SAndroid Build Coastguard Worker   quic::QuicPacketNumber last_received_packet_number_;
147*6777b538SAndroid Build Coastguard Worker   // The size of the most recently received packet.
148*6777b538SAndroid Build Coastguard Worker   size_t last_received_packet_size_ = 0;
149*6777b538SAndroid Build Coastguard Worker   // True if a PING frame has been sent and no packet has been received.
150*6777b538SAndroid Build Coastguard Worker   bool no_packet_received_after_ping_ = false;
151*6777b538SAndroid Build Coastguard Worker   // The size of the previously received packet.
152*6777b538SAndroid Build Coastguard Worker   size_t previous_received_packet_size_ = 0;
153*6777b538SAndroid Build Coastguard Worker   // The first received packet number. Used as the left edge of
154*6777b538SAndroid Build Coastguard Worker   // received_packets_ and received_acks_. In the case where packets are
155*6777b538SAndroid Build Coastguard Worker   // received out of order, packets with numbers smaller than
156*6777b538SAndroid Build Coastguard Worker   // first_received_packet_number_ will not be logged.
157*6777b538SAndroid Build Coastguard Worker   quic::QuicPacketNumber first_received_packet_number_;
158*6777b538SAndroid Build Coastguard Worker   // The largest packet number received.  In the case where a packet is
159*6777b538SAndroid Build Coastguard Worker   // received late (out of order), this value will not be updated.
160*6777b538SAndroid Build Coastguard Worker   quic::QuicPacketNumber largest_received_packet_number_;
161*6777b538SAndroid Build Coastguard Worker   // Number of times that the current received packet number is
162*6777b538SAndroid Build Coastguard Worker   // smaller than the last received packet number.
163*6777b538SAndroid Build Coastguard Worker   size_t num_out_of_order_received_packets_ = 0;
164*6777b538SAndroid Build Coastguard Worker   // Number of times that the current received packet number is
165*6777b538SAndroid Build Coastguard Worker   // smaller than the last received packet number and where the
166*6777b538SAndroid Build Coastguard Worker   // size of the current packet is larger than the size of the previous
167*6777b538SAndroid Build Coastguard Worker   // packet.
168*6777b538SAndroid Build Coastguard Worker   size_t num_out_of_order_large_received_packets_ = 0;
169*6777b538SAndroid Build Coastguard Worker   // The number of times that OnPacketHeader was called.
170*6777b538SAndroid Build Coastguard Worker   // If the network replicates packets, then this number may be slightly
171*6777b538SAndroid Build Coastguard Worker   // different from the real number of distinct packets received.
172*6777b538SAndroid Build Coastguard Worker   quic::QuicPacketCount num_packets_received_ = 0;
173*6777b538SAndroid Build Coastguard Worker   // The quic::kCADR value provided by the server in ServerHello.
174*6777b538SAndroid Build Coastguard Worker   IPEndPoint local_address_from_shlo_;
175*6777b538SAndroid Build Coastguard Worker   // The first local address from which a packet was received.
176*6777b538SAndroid Build Coastguard Worker   IPEndPoint local_address_from_self_;
177*6777b538SAndroid Build Coastguard Worker   // Count of the number of frames received.
178*6777b538SAndroid Build Coastguard Worker   int num_frames_received_ = 0;
179*6777b538SAndroid Build Coastguard Worker   // Count of the number of duplicate frames received.
180*6777b538SAndroid Build Coastguard Worker   int num_duplicate_frames_received_ = 0;
181*6777b538SAndroid Build Coastguard Worker   // Count of the number of packets received with incorrect connection IDs.
182*6777b538SAndroid Build Coastguard Worker   int num_incorrect_connection_ids_ = 0;
183*6777b538SAndroid Build Coastguard Worker   // Count of the number of undecryptable packets received.
184*6777b538SAndroid Build Coastguard Worker   int num_undecryptable_packets_ = 0;
185*6777b538SAndroid Build Coastguard Worker   // Count of the number of duplicate packets received.
186*6777b538SAndroid Build Coastguard Worker   int num_duplicate_packets_ = 0;
187*6777b538SAndroid Build Coastguard Worker   // Count of the number of BLOCKED frames received.
188*6777b538SAndroid Build Coastguard Worker   int num_blocked_frames_received_ = 0;
189*6777b538SAndroid Build Coastguard Worker   // Count of the number of BLOCKED frames sent.
190*6777b538SAndroid Build Coastguard Worker   int num_blocked_frames_sent_ = 0;
191*6777b538SAndroid Build Coastguard Worker   // Vector of initial packets status' indexed by packet numbers, where
192*6777b538SAndroid Build Coastguard Worker   // false means never received. We track 150 packets starting from
193*6777b538SAndroid Build Coastguard Worker   // first_received_packet_number_.
194*6777b538SAndroid Build Coastguard Worker   std::bitset<150> received_packets_;
195*6777b538SAndroid Build Coastguard Worker   // Vector to indicate which of the initial 150 received packets turned out to
196*6777b538SAndroid Build Coastguard Worker   // contain solo ACK frames.  An element is true iff an ACK frame was in the
197*6777b538SAndroid Build Coastguard Worker   // corresponding packet, and there was very little else.
198*6777b538SAndroid Build Coastguard Worker   std::bitset<150> received_acks_;
199*6777b538SAndroid Build Coastguard Worker   // The available type of connection (WiFi, 3G, etc.) when connection was first
200*6777b538SAndroid Build Coastguard Worker   // used.
201*6777b538SAndroid Build Coastguard Worker   const char* const connection_description_;
202*6777b538SAndroid Build Coastguard Worker   // Receives notifications regarding the performance of the underlying socket
203*6777b538SAndroid Build Coastguard Worker   // for the QUIC connection. May be null.
204*6777b538SAndroid Build Coastguard Worker   const std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher_;
205*6777b538SAndroid Build Coastguard Worker 
206*6777b538SAndroid Build Coastguard Worker   QuicEventLogger event_logger_;
207*6777b538SAndroid Build Coastguard Worker };
208*6777b538SAndroid Build Coastguard Worker 
209*6777b538SAndroid Build Coastguard Worker }  // namespace net
210*6777b538SAndroid Build Coastguard Worker 
211*6777b538SAndroid Build Coastguard Worker #endif  // NET_QUIC_QUIC_CONNECTION_LOGGER_H_
212