|  | // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef NET_QUIC_QUIC_CONNECTION_LOGGER_H_ | 
|  | #define NET_QUIC_QUIC_CONNECTION_LOGGER_H_ | 
|  |  | 
|  | #include <bitset> | 
|  | #include <string> | 
|  |  | 
|  | #include "base/macros.h" | 
|  | #include "base/timer/timer.h" | 
|  | #include "net/base/net_export.h" | 
|  | #include "net/base/network_change_notifier.h" | 
|  | #include "net/cert/cert_verify_result.h" | 
|  | #include "net/log/net_log_with_source.h" | 
|  | #include "net/socket/socket_performance_watcher.h" | 
|  | #include "net/third_party/quic/core/crypto/crypto_handshake_message.h" | 
|  | #include "net/third_party/quic/core/http/quic_spdy_session.h" | 
|  | #include "net/third_party/quic/core/quic_connection.h" | 
|  | #include "net/third_party/quic/core/quic_packets.h" | 
|  | #include "starboard/types.h" | 
|  |  | 
|  | namespace base { | 
|  | class HistogramBase; | 
|  | } | 
|  |  | 
|  | namespace net { | 
|  |  | 
|  | // This class is a debug visitor of a quic::QuicConnection which logs | 
|  | // events to |net_log|. | 
|  | class NET_EXPORT_PRIVATE QuicConnectionLogger | 
|  | : public quic::QuicConnectionDebugVisitor, | 
|  | public quic::QuicPacketCreator::DebugDelegate { | 
|  | public: | 
|  | QuicConnectionLogger( | 
|  | quic::QuicSpdySession* session, | 
|  | const char* const connection_description, | 
|  | std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher, | 
|  | const NetLogWithSource& net_log); | 
|  |  | 
|  | ~QuicConnectionLogger() override; | 
|  |  | 
|  | // quic::QuicPacketCreator::DebugDelegateInterface | 
|  | void OnFrameAddedToPacket(const quic::QuicFrame& frame) override; | 
|  |  | 
|  | // QuicConnectionDebugVisitorInterface | 
|  | void OnPacketSent(const quic::SerializedPacket& serialized_packet, | 
|  | quic::QuicPacketNumber original_packet_number, | 
|  | quic::TransmissionType transmission_type, | 
|  | quic::QuicTime sent_time) override; | 
|  | void OnIncomingAck(const quic::QuicAckFrame& frame, | 
|  | quic::QuicTime ack_receive_time, | 
|  | quic::QuicPacketNumber largest_observed, | 
|  | bool rtt_updated, | 
|  | quic::QuicPacketNumber least_unacked_sent_packet) override; | 
|  | void OnPacketLoss(quic::QuicPacketNumber lost_packet_number, | 
|  | quic::TransmissionType transmission_type, | 
|  | quic::QuicTime detection_time) override; | 
|  | void OnPingSent() override; | 
|  | void OnPacketReceived(const quic::QuicSocketAddress& self_address, | 
|  | const quic::QuicSocketAddress& peer_address, | 
|  | const quic::QuicEncryptedPacket& packet) override; | 
|  | void OnUnauthenticatedHeader(const quic::QuicPacketHeader& header) override; | 
|  | void OnIncorrectConnectionId(quic::QuicConnectionId connection_id) override; | 
|  | void OnUndecryptablePacket() override; | 
|  | void OnDuplicatePacket(quic::QuicPacketNumber packet_number) override; | 
|  | void OnProtocolVersionMismatch(quic::ParsedQuicVersion version) override; | 
|  | void OnPacketHeader(const quic::QuicPacketHeader& header) override; | 
|  | void OnStreamFrame(const quic::QuicStreamFrame& frame) override; | 
|  | void OnStopWaitingFrame(const quic::QuicStopWaitingFrame& frame) override; | 
|  | void OnRstStreamFrame(const quic::QuicRstStreamFrame& frame) override; | 
|  | void OnConnectionCloseFrame( | 
|  | const quic::QuicConnectionCloseFrame& frame) override; | 
|  | void OnWindowUpdateFrame(const quic::QuicWindowUpdateFrame& frame, | 
|  | const quic::QuicTime& receive_time) override; | 
|  | void OnBlockedFrame(const quic::QuicBlockedFrame& frame) override; | 
|  | void OnGoAwayFrame(const quic::QuicGoAwayFrame& frame) override; | 
|  | void OnPingFrame(const quic::QuicPingFrame& frame) override; | 
|  | void OnPublicResetPacket(const quic::QuicPublicResetPacket& packet) override; | 
|  | void OnVersionNegotiationPacket( | 
|  | const quic::QuicVersionNegotiationPacket& packet) override; | 
|  | void OnConnectionClosed(quic::QuicErrorCode error, | 
|  | const std::string& error_details, | 
|  | quic::ConnectionCloseSource source) override; | 
|  | void OnSuccessfulVersionNegotiation( | 
|  | const quic::ParsedQuicVersion& version) override; | 
|  | void OnRttChanged(quic::QuicTime::Delta rtt) const override; | 
|  |  | 
|  | void OnCryptoHandshakeMessageReceived( | 
|  | const quic::CryptoHandshakeMessage& message); | 
|  | void OnCryptoHandshakeMessageSent( | 
|  | const quic::CryptoHandshakeMessage& message); | 
|  | void UpdateReceivedFrameCounts(quic::QuicStreamId stream_id, | 
|  | int num_frames_received, | 
|  | int num_duplicate_frames_received); | 
|  | void OnCertificateVerified(const CertVerifyResult& result); | 
|  |  | 
|  | // Returns connection's overall packet loss rate in fraction. | 
|  | float ReceivedPacketLossRate() const; | 
|  |  | 
|  | private: | 
|  | // Do a factory get for a histogram to record a 6-packet loss-sequence as a | 
|  | // sample. The histogram will record the 64 distinct possible combinations. | 
|  | // |which_6| is used to adjust the name of the histogram to distinguish the | 
|  | // first 6 packets in a connection, vs. some later 6 packets. | 
|  | base::HistogramBase* Get6PacketHistogram(const char* which_6) const; | 
|  | // For connections longer than 21 received packets, this call will calculate | 
|  | // the overall packet loss rate, and record it into a histogram. | 
|  | void RecordAggregatePacketLossRate() const; | 
|  |  | 
|  | void UpdateIsCapturing(); | 
|  |  | 
|  | NetLogWithSource net_log_; | 
|  | quic::QuicSpdySession* session_;  // Unowned. | 
|  | // The last packet number received. | 
|  | quic::QuicPacketNumber last_received_packet_number_; | 
|  | // The size of the most recently received packet. | 
|  | size_t last_received_packet_size_; | 
|  | // True if a PING frame has been sent and no packet has been received. | 
|  | bool no_packet_received_after_ping_; | 
|  | // The size of the previously received packet. | 
|  | size_t previous_received_packet_size_; | 
|  | // The first received packet number. Used as the left edge of | 
|  | // received_packets_ and received_acks_. In the case where packets are | 
|  | // received out of order, packets with numbers smaller than | 
|  | // first_received_packet_number_ will not be logged. | 
|  | quic::QuicPacketNumber first_received_packet_number_; | 
|  | // The largest packet number received.  In the case where a packet is | 
|  | // received late (out of order), this value will not be updated. | 
|  | quic::QuicPacketNumber largest_received_packet_number_; | 
|  | // Number of times that the current received packet number is | 
|  | // smaller than the last received packet number. | 
|  | size_t num_out_of_order_received_packets_; | 
|  | // Number of times that the current received packet number is | 
|  | // smaller than the last received packet number and where the | 
|  | // size of the current packet is larger than the size of the previous | 
|  | // packet. | 
|  | size_t num_out_of_order_large_received_packets_; | 
|  | // The number of times that OnPacketHeader was called. | 
|  | // If the network replicates packets, then this number may be slightly | 
|  | // different from the real number of distinct packets received. | 
|  | quic::QuicPacketCount num_packets_received_; | 
|  | // The quic::kCADR value provided by the server in ServerHello. | 
|  | IPEndPoint local_address_from_shlo_; | 
|  | // The first local address from which a packet was received. | 
|  | IPEndPoint local_address_from_self_; | 
|  | // Count of the number of frames received. | 
|  | int num_frames_received_; | 
|  | // Count of the number of duplicate frames received. | 
|  | int num_duplicate_frames_received_; | 
|  | // Count of the number of packets received with incorrect connection IDs. | 
|  | int num_incorrect_connection_ids_; | 
|  | // Count of the number of undecryptable packets received. | 
|  | int num_undecryptable_packets_; | 
|  | // Count of the number of duplicate packets received. | 
|  | int num_duplicate_packets_; | 
|  | // Count of the number of BLOCKED frames received. | 
|  | int num_blocked_frames_received_; | 
|  | // Count of the number of BLOCKED frames sent. | 
|  | int num_blocked_frames_sent_; | 
|  | // Vector of inital packets status' indexed by packet numbers, where | 
|  | // false means never received. We track 150 packets starting from | 
|  | // first_received_packet_number_. | 
|  | std::bitset<150> received_packets_; | 
|  | // Vector to indicate which of the initial 150 received packets turned out to | 
|  | // contain solo ACK frames.  An element is true iff an ACK frame was in the | 
|  | // corresponding packet, and there was very little else. | 
|  | std::bitset<150> received_acks_; | 
|  | // The available type of connection (WiFi, 3G, etc.) when connection was first | 
|  | // used. | 
|  | const char* const connection_description_; | 
|  | // Receives notifications regarding the performance of the underlying socket | 
|  | // for the QUIC connection. May be null. | 
|  | const std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher_; | 
|  | // Lower the overhead of checking whether logging is active, by | 
|  | // periodically polling and caching the result of net_log_.IsCapturing(). | 
|  | bool net_log_is_capturing_; | 
|  | base::RepeatingTimer timer_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(QuicConnectionLogger); | 
|  | }; | 
|  |  | 
|  | }  // namespace net | 
|  |  | 
|  | #endif  // NET_QUIC_QUIC_CONNECTION_LOGGER_H_ |