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