| // Copyright (c) 2018 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 QUICHE_QUIC_CORE_QUIC_TRACE_VISITOR_H_ |
| #define QUICHE_QUIC_CORE_QUIC_TRACE_VISITOR_H_ |
| |
| #include "quiche/quic/core/quic_connection.h" |
| #include "quiche/quic/core/quic_types.h" |
| #include "quic_trace/quic_trace.pb.h" |
| |
| namespace quic { |
| |
| // Records a QUIC trace protocol buffer for a QuicConnection. It's the |
| // responsibility of the user of this visitor to process or store the resulting |
| // trace, which can be accessed via trace(). |
| class QUICHE_NO_EXPORT QuicTraceVisitor : public QuicConnectionDebugVisitor { |
| public: |
| explicit QuicTraceVisitor(const QuicConnection* connection); |
| |
| void OnPacketSent(QuicPacketNumber packet_number, |
| QuicPacketLength packet_length, bool has_crypto_handshake, |
| TransmissionType transmission_type, |
| EncryptionLevel encryption_level, |
| const QuicFrames& retransmittable_frames, |
| const QuicFrames& nonretransmittable_frames, |
| QuicTime sent_time, uint32_t batch_id) override; |
| |
| void OnIncomingAck(QuicPacketNumber ack_packet_number, |
| EncryptionLevel ack_decrypted_level, |
| const QuicAckFrame& ack_frame, QuicTime ack_receive_time, |
| QuicPacketNumber largest_observed, bool rtt_updated, |
| QuicPacketNumber least_unacked_sent_packet) override; |
| |
| void OnPacketLoss(QuicPacketNumber lost_packet_number, |
| EncryptionLevel encryption_level, |
| TransmissionType transmission_type, |
| QuicTime detection_time) override; |
| |
| void OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame, |
| const QuicTime& receive_time) override; |
| |
| void OnSuccessfulVersionNegotiation( |
| const ParsedQuicVersion& version) override; |
| |
| void OnApplicationLimited() override; |
| |
| void OnAdjustNetworkParameters(QuicBandwidth bandwidth, QuicTime::Delta rtt, |
| QuicByteCount old_cwnd, |
| QuicByteCount new_cwnd) override; |
| |
| // Returns a mutable pointer to the trace. The trace is owned by the |
| // visitor, but can be moved using Swap() method after the connection is |
| // finished. |
| quic_trace::Trace* trace() { return &trace_; } |
| |
| private: |
| // Converts QuicTime into a microsecond delta w.r.t. the beginning of the |
| // connection. |
| uint64_t ConvertTimestampToRecordedFormat(QuicTime timestamp); |
| // Populates a quic_trace::Frame message from |frame|. |
| void PopulateFrameInfo(const QuicFrame& frame, |
| quic_trace::Frame* frame_record); |
| // Populates a quic_trace::TransportState message from the associated |
| // connection. |
| void PopulateTransportState(quic_trace::TransportState* state); |
| |
| quic_trace::Trace trace_; |
| const QuicConnection* connection_; |
| const QuicTime start_time_; |
| }; |
| |
| } // namespace quic |
| |
| #endif // QUICHE_QUIC_CORE_QUIC_TRACE_VISITOR_H_ |