|  | // 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_TOOLS_QUIC_TCP_LIKE_TRACE_CONVERTER_H_ | 
|  | #define QUICHE_QUIC_TOOLS_QUIC_TCP_LIKE_TRACE_CONVERTER_H_ | 
|  |  | 
|  | #include <vector> | 
|  |  | 
|  | #include "net/third_party/quiche/src/quic/core/frames/quic_stream_frame.h" | 
|  | #include "net/third_party/quiche/src/quic/core/quic_interval.h" | 
|  | #include "net/third_party/quiche/src/quic/core/quic_interval_set.h" | 
|  | #include "net/third_party/quiche/src/quic/core/quic_types.h" | 
|  | #include "net/third_party/quiche/src/quic/platform/api/quic_containers.h" | 
|  |  | 
|  | namespace quic { | 
|  |  | 
|  | // This converter converts sent QUIC frames to connection byte offset (just like | 
|  | // TCP byte sequence number). | 
|  | class QuicTcpLikeTraceConverter { | 
|  | public: | 
|  | // StreamOffsetSegment stores a stream offset range which has contiguous | 
|  | // connection offset. | 
|  | struct StreamOffsetSegment { | 
|  | StreamOffsetSegment(); | 
|  | StreamOffsetSegment(QuicStreamOffset stream_offset, | 
|  | uint64_t connection_offset, | 
|  | QuicByteCount data_length); | 
|  |  | 
|  | QuicInterval<QuicStreamOffset> stream_data; | 
|  | uint64_t connection_offset; | 
|  | }; | 
|  |  | 
|  | QuicTcpLikeTraceConverter(); | 
|  | QuicTcpLikeTraceConverter(const QuicTcpLikeTraceConverter& other) = delete; | 
|  | QuicTcpLikeTraceConverter(QuicTcpLikeTraceConverter&& other) = delete; | 
|  |  | 
|  | ~QuicTcpLikeTraceConverter() {} | 
|  |  | 
|  | // Called when a stream frame is sent. Returns the corresponding connection | 
|  | // offsets. | 
|  | QuicIntervalSet<uint64_t> OnStreamFrameSent(QuicStreamId stream_id, | 
|  | QuicStreamOffset offset, | 
|  | QuicByteCount data_length, | 
|  | bool fin); | 
|  |  | 
|  | // Called when a control frame is sent. Returns the corresponding connection | 
|  | // offsets. | 
|  | QuicInterval<uint64_t> OnControlFrameSent(QuicControlFrameId control_frame_id, | 
|  | QuicByteCount control_frame_length); | 
|  |  | 
|  | private: | 
|  | struct StreamInfo { | 
|  | StreamInfo(); | 
|  |  | 
|  | // Stores contiguous connection offset pieces. | 
|  | std::vector<StreamOffsetSegment> segments; | 
|  | // Indicates whether fin has been sent. | 
|  | bool fin; | 
|  | }; | 
|  |  | 
|  | QuicUnorderedMap<QuicStreamId, StreamInfo> streams_info_; | 
|  | QuicUnorderedMap<QuicControlFrameId, QuicInterval<uint64_t>> | 
|  | control_frames_info_; | 
|  |  | 
|  | QuicControlFrameId largest_observed_control_frame_id_; | 
|  |  | 
|  | uint64_t connection_offset_; | 
|  | }; | 
|  |  | 
|  | }  // namespace quic | 
|  |  | 
|  | #endif  // QUICHE_QUIC_TOOLS_QUIC_TCP_LIKE_TRACE_CONVERTER_H_ |