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