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

Side by Side Diff: net/quic/core/quic_headers_stream.cc

Issue 2916033003: Landing Recent QUIC changes until 03:18 AM, May 28, UTC (Closed)
Patch Set: A few more EXPORTs. Created 3 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
« no previous file with comments | « net/quic/core/quic_headers_stream.h ('k') | net/quic/core/quic_headers_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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/core/quic_headers_stream.h" 5 #include "net/quic/core/quic_headers_stream.h"
6 6
7 #include "net/quic/core/quic_spdy_session.h" 7 #include "net/quic/core/quic_spdy_session.h"
8 #include "net/quic/platform/api/quic_flags.h" 8 #include "net/quic/platform/api/quic_flags.h"
9 9
10 namespace net { 10 namespace net {
11 11
12 QuicHeadersStream::CompressedHeaderInfo::CompressedHeaderInfo(
13 QuicStreamOffset headers_stream_offset,
14 QuicStreamOffset full_length,
15 QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener)
16 : headers_stream_offset(headers_stream_offset),
17 full_length(full_length),
18 unacked_length(full_length),
19 ack_listener(std::move(ack_listener)) {}
20
21 QuicHeadersStream::CompressedHeaderInfo::CompressedHeaderInfo(
22 const CompressedHeaderInfo& other) = default;
23
24 QuicHeadersStream::CompressedHeaderInfo::~CompressedHeaderInfo() {}
25
12 QuicHeadersStream::QuicHeadersStream(QuicSpdySession* session) 26 QuicHeadersStream::QuicHeadersStream(QuicSpdySession* session)
13 : QuicStream(kHeadersStreamId, session), spdy_session_(session) { 27 : QuicStream(kHeadersStreamId, session), spdy_session_(session) {
14 // The headers stream is exempt from connection level flow control. 28 // The headers stream is exempt from connection level flow control.
15 DisableConnectionFlowControlForThisStream(); 29 DisableConnectionFlowControlForThisStream();
16 } 30 }
17 31
18 QuicHeadersStream::~QuicHeadersStream() {} 32 QuicHeadersStream::~QuicHeadersStream() {}
19 33
20 void QuicHeadersStream::OnDataAvailable() { 34 void QuicHeadersStream::OnDataAvailable() {
21 char buffer[1024]; 35 char buffer[1024];
(...skipping 14 matching lines...) Expand all
36 MaybeReleaseSequencerBuffer(); 50 MaybeReleaseSequencerBuffer();
37 } 51 }
38 } 52 }
39 53
40 void QuicHeadersStream::MaybeReleaseSequencerBuffer() { 54 void QuicHeadersStream::MaybeReleaseSequencerBuffer() {
41 if (spdy_session_->ShouldReleaseHeadersStreamSequencerBuffer()) { 55 if (spdy_session_->ShouldReleaseHeadersStreamSequencerBuffer()) {
42 sequencer()->ReleaseBufferIfEmpty(); 56 sequencer()->ReleaseBufferIfEmpty();
43 } 57 }
44 } 58 }
45 59
60 QuicConsumedData QuicHeadersStream::WritevDataInner(
61 QuicIOVector iov,
62 QuicStreamOffset offset,
63 bool fin,
64 QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener) {
65 if (!session()->use_stream_notifier()) {
66 return QuicStream::WritevDataInner(iov, offset, fin,
67 std::move(ack_listener));
68 }
69 QuicConsumedData consumed =
70 QuicStream::WritevDataInner(iov, offset, fin, nullptr);
71 if (consumed.bytes_consumed == 0 || ack_listener == nullptr) {
72 // No need to update unacked_headers_ if no byte is consumed or there is no
73 // ack listener.
74 return consumed;
75 }
76
77 if (!unacked_headers_.empty() &&
78 (offset == unacked_headers_.back().headers_stream_offset +
79 unacked_headers_.back().full_length) &&
80 ack_listener == unacked_headers_.back().ack_listener) {
81 // Try to combine with latest inserted entry if they belong to the same
82 // header (i.e., having contiguous offset and the same ack listener).
83 unacked_headers_.back().full_length += consumed.bytes_consumed;
84 unacked_headers_.back().unacked_length += consumed.bytes_consumed;
85 } else {
86 unacked_headers_.push_back(CompressedHeaderInfo(
87 offset, consumed.bytes_consumed, std::move(ack_listener)));
88 }
89 return consumed;
90 }
91
92 void QuicHeadersStream::OnStreamFrameAcked(const QuicStreamFrame& frame,
93 QuicTime::Delta ack_delay_time) {
94 for (CompressedHeaderInfo& header : unacked_headers_) {
95 if (frame.offset < header.headers_stream_offset) {
96 // This header frame offset belongs to headers with smaller offset, stop
97 // processing.
98 break;
99 }
100
101 if (frame.offset >= header.headers_stream_offset + header.full_length) {
102 // This header frame belongs to headers with larger offset.
103 continue;
104 }
105
106 if (header.unacked_length < frame.data_length) {
107 // This header frame is out of range.
108 CloseConnectionWithDetails(QUIC_INTERNAL_ERROR,
109 "Unsent stream data is acked");
110 return;
111 }
112
113 header.unacked_length -= frame.data_length;
114
115 if (header.ack_listener != nullptr) {
116 header.ack_listener->OnPacketAcked(frame.data_length, ack_delay_time);
117 }
118 break;
119 }
120
121 // Remove headers which are fully acked. Please note, header frames can be
122 // acked out of order, but unacked_headers_ is cleaned up in order.
123 while (!unacked_headers_.empty() &&
124 unacked_headers_.front().unacked_length == 0) {
125 unacked_headers_.pop_front();
126 }
127 QuicStream::OnStreamFrameAcked(frame, ack_delay_time);
128 }
129
130 void QuicHeadersStream::OnStreamFrameRetransmitted(
131 const QuicStreamFrame& frame) {
132 for (CompressedHeaderInfo& header : unacked_headers_) {
133 if (frame.offset < header.headers_stream_offset) {
134 // This header frame offset belongs to headers with smaller offset, stop
135 // processing.
136 break;
137 }
138
139 if (frame.offset >= header.headers_stream_offset + header.full_length) {
140 // This header frame belongs to headers with larger offset.
141 continue;
142 }
143
144 if (header.ack_listener != nullptr) {
145 header.ack_listener->OnPacketRetransmitted(frame.data_length);
146 }
147 break;
148 }
149 }
150
46 } // namespace net 151 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/core/quic_headers_stream.h ('k') | net/quic/core/quic_headers_stream_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698