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