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/reliable_quic_stream.h" | 5 #include "net/quic/reliable_quic_stream.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "net/quic/iovector.h" | 8 #include "net/quic/iovector.h" |
9 #include "net/quic/quic_flow_controller.h" | 9 #include "net/quic/quic_flow_controller.h" |
10 #include "net/quic/quic_session.h" | 10 #include "net/quic/quic_session.h" |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 id_(id), | 114 id_(id), |
115 session_(session), | 115 session_(session), |
116 stream_bytes_read_(0), | 116 stream_bytes_read_(0), |
117 stream_bytes_written_(0), | 117 stream_bytes_written_(0), |
118 stream_error_(QUIC_STREAM_NO_ERROR), | 118 stream_error_(QUIC_STREAM_NO_ERROR), |
119 connection_error_(QUIC_NO_ERROR), | 119 connection_error_(QUIC_NO_ERROR), |
120 read_side_closed_(false), | 120 read_side_closed_(false), |
121 write_side_closed_(false), | 121 write_side_closed_(false), |
122 fin_buffered_(false), | 122 fin_buffered_(false), |
123 fin_sent_(false), | 123 fin_sent_(false), |
| 124 fin_received_(false), |
124 rst_sent_(false), | 125 rst_sent_(false), |
| 126 rst_received_(false), |
125 is_server_(session_->is_server()), | 127 is_server_(session_->is_server()), |
126 flow_controller_( | 128 flow_controller_( |
127 session_->connection(), | 129 session_->connection(), |
128 id_, | 130 id_, |
129 is_server_, | 131 is_server_, |
130 session_->config()->HasReceivedInitialFlowControlWindowBytes() ? | 132 session_->config()->HasReceivedInitialFlowControlWindowBytes() ? |
131 session_->config()->ReceivedInitialFlowControlWindowBytes() : | 133 session_->config()->ReceivedInitialFlowControlWindowBytes() : |
132 kDefaultFlowControlSendWindow, | 134 kDefaultFlowControlSendWindow, |
133 session_->max_flow_control_receive_window_bytes(), | 135 session_->max_flow_control_receive_window_bytes(), |
134 session_->max_flow_control_receive_window_bytes()), | 136 session_->max_flow_control_receive_window_bytes()), |
135 connection_flow_controller_(session_->flow_controller()) { | 137 connection_flow_controller_(session_->flow_controller()) { |
136 } | 138 } |
137 | 139 |
138 ReliableQuicStream::~ReliableQuicStream() { | 140 ReliableQuicStream::~ReliableQuicStream() { |
139 } | 141 } |
140 | 142 |
141 bool ReliableQuicStream::OnStreamFrame(const QuicStreamFrame& frame) { | 143 bool ReliableQuicStream::OnStreamFrame(const QuicStreamFrame& frame) { |
142 if (read_side_closed_) { | 144 if (read_side_closed_) { |
143 DVLOG(1) << ENDPOINT << "Ignoring frame " << frame.stream_id; | 145 DVLOG(1) << ENDPOINT << "Ignoring frame " << frame.stream_id; |
144 // We don't want to be reading: blackhole the data. | 146 // We don't want to be reading: blackhole the data. |
145 return true; | 147 return true; |
146 } | 148 } |
147 | 149 |
148 if (frame.stream_id != id_) { | 150 if (frame.stream_id != id_) { |
149 LOG(ERROR) << "Error!"; | 151 LOG(ERROR) << "Error!"; |
150 return false; | 152 return false; |
151 } | 153 } |
152 | 154 |
| 155 if (frame.fin) { |
| 156 fin_received_ = true; |
| 157 } |
| 158 |
153 // This count include duplicate data received. | 159 // This count include duplicate data received. |
154 size_t frame_payload_size = frame.data.TotalBufferSize(); | 160 size_t frame_payload_size = frame.data.TotalBufferSize(); |
155 stream_bytes_read_ += frame_payload_size; | 161 stream_bytes_read_ += frame_payload_size; |
156 | 162 |
157 // Flow control is interested in tracking highest received offset. | 163 // Flow control is interested in tracking highest received offset. |
158 if (MaybeIncreaseHighestReceivedOffset(frame.offset + frame_payload_size)) { | 164 if (MaybeIncreaseHighestReceivedOffset(frame.offset + frame_payload_size)) { |
159 // As the highest received offset has changed, we should check to see if | 165 // As the highest received offset has changed, we should check to see if |
160 // this is a violation of flow control. | 166 // this is a violation of flow control. |
161 if (flow_controller_.FlowControlViolation() || | 167 if (flow_controller_.FlowControlViolation() || |
162 connection_flow_controller_->FlowControlViolation()) { | 168 connection_flow_controller_->FlowControlViolation()) { |
163 session_->connection()->SendConnectionClose( | 169 session_->connection()->SendConnectionClose( |
164 QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA); | 170 QUIC_FLOW_CONTROL_RECEIVED_TOO_MUCH_DATA); |
165 return false; | 171 return false; |
166 } | 172 } |
167 } | 173 } |
168 | 174 |
169 return sequencer_.OnStreamFrame(frame); | 175 return sequencer_.OnStreamFrame(frame); |
170 } | 176 } |
171 | 177 |
172 int ReliableQuicStream::num_frames_received() const { | 178 int ReliableQuicStream::num_frames_received() const { |
173 return sequencer_.num_frames_received(); | 179 return sequencer_.num_frames_received(); |
174 } | 180 } |
175 | 181 |
176 int ReliableQuicStream::num_duplicate_frames_received() const { | 182 int ReliableQuicStream::num_duplicate_frames_received() const { |
177 return sequencer_.num_duplicate_frames_received(); | 183 return sequencer_.num_duplicate_frames_received(); |
178 } | 184 } |
179 | 185 |
180 void ReliableQuicStream::OnStreamReset(const QuicRstStreamFrame& frame) { | 186 void ReliableQuicStream::OnStreamReset(const QuicRstStreamFrame& frame) { |
| 187 rst_received_ = true; |
181 MaybeIncreaseHighestReceivedOffset(frame.byte_offset); | 188 MaybeIncreaseHighestReceivedOffset(frame.byte_offset); |
182 | 189 |
183 stream_error_ = frame.error_code; | 190 stream_error_ = frame.error_code; |
184 CloseWriteSide(); | 191 CloseWriteSide(); |
185 CloseReadSide(); | 192 CloseReadSide(); |
186 } | 193 } |
187 | 194 |
188 void ReliableQuicStream::OnConnectionClosed(QuicErrorCode error, | 195 void ReliableQuicStream::OnConnectionClosed(QuicErrorCode error, |
189 bool from_peer) { | 196 bool from_peer) { |
190 if (read_side_closed_ && write_side_closed_) { | 197 if (read_side_closed_ && write_side_closed_) { |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
479 connection_flow_controller_->AddBytesConsumed(bytes); | 486 connection_flow_controller_->AddBytesConsumed(bytes); |
480 } | 487 } |
481 } | 488 } |
482 | 489 |
483 bool ReliableQuicStream::IsFlowControlBlocked() { | 490 bool ReliableQuicStream::IsFlowControlBlocked() { |
484 return flow_controller_.IsBlocked() || | 491 return flow_controller_.IsBlocked() || |
485 connection_flow_controller_->IsBlocked(); | 492 connection_flow_controller_->IsBlocked(); |
486 } | 493 } |
487 | 494 |
488 } // namespace net | 495 } // namespace net |
OLD | NEW |