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

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

Issue 2545543003: Split up quic_frames.{h,cc} into files for each frame type. (Closed)
Patch Set: Created 4 years 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_frames.h ('k') | net/quic/core/quic_frames_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
(Empty)
1 // Copyright (c) 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/quic/core/quic_frames.h"
6
7 using base::StringPiece;
8 using std::ostream;
9 using std::string;
10
11 namespace net {
12
13 void StreamBufferDeleter::operator()(char* buffer) const {
14 if (allocator_ != nullptr && buffer != nullptr) {
15 allocator_->Delete(buffer);
16 }
17 }
18
19 UniqueStreamBuffer NewStreamBuffer(QuicBufferAllocator* allocator,
20 size_t size) {
21 return UniqueStreamBuffer(allocator->New(size),
22 StreamBufferDeleter(allocator));
23 }
24
25 QuicStreamFrame::QuicStreamFrame()
26 : QuicStreamFrame(0, false, 0, nullptr, 0, nullptr) {}
27
28 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id,
29 bool fin,
30 QuicStreamOffset offset,
31 StringPiece data)
32 : QuicStreamFrame(stream_id,
33 fin,
34 offset,
35 data.data(),
36 data.length(),
37 nullptr) {}
38
39 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id,
40 bool fin,
41 QuicStreamOffset offset,
42 QuicPacketLength data_length,
43 UniqueStreamBuffer buffer)
44 : QuicStreamFrame(stream_id,
45 fin,
46 offset,
47 nullptr,
48 data_length,
49 std::move(buffer)) {
50 DCHECK(this->buffer != nullptr);
51 DCHECK_EQ(data_buffer, this->buffer.get());
52 }
53
54 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id,
55 bool fin,
56 QuicStreamOffset offset,
57 const char* data_buffer,
58 QuicPacketLength data_length,
59 UniqueStreamBuffer buffer)
60 : stream_id(stream_id),
61 fin(fin),
62 data_length(data_length),
63 data_buffer(data_buffer),
64 offset(offset),
65 buffer(std::move(buffer)) {
66 if (this->buffer != nullptr) {
67 DCHECK(data_buffer == nullptr);
68 this->data_buffer = this->buffer.get();
69 }
70 }
71
72 QuicStreamFrame::~QuicStreamFrame() {}
73
74 bool IsAwaitingPacket(const QuicAckFrame& ack_frame,
75 QuicPacketNumber packet_number,
76 QuicPacketNumber peer_least_packet_awaiting_ack) {
77 return packet_number >= peer_least_packet_awaiting_ack &&
78 !ack_frame.packets.Contains(packet_number);
79 }
80
81 QuicStopWaitingFrame::QuicStopWaitingFrame()
82 : path_id(kDefaultPathId), least_unacked(0) {}
83
84 QuicStopWaitingFrame::~QuicStopWaitingFrame() {}
85
86 QuicAckFrame::QuicAckFrame()
87 : largest_observed(0),
88 ack_delay_time(QuicTime::Delta::Infinite()),
89 path_id(kDefaultPathId) {}
90
91 QuicAckFrame::QuicAckFrame(const QuicAckFrame& other) = default;
92
93 QuicAckFrame::~QuicAckFrame() {}
94
95 QuicRstStreamFrame::QuicRstStreamFrame()
96 : stream_id(0), error_code(QUIC_STREAM_NO_ERROR), byte_offset(0) {}
97
98 QuicRstStreamFrame::QuicRstStreamFrame(QuicStreamId stream_id,
99 QuicRstStreamErrorCode error_code,
100 QuicStreamOffset bytes_written)
101 : stream_id(stream_id),
102 error_code(error_code),
103 byte_offset(bytes_written) {}
104
105 QuicConnectionCloseFrame::QuicConnectionCloseFrame()
106 : error_code(QUIC_NO_ERROR) {}
107
108 QuicFrame::QuicFrame() {}
109
110 QuicFrame::QuicFrame(QuicPaddingFrame padding_frame)
111 : type(PADDING_FRAME), padding_frame(padding_frame) {}
112
113 QuicFrame::QuicFrame(QuicStreamFrame* stream_frame)
114 : type(STREAM_FRAME), stream_frame(stream_frame) {}
115
116 QuicFrame::QuicFrame(QuicAckFrame* frame) : type(ACK_FRAME), ack_frame(frame) {}
117
118 QuicFrame::QuicFrame(QuicMtuDiscoveryFrame frame)
119 : type(MTU_DISCOVERY_FRAME), mtu_discovery_frame(frame) {}
120
121 QuicFrame::QuicFrame(QuicStopWaitingFrame* frame)
122 : type(STOP_WAITING_FRAME), stop_waiting_frame(frame) {}
123
124 QuicFrame::QuicFrame(QuicPingFrame frame)
125 : type(PING_FRAME), ping_frame(frame) {}
126
127 QuicFrame::QuicFrame(QuicRstStreamFrame* frame)
128 : type(RST_STREAM_FRAME), rst_stream_frame(frame) {}
129
130 QuicFrame::QuicFrame(QuicConnectionCloseFrame* frame)
131 : type(CONNECTION_CLOSE_FRAME), connection_close_frame(frame) {}
132
133 QuicFrame::QuicFrame(QuicGoAwayFrame* frame)
134 : type(GOAWAY_FRAME), goaway_frame(frame) {}
135
136 QuicFrame::QuicFrame(QuicWindowUpdateFrame* frame)
137 : type(WINDOW_UPDATE_FRAME), window_update_frame(frame) {}
138
139 QuicFrame::QuicFrame(QuicBlockedFrame* frame)
140 : type(BLOCKED_FRAME), blocked_frame(frame) {}
141
142 QuicFrame::QuicFrame(QuicPathCloseFrame* frame)
143 : type(PATH_CLOSE_FRAME), path_close_frame(frame) {}
144
145 void DeleteFrames(QuicFrames* frames) {
146 for (QuicFrame& frame : *frames) {
147 switch (frame.type) {
148 // Frames smaller than a pointer are inlined, so don't need to be deleted.
149 case PADDING_FRAME:
150 case MTU_DISCOVERY_FRAME:
151 case PING_FRAME:
152 break;
153 case STREAM_FRAME:
154 delete frame.stream_frame;
155 break;
156 case ACK_FRAME:
157 delete frame.ack_frame;
158 break;
159 case STOP_WAITING_FRAME:
160 delete frame.stop_waiting_frame;
161 break;
162 case RST_STREAM_FRAME:
163 delete frame.rst_stream_frame;
164 break;
165 case CONNECTION_CLOSE_FRAME:
166 delete frame.connection_close_frame;
167 break;
168 case GOAWAY_FRAME:
169 delete frame.goaway_frame;
170 break;
171 case BLOCKED_FRAME:
172 delete frame.blocked_frame;
173 break;
174 case WINDOW_UPDATE_FRAME:
175 delete frame.window_update_frame;
176 break;
177 case PATH_CLOSE_FRAME:
178 delete frame.path_close_frame;
179 break;
180 case NUM_FRAME_TYPES:
181 DCHECK(false) << "Cannot delete type: " << frame.type;
182 }
183 }
184 frames->clear();
185 }
186
187 void RemoveFramesForStream(QuicFrames* frames, QuicStreamId stream_id) {
188 QuicFrames::iterator it = frames->begin();
189 while (it != frames->end()) {
190 if (it->type != STREAM_FRAME || it->stream_frame->stream_id != stream_id) {
191 ++it;
192 continue;
193 }
194 delete it->stream_frame;
195 it = frames->erase(it);
196 }
197 }
198
199 ostream& operator<<(ostream& os, const QuicStopWaitingFrame& sent_info) {
200 os << "{ least_unacked: " << sent_info.least_unacked << " }\n";
201 return os;
202 }
203
204 PacketNumberQueue::PacketNumberQueue() = default;
205 PacketNumberQueue::PacketNumberQueue(const PacketNumberQueue& other) = default;
206 PacketNumberQueue::PacketNumberQueue(PacketNumberQueue&& other) = default;
207 PacketNumberQueue::~PacketNumberQueue() {}
208
209 PacketNumberQueue& PacketNumberQueue::operator=(
210 const PacketNumberQueue& other) = default;
211 PacketNumberQueue& PacketNumberQueue::operator=(PacketNumberQueue&& other) =
212 default;
213
214 void PacketNumberQueue::Add(QuicPacketNumber packet_number) {
215 packet_number_intervals_.Add(packet_number, packet_number + 1);
216 }
217
218 void PacketNumberQueue::Add(QuicPacketNumber lower, QuicPacketNumber higher) {
219 packet_number_intervals_.Add(lower, higher);
220 }
221
222 void PacketNumberQueue::Remove(QuicPacketNumber packet_number) {
223 packet_number_intervals_.Difference(packet_number, packet_number + 1);
224 }
225
226 void PacketNumberQueue::Remove(QuicPacketNumber lower,
227 QuicPacketNumber higher) {
228 packet_number_intervals_.Difference(lower, higher);
229 }
230
231 bool PacketNumberQueue::RemoveUpTo(QuicPacketNumber higher) {
232 if (Empty()) {
233 return false;
234 }
235 const QuicPacketNumber old_min = Min();
236 packet_number_intervals_.Difference(0, higher);
237 return Empty() || old_min != Min();
238 }
239
240 void PacketNumberQueue::Complement() {
241 if (Empty()) {
242 return;
243 }
244 packet_number_intervals_.Complement(Min(), Max() + 1);
245 }
246
247 bool PacketNumberQueue::Contains(QuicPacketNumber packet_number) const {
248 return packet_number_intervals_.Contains(packet_number);
249 }
250
251 bool PacketNumberQueue::Empty() const {
252 return packet_number_intervals_.Empty();
253 }
254
255 QuicPacketNumber PacketNumberQueue::Min() const {
256 DCHECK(!Empty());
257 return packet_number_intervals_.begin()->min();
258 }
259
260 QuicPacketNumber PacketNumberQueue::Max() const {
261 DCHECK(!Empty());
262 return packet_number_intervals_.rbegin()->max() - 1;
263 }
264
265 size_t PacketNumberQueue::NumPacketsSlow() const {
266 size_t num_packets = 0;
267 for (const auto& interval : packet_number_intervals_) {
268 num_packets += interval.Length();
269 }
270 return num_packets;
271 }
272
273 size_t PacketNumberQueue::NumIntervals() const {
274 return packet_number_intervals_.Size();
275 }
276
277 QuicPacketNumber PacketNumberQueue::LastIntervalLength() const {
278 DCHECK(!Empty());
279 return packet_number_intervals_.rbegin()->Length();
280 }
281
282 PacketNumberQueue::const_iterator PacketNumberQueue::lower_bound(
283 QuicPacketNumber packet_number) const {
284 // lower_bound returns the first interval that contains |packet_number| or the
285 // first interval after |packet_number|.
286 auto itr = packet_number_intervals_.Find(packet_number);
287 if (itr != packet_number_intervals_.end()) {
288 return itr;
289 }
290 for (itr = packet_number_intervals_.begin();
291 itr != packet_number_intervals_.end(); ++itr) {
292 if (packet_number < itr->min()) {
293 return itr;
294 }
295 }
296 return packet_number_intervals_.end();
297 }
298
299 PacketNumberQueue::const_iterator PacketNumberQueue::begin() const {
300 return packet_number_intervals_.begin();
301 }
302
303 PacketNumberQueue::const_iterator PacketNumberQueue::end() const {
304 return packet_number_intervals_.end();
305 }
306
307 PacketNumberQueue::const_reverse_iterator PacketNumberQueue::rbegin() const {
308 return packet_number_intervals_.rbegin();
309 }
310
311 PacketNumberQueue::const_reverse_iterator PacketNumberQueue::rend() const {
312 return packet_number_intervals_.rend();
313 }
314
315 ostream& operator<<(ostream& os, const PacketNumberQueue& q) {
316 for (const Interval<QuicPacketNumber>& interval : q) {
317 for (QuicPacketNumber packet_number = interval.min();
318 packet_number < interval.max(); ++packet_number) {
319 os << packet_number << " ";
320 }
321 }
322 return os;
323 }
324
325 ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) {
326 os << "{ largest_observed: " << ack_frame.largest_observed
327 << ", ack_delay_time: " << ack_frame.ack_delay_time.ToMicroseconds()
328 << ", packets: [ " << ack_frame.packets << " ]"
329 << ", received_packets: [ ";
330 for (const std::pair<QuicPacketNumber, QuicTime>& p :
331 ack_frame.received_packet_times) {
332 os << p.first << " at " << p.second.ToDebuggingValue() << " ";
333 }
334 os << " ] }\n";
335 return os;
336 }
337
338 ostream& operator<<(ostream& os, const QuicFrame& frame) {
339 switch (frame.type) {
340 case PADDING_FRAME: {
341 os << "type { PADDING_FRAME } " << frame.padding_frame;
342 break;
343 }
344 case RST_STREAM_FRAME: {
345 os << "type { RST_STREAM_FRAME } " << *(frame.rst_stream_frame);
346 break;
347 }
348 case CONNECTION_CLOSE_FRAME: {
349 os << "type { CONNECTION_CLOSE_FRAME } "
350 << *(frame.connection_close_frame);
351 break;
352 }
353 case GOAWAY_FRAME: {
354 os << "type { GOAWAY_FRAME } " << *(frame.goaway_frame);
355 break;
356 }
357 case WINDOW_UPDATE_FRAME: {
358 os << "type { WINDOW_UPDATE_FRAME } " << *(frame.window_update_frame);
359 break;
360 }
361 case BLOCKED_FRAME: {
362 os << "type { BLOCKED_FRAME } " << *(frame.blocked_frame);
363 break;
364 }
365 case STREAM_FRAME: {
366 os << "type { STREAM_FRAME } " << *(frame.stream_frame);
367 break;
368 }
369 case ACK_FRAME: {
370 os << "type { ACK_FRAME } " << *(frame.ack_frame);
371 break;
372 }
373 case STOP_WAITING_FRAME: {
374 os << "type { STOP_WAITING_FRAME } " << *(frame.stop_waiting_frame);
375 break;
376 }
377 case PING_FRAME: {
378 os << "type { PING_FRAME } ";
379 break;
380 }
381 case MTU_DISCOVERY_FRAME: {
382 os << "type { MTU_DISCOVERY_FRAME } ";
383 break;
384 }
385 case PATH_CLOSE_FRAME: {
386 os << "type { PATH_CLOSE_FRAME } " << *(frame.path_close_frame);
387 break;
388 }
389 default: {
390 LOG(ERROR) << "Unknown frame type: " << frame.type;
391 break;
392 }
393 }
394 return os;
395 }
396
397 ostream& operator<<(ostream& os, const QuicPaddingFrame& padding_frame) {
398 os << "{ num_padding_bytes: " << padding_frame.num_padding_bytes << " }\n";
399 return os;
400 }
401
402 ostream& operator<<(ostream& os, const QuicRstStreamFrame& rst_frame) {
403 os << "{ stream_id: " << rst_frame.stream_id
404 << ", error_code: " << rst_frame.error_code << " }\n";
405 return os;
406 }
407
408 ostream& operator<<(ostream& os,
409 const QuicConnectionCloseFrame& connection_close_frame) {
410 os << "{ error_code: " << connection_close_frame.error_code
411 << ", error_details: '" << connection_close_frame.error_details << "' }\n";
412 return os;
413 }
414
415 ostream& operator<<(ostream& os, const QuicGoAwayFrame& goaway_frame) {
416 os << "{ error_code: " << goaway_frame.error_code
417 << ", last_good_stream_id: " << goaway_frame.last_good_stream_id
418 << ", reason_phrase: '" << goaway_frame.reason_phrase << "' }\n";
419 return os;
420 }
421
422 ostream& operator<<(ostream& os,
423 const QuicWindowUpdateFrame& window_update_frame) {
424 os << "{ stream_id: " << window_update_frame.stream_id
425 << ", byte_offset: " << window_update_frame.byte_offset << " }\n";
426 return os;
427 }
428
429 ostream& operator<<(ostream& os, const QuicBlockedFrame& blocked_frame) {
430 os << "{ stream_id: " << blocked_frame.stream_id << " }\n";
431 return os;
432 }
433
434 ostream& operator<<(ostream& os, const QuicPathCloseFrame& path_close_frame) {
435 os << "{ path_id: " << static_cast<int>(path_close_frame.path_id) << " }\n";
436 return os;
437 }
438
439 ostream& operator<<(ostream& os, const QuicStreamFrame& stream_frame) {
440 os << "{ stream_id: " << stream_frame.stream_id
441 << ", fin: " << stream_frame.fin << ", offset: " << stream_frame.offset
442 << ", length: " << stream_frame.data_length << " }\n";
443 return os;
444 }
445
446 QuicGoAwayFrame::QuicGoAwayFrame()
447 : error_code(QUIC_NO_ERROR), last_good_stream_id(0) {}
448
449 QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code,
450 QuicStreamId last_good_stream_id,
451 const string& reason)
452 : error_code(error_code),
453 last_good_stream_id(last_good_stream_id),
454 reason_phrase(reason) {}
455
456 QuicWindowUpdateFrame::QuicWindowUpdateFrame(QuicStreamId stream_id,
457 QuicStreamOffset byte_offset)
458 : stream_id(stream_id), byte_offset(byte_offset) {}
459
460 QuicBlockedFrame::QuicBlockedFrame(QuicStreamId stream_id)
461 : stream_id(stream_id) {}
462
463 QuicPathCloseFrame::QuicPathCloseFrame(QuicPathId path_id) : path_id(path_id) {}
464
465 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/core/quic_frames.h ('k') | net/quic/core/quic_frames_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698