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