Index: net/quic/reliable_quic_stream.cc |
diff --git a/net/quic/reliable_quic_stream.cc b/net/quic/reliable_quic_stream.cc |
index aefdb4126be6e4bd19b1344a6f0505229a75b7c5..64d8aaef67d949dd10cdf480835c0e64b428364d 100644 |
--- a/net/quic/reliable_quic_stream.cc |
+++ b/net/quic/reliable_quic_stream.cc |
@@ -151,7 +151,11 @@ bool ReliableQuicStream::OnStreamFrame(const QuicStreamFrame& frame) { |
} |
// This count include duplicate data received. |
- stream_bytes_read_ += frame.data.TotalBufferSize(); |
+ size_t frame_payload_size = frame.data.TotalBufferSize(); |
+ stream_bytes_read_ += frame_payload_size; |
+ |
+ // Flow control is interested in tracking highest received offset. |
+ MaybeIncreaseHighestReceivedOffset(frame.offset + frame_payload_size); |
bool accepted = sequencer_.OnStreamFrame(frame); |
@@ -160,16 +164,10 @@ bool ReliableQuicStream::OnStreamFrame(const QuicStreamFrame& frame) { |
session_->connection()->SendConnectionClose(QUIC_FLOW_CONTROL_ERROR); |
return false; |
} |
- MaybeSendWindowUpdate(); |
return accepted; |
} |
-void ReliableQuicStream::MaybeSendWindowUpdate() { |
- flow_controller_.MaybeSendWindowUpdate(session()->connection()); |
- connection_flow_controller_->MaybeSendWindowUpdate(session()->connection()); |
-} |
- |
int ReliableQuicStream::num_frames_received() const { |
return sequencer_.num_frames_received(); |
} |
@@ -179,6 +177,8 @@ int ReliableQuicStream::num_duplicate_frames_received() const { |
} |
void ReliableQuicStream::OnStreamReset(const QuicRstStreamFrame& frame) { |
+ MaybeIncreaseHighestReceivedOffset(frame.byte_offset); |
+ |
stream_error_ = frame.error_code; |
CloseWriteSide(); |
CloseReadSide(); |
@@ -436,17 +436,18 @@ void ReliableQuicStream::OnWindowUpdateFrame( |
} |
} |
-void ReliableQuicStream::AddBytesBuffered(uint64 bytes) { |
- if (flow_controller_.IsEnabled()) { |
- flow_controller_.AddBytesBuffered(bytes); |
- connection_flow_controller_->AddBytesBuffered(bytes); |
- } |
-} |
- |
-void ReliableQuicStream::RemoveBytesBuffered(uint64 bytes) { |
+void ReliableQuicStream::MaybeIncreaseHighestReceivedOffset(uint64 new_offset) { |
if (flow_controller_.IsEnabled()) { |
- flow_controller_.RemoveBytesBuffered(bytes); |
- connection_flow_controller_->RemoveBytesBuffered(bytes); |
+ uint64 increment = |
+ new_offset - flow_controller_.highest_received_byte_offset(); |
+ if (flow_controller_.UpdateHighestReceivedOffset(new_offset)) { |
+ // If |new_offset| increased the stream flow controller's highest received |
+ // offset, then we need to increase the connection flow controller's value |
+ // by the incremental difference. |
+ connection_flow_controller_->UpdateHighestReceivedOffset( |
+ connection_flow_controller_->highest_received_byte_offset() + |
+ increment); |
+ } |
} |
} |
@@ -460,7 +461,10 @@ void ReliableQuicStream::AddBytesSent(uint64 bytes) { |
void ReliableQuicStream::AddBytesConsumed(uint64 bytes) { |
if (flow_controller_.IsEnabled()) { |
flow_controller_.AddBytesConsumed(bytes); |
+ flow_controller_.MaybeSendWindowUpdate(session()->connection()); |
+ |
connection_flow_controller_->AddBytesConsumed(bytes); |
+ connection_flow_controller_->MaybeSendWindowUpdate(session()->connection()); |
} |
} |