Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(539)

Side by Side Diff: net/quic/reliable_quic_stream.cc

Issue 312553003: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/reliable_quic_stream.h ('k') | net/quic/reliable_quic_stream_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 // We don't want to be reading: blackhole the data. 144 // We don't want to be reading: blackhole the data.
145 return true; 145 return true;
146 } 146 }
147 147
148 if (frame.stream_id != id_) { 148 if (frame.stream_id != id_) {
149 LOG(ERROR) << "Error!"; 149 LOG(ERROR) << "Error!";
150 return false; 150 return false;
151 } 151 }
152 152
153 // This count include duplicate data received. 153 // This count include duplicate data received.
154 stream_bytes_read_ += frame.data.TotalBufferSize(); 154 size_t frame_payload_size = frame.data.TotalBufferSize();
155 stream_bytes_read_ += frame_payload_size;
156
157 // Flow control is interested in tracking highest received offset.
158 MaybeIncreaseHighestReceivedOffset(frame.offset + frame_payload_size);
155 159
156 bool accepted = sequencer_.OnStreamFrame(frame); 160 bool accepted = sequencer_.OnStreamFrame(frame);
157 161
158 if (flow_controller_.FlowControlViolation() || 162 if (flow_controller_.FlowControlViolation() ||
159 connection_flow_controller_->FlowControlViolation()) { 163 connection_flow_controller_->FlowControlViolation()) {
160 session_->connection()->SendConnectionClose(QUIC_FLOW_CONTROL_ERROR); 164 session_->connection()->SendConnectionClose(QUIC_FLOW_CONTROL_ERROR);
161 return false; 165 return false;
162 } 166 }
163 MaybeSendWindowUpdate();
164 167
165 return accepted; 168 return accepted;
166 } 169 }
167 170
168 void ReliableQuicStream::MaybeSendWindowUpdate() {
169 flow_controller_.MaybeSendWindowUpdate(session()->connection());
170 connection_flow_controller_->MaybeSendWindowUpdate(session()->connection());
171 }
172
173 int ReliableQuicStream::num_frames_received() const { 171 int ReliableQuicStream::num_frames_received() const {
174 return sequencer_.num_frames_received(); 172 return sequencer_.num_frames_received();
175 } 173 }
176 174
177 int ReliableQuicStream::num_duplicate_frames_received() const { 175 int ReliableQuicStream::num_duplicate_frames_received() const {
178 return sequencer_.num_duplicate_frames_received(); 176 return sequencer_.num_duplicate_frames_received();
179 } 177 }
180 178
181 void ReliableQuicStream::OnStreamReset(const QuicRstStreamFrame& frame) { 179 void ReliableQuicStream::OnStreamReset(const QuicRstStreamFrame& frame) {
180 MaybeIncreaseHighestReceivedOffset(frame.byte_offset);
181
182 stream_error_ = frame.error_code; 182 stream_error_ = frame.error_code;
183 CloseWriteSide(); 183 CloseWriteSide();
184 CloseReadSide(); 184 CloseReadSide();
185 } 185 }
186 186
187 void ReliableQuicStream::OnConnectionClosed(QuicErrorCode error, 187 void ReliableQuicStream::OnConnectionClosed(QuicErrorCode error,
188 bool from_peer) { 188 bool from_peer) {
189 if (read_side_closed_ && write_side_closed_) { 189 if (read_side_closed_ && write_side_closed_) {
190 return; 190 return;
191 } 191 }
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 if (flow_controller_.UpdateSendWindowOffset(frame.byte_offset)) { 429 if (flow_controller_.UpdateSendWindowOffset(frame.byte_offset)) {
430 // We can write again! 430 // We can write again!
431 // TODO(rjshade): This does not respect priorities (e.g. multiple 431 // TODO(rjshade): This does not respect priorities (e.g. multiple
432 // outstanding POSTs are unblocked on arrival of 432 // outstanding POSTs are unblocked on arrival of
433 // SHLO with initial window). 433 // SHLO with initial window).
434 // As long as the connection is not flow control blocked, we can write! 434 // As long as the connection is not flow control blocked, we can write!
435 OnCanWrite(); 435 OnCanWrite();
436 } 436 }
437 } 437 }
438 438
439 void ReliableQuicStream::AddBytesBuffered(uint64 bytes) { 439 void ReliableQuicStream::MaybeIncreaseHighestReceivedOffset(uint64 new_offset) {
440 if (flow_controller_.IsEnabled()) { 440 if (flow_controller_.IsEnabled()) {
441 flow_controller_.AddBytesBuffered(bytes); 441 uint64 increment =
442 connection_flow_controller_->AddBytesBuffered(bytes); 442 new_offset - flow_controller_.highest_received_byte_offset();
443 if (flow_controller_.UpdateHighestReceivedOffset(new_offset)) {
444 // If |new_offset| increased the stream flow controller's highest received
445 // offset, then we need to increase the connection flow controller's value
446 // by the incremental difference.
447 connection_flow_controller_->UpdateHighestReceivedOffset(
448 connection_flow_controller_->highest_received_byte_offset() +
449 increment);
450 }
443 } 451 }
444 } 452 }
445 453
446 void ReliableQuicStream::RemoveBytesBuffered(uint64 bytes) {
447 if (flow_controller_.IsEnabled()) {
448 flow_controller_.RemoveBytesBuffered(bytes);
449 connection_flow_controller_->RemoveBytesBuffered(bytes);
450 }
451 }
452
453 void ReliableQuicStream::AddBytesSent(uint64 bytes) { 454 void ReliableQuicStream::AddBytesSent(uint64 bytes) {
454 if (flow_controller_.IsEnabled()) { 455 if (flow_controller_.IsEnabled()) {
455 flow_controller_.AddBytesSent(bytes); 456 flow_controller_.AddBytesSent(bytes);
456 connection_flow_controller_->AddBytesSent(bytes); 457 connection_flow_controller_->AddBytesSent(bytes);
457 } 458 }
458 } 459 }
459 460
460 void ReliableQuicStream::AddBytesConsumed(uint64 bytes) { 461 void ReliableQuicStream::AddBytesConsumed(uint64 bytes) {
461 if (flow_controller_.IsEnabled()) { 462 if (flow_controller_.IsEnabled()) {
462 flow_controller_.AddBytesConsumed(bytes); 463 flow_controller_.AddBytesConsumed(bytes);
464 flow_controller_.MaybeSendWindowUpdate(session()->connection());
465
463 connection_flow_controller_->AddBytesConsumed(bytes); 466 connection_flow_controller_->AddBytesConsumed(bytes);
467 connection_flow_controller_->MaybeSendWindowUpdate(session()->connection());
464 } 468 }
465 } 469 }
466 470
467 bool ReliableQuicStream::IsFlowControlBlocked() { 471 bool ReliableQuicStream::IsFlowControlBlocked() {
468 return flow_controller_.IsBlocked() || 472 return flow_controller_.IsBlocked() ||
469 connection_flow_controller_->IsBlocked(); 473 connection_flow_controller_->IsBlocked();
470 } 474 }
471 475
472 } // namespace net 476 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/reliable_quic_stream.h ('k') | net/quic/reliable_quic_stream_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698