OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/quic_stream_sequencer.h" | 5 #include "net/quic/quic_stream_sequencer.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
| 12 #include "net/quic/quic_clock.h" |
12 #include "net/quic/quic_frame_list.h" | 13 #include "net/quic/quic_frame_list.h" |
13 #include "net/quic/reliable_quic_stream.h" | 14 #include "net/quic/reliable_quic_stream.h" |
| 15 #include "net/quic/reliable_quic_stream.h" |
14 | 16 |
15 using std::min; | 17 using std::min; |
16 using std::numeric_limits; | 18 using std::numeric_limits; |
17 using std::string; | 19 using std::string; |
18 | 20 |
19 namespace net { | 21 namespace net { |
20 | 22 |
21 QuicStreamSequencer::QuicStreamSequencer(ReliableQuicStream* quic_stream) | 23 QuicStreamSequencer::QuicStreamSequencer(ReliableQuicStream* quic_stream, |
| 24 const QuicClock* clock) |
22 : stream_(quic_stream), | 25 : stream_(quic_stream), |
23 num_bytes_consumed_(0), | 26 num_bytes_consumed_(0), |
24 close_offset_(numeric_limits<QuicStreamOffset>::max()), | 27 close_offset_(numeric_limits<QuicStreamOffset>::max()), |
25 blocked_(false), | 28 blocked_(false), |
26 num_bytes_buffered_(0), | 29 num_bytes_buffered_(0), |
27 num_frames_received_(0), | 30 num_frames_received_(0), |
28 num_duplicate_frames_received_(0), | 31 num_duplicate_frames_received_(0), |
29 num_early_frames_received_(0) {} | 32 num_early_frames_received_(0), |
| 33 clock_(clock) {} |
30 | 34 |
31 QuicStreamSequencer::~QuicStreamSequencer() {} | 35 QuicStreamSequencer::~QuicStreamSequencer() {} |
32 | 36 |
33 void QuicStreamSequencer::OnStreamFrame(const QuicStreamFrame& frame) { | 37 void QuicStreamSequencer::OnStreamFrame(const QuicStreamFrame& frame) { |
34 ++num_frames_received_; | 38 ++num_frames_received_; |
35 const QuicStreamOffset byte_offset = frame.offset; | 39 const QuicStreamOffset byte_offset = frame.offset; |
36 const size_t data_len = frame.data.length(); | 40 const size_t data_len = frame.data.length(); |
37 if (data_len == 0 && !frame.fin) { | 41 if (data_len == 0 && !frame.fin) { |
38 // Stream frames must have data or a fin flag. | 42 // Stream frames must have data or a fin flag. |
39 stream_->CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, | 43 stream_->CloseConnectionWithDetails(QUIC_INVALID_STREAM_FRAME, |
40 "Empty stream frame without FIN set."); | 44 "Empty stream frame without FIN set."); |
41 return; | 45 return; |
42 } | 46 } |
43 | 47 |
44 if (frame.fin) { | 48 if (frame.fin) { |
45 CloseStreamAtOffset(frame.offset + data_len); | 49 CloseStreamAtOffset(frame.offset + data_len); |
46 if (data_len == 0) { | 50 if (data_len == 0) { |
47 return; | 51 return; |
48 } | 52 } |
49 } | 53 } |
50 size_t bytes_written; | 54 size_t bytes_written; |
51 QuicErrorCode result = | 55 QuicErrorCode result = buffered_frames_.WriteAtOffset( |
52 buffered_frames_.WriteAtOffset(byte_offset, frame.data, &bytes_written); | 56 byte_offset, frame.data, clock_->ApproximateNow(), &bytes_written); |
53 | 57 |
54 if (result == QUIC_INVALID_STREAM_DATA) { | 58 if (result == QUIC_INVALID_STREAM_DATA) { |
55 stream_->CloseConnectionWithDetails( | 59 stream_->CloseConnectionWithDetails( |
56 QUIC_INVALID_STREAM_FRAME, "Stream frame overlaps with buffered data."); | 60 QUIC_INVALID_STREAM_FRAME, "Stream frame overlaps with buffered data."); |
57 return; | 61 return; |
58 } | 62 } |
59 if (result == QUIC_NO_ERROR && bytes_written == 0) { | 63 if (result == QUIC_NO_ERROR && bytes_written == 0) { |
60 ++num_duplicate_frames_received_; | 64 ++num_duplicate_frames_received_; |
61 // Silently ignore duplicates. | 65 // Silently ignore duplicates. |
62 return; | 66 return; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 return true; | 108 return true; |
105 } | 109 } |
106 return false; | 110 return false; |
107 } | 111 } |
108 | 112 |
109 int QuicStreamSequencer::GetReadableRegions(iovec* iov, size_t iov_len) const { | 113 int QuicStreamSequencer::GetReadableRegions(iovec* iov, size_t iov_len) const { |
110 DCHECK(!blocked_); | 114 DCHECK(!blocked_); |
111 return buffered_frames_.GetReadableRegions(iov, iov_len); | 115 return buffered_frames_.GetReadableRegions(iov, iov_len); |
112 } | 116 } |
113 | 117 |
| 118 bool QuicStreamSequencer::GetReadableRegion(iovec* iov, |
| 119 QuicTime* timestamp) const { |
| 120 DCHECK(!blocked_); |
| 121 return buffered_frames_.GetReadableRegion(iov, timestamp); |
| 122 } |
| 123 |
114 int QuicStreamSequencer::Readv(const struct iovec* iov, size_t iov_len) { | 124 int QuicStreamSequencer::Readv(const struct iovec* iov, size_t iov_len) { |
115 DCHECK(!blocked_); | 125 DCHECK(!blocked_); |
116 size_t bytes_read = buffered_frames_.ReadvAndInvalidate(iov, iov_len); | 126 size_t bytes_read = buffered_frames_.ReadvAndInvalidate(iov, iov_len); |
117 RecordBytesConsumed(bytes_read); | 127 RecordBytesConsumed(bytes_read); |
118 return static_cast<int>(bytes_read); | 128 return static_cast<int>(bytes_read); |
119 } | 129 } |
120 | 130 |
121 bool QuicStreamSequencer::HasBytesToRead() const { | 131 bool QuicStreamSequencer::HasBytesToRead() const { |
122 return buffered_frames_.HasBytesToRead(); | 132 return buffered_frames_.HasBytesToRead(); |
123 } | 133 } |
(...skipping 28 matching lines...) Expand all Loading... |
152 } | 162 } |
153 | 163 |
154 void QuicStreamSequencer::RecordBytesConsumed(size_t bytes_consumed) { | 164 void QuicStreamSequencer::RecordBytesConsumed(size_t bytes_consumed) { |
155 num_bytes_consumed_ += bytes_consumed; | 165 num_bytes_consumed_ += bytes_consumed; |
156 num_bytes_buffered_ -= bytes_consumed; | 166 num_bytes_buffered_ -= bytes_consumed; |
157 | 167 |
158 stream_->AddBytesConsumed(bytes_consumed); | 168 stream_->AddBytesConsumed(bytes_consumed); |
159 } | 169 } |
160 | 170 |
161 } // namespace net | 171 } // namespace net |
OLD | NEW |