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