OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "net/quic/quic_protocol.h" | |
6 | |
7 #include "base/stl_util.h" | |
8 #include "net/quic/quic_utils.h" | |
9 | |
10 using base::StringPiece; | |
11 using std::map; | |
12 using std::numeric_limits; | |
13 using std::ostream; | |
14 using std::string; | |
15 | |
16 namespace net { | |
17 | |
18 size_t GetPacketHeaderSize(const QuicPacketHeader& header) { | |
19 return GetPacketHeaderSize(header.public_header.connection_id_length, | |
20 header.public_header.version_flag, | |
21 header.public_header.sequence_number_length, | |
22 header.is_in_fec_group); | |
23 } | |
24 | |
25 size_t GetPacketHeaderSize(QuicConnectionIdLength connection_id_length, | |
26 bool include_version, | |
27 QuicSequenceNumberLength sequence_number_length, | |
28 InFecGroup is_in_fec_group) { | |
29 return kPublicFlagsSize + connection_id_length + | |
30 (include_version ? kQuicVersionSize : 0) + sequence_number_length + | |
31 kPrivateFlagsSize + (is_in_fec_group == IN_FEC_GROUP ? kFecGroupSize : 0); | |
32 } | |
33 | |
34 size_t GetStartOfFecProtectedData( | |
35 QuicConnectionIdLength connection_id_length, | |
36 bool include_version, | |
37 QuicSequenceNumberLength sequence_number_length) { | |
38 return GetPacketHeaderSize(connection_id_length, | |
39 include_version, | |
40 sequence_number_length, | |
41 IN_FEC_GROUP); | |
42 } | |
43 | |
44 size_t GetStartOfEncryptedData( | |
45 QuicConnectionIdLength connection_id_length, | |
46 bool include_version, | |
47 QuicSequenceNumberLength sequence_number_length) { | |
48 // Don't include the fec size, since encryption starts before private flags. | |
49 return GetPacketHeaderSize(connection_id_length, | |
50 include_version, | |
51 sequence_number_length, | |
52 NOT_IN_FEC_GROUP) - kPrivateFlagsSize; | |
53 } | |
54 | |
55 QuicPacketPublicHeader::QuicPacketPublicHeader() | |
56 : connection_id(0), | |
57 connection_id_length(PACKET_8BYTE_CONNECTION_ID), | |
58 reset_flag(false), | |
59 version_flag(false), | |
60 sequence_number_length(PACKET_6BYTE_SEQUENCE_NUMBER) { | |
61 } | |
62 | |
63 QuicPacketPublicHeader::QuicPacketPublicHeader( | |
64 const QuicPacketPublicHeader& other) | |
65 : connection_id(other.connection_id), | |
66 connection_id_length(other.connection_id_length), | |
67 reset_flag(other.reset_flag), | |
68 version_flag(other.version_flag), | |
69 sequence_number_length(other.sequence_number_length), | |
70 versions(other.versions) { | |
71 } | |
72 | |
73 QuicPacketPublicHeader::~QuicPacketPublicHeader() {} | |
74 | |
75 QuicPacketHeader::QuicPacketHeader() | |
76 : fec_flag(false), | |
77 entropy_flag(false), | |
78 entropy_hash(0), | |
79 packet_sequence_number(0), | |
80 is_in_fec_group(NOT_IN_FEC_GROUP), | |
81 fec_group(0) { | |
82 } | |
83 | |
84 QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader& header) | |
85 : public_header(header), | |
86 fec_flag(false), | |
87 entropy_flag(false), | |
88 entropy_hash(0), | |
89 packet_sequence_number(0), | |
90 is_in_fec_group(NOT_IN_FEC_GROUP), | |
91 fec_group(0) { | |
92 } | |
93 | |
94 QuicPublicResetPacket::QuicPublicResetPacket() | |
95 : nonce_proof(0), | |
96 rejected_sequence_number(0) {} | |
97 | |
98 QuicPublicResetPacket::QuicPublicResetPacket( | |
99 const QuicPacketPublicHeader& header) | |
100 : public_header(header), | |
101 nonce_proof(0), | |
102 rejected_sequence_number(0) {} | |
103 | |
104 QuicStreamFrame::QuicStreamFrame() | |
105 : stream_id(0), | |
106 fin(false), | |
107 offset(0), | |
108 notifier(nullptr) {} | |
109 | |
110 QuicStreamFrame::QuicStreamFrame(const QuicStreamFrame& frame) | |
111 : stream_id(frame.stream_id), | |
112 fin(frame.fin), | |
113 offset(frame.offset), | |
114 data(frame.data), | |
115 notifier(frame.notifier) { | |
116 } | |
117 | |
118 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id, | |
119 bool fin, | |
120 QuicStreamOffset offset, | |
121 IOVector data) | |
122 : stream_id(stream_id), | |
123 fin(fin), | |
124 offset(offset), | |
125 data(data), | |
126 notifier(nullptr) {} | |
127 | |
128 string* QuicStreamFrame::GetDataAsString() const { | |
129 string* data_string = new string(); | |
130 data_string->reserve(data.TotalBufferSize()); | |
131 for (size_t i = 0; i < data.Size(); ++i) { | |
132 data_string->append(static_cast<char*>(data.iovec()[i].iov_base), | |
133 data.iovec()[i].iov_len); | |
134 } | |
135 DCHECK_EQ(data_string->size(), data.TotalBufferSize()); | |
136 return data_string; | |
137 } | |
138 | |
139 uint32 MakeQuicTag(char a, char b, char c, char d) { | |
140 return static_cast<uint32>(a) | | |
141 static_cast<uint32>(b) << 8 | | |
142 static_cast<uint32>(c) << 16 | | |
143 static_cast<uint32>(d) << 24; | |
144 } | |
145 | |
146 bool ContainsQuicTag(const QuicTagVector& tag_vector, QuicTag tag) { | |
147 return std::find(tag_vector.begin(), tag_vector.end(), tag) | |
148 != tag_vector.end(); | |
149 } | |
150 | |
151 QuicVersionVector QuicSupportedVersions() { | |
152 QuicVersionVector supported_versions; | |
153 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { | |
154 supported_versions.push_back(kSupportedQuicVersions[i]); | |
155 } | |
156 return supported_versions; | |
157 } | |
158 | |
159 QuicTag QuicVersionToQuicTag(const QuicVersion version) { | |
160 switch (version) { | |
161 case QUIC_VERSION_23: | |
162 return MakeQuicTag('Q', '0', '2', '3'); | |
163 case QUIC_VERSION_24: | |
164 return MakeQuicTag('Q', '0', '2', '4'); | |
165 default: | |
166 // This shold be an ERROR because we should never attempt to convert an | |
167 // invalid QuicVersion to be written to the wire. | |
168 LOG(ERROR) << "Unsupported QuicVersion: " << version; | |
169 return 0; | |
170 } | |
171 } | |
172 | |
173 QuicVersion QuicTagToQuicVersion(const QuicTag version_tag) { | |
174 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { | |
175 if (version_tag == QuicVersionToQuicTag(kSupportedQuicVersions[i])) { | |
176 return kSupportedQuicVersions[i]; | |
177 } | |
178 } | |
179 // Reading from the client so this should not be considered an ERROR. | |
180 DVLOG(1) << "Unsupported QuicTag version: " | |
181 << QuicUtils::TagToString(version_tag); | |
182 return QUIC_VERSION_UNSUPPORTED; | |
183 } | |
184 | |
185 #define RETURN_STRING_LITERAL(x) \ | |
186 case x: \ | |
187 return #x | |
188 | |
189 string QuicVersionToString(const QuicVersion version) { | |
190 switch (version) { | |
191 RETURN_STRING_LITERAL(QUIC_VERSION_23); | |
192 RETURN_STRING_LITERAL(QUIC_VERSION_24); | |
193 default: | |
194 return "QUIC_VERSION_UNSUPPORTED"; | |
195 } | |
196 } | |
197 | |
198 string QuicVersionVectorToString(const QuicVersionVector& versions) { | |
199 string result = ""; | |
200 for (size_t i = 0; i < versions.size(); ++i) { | |
201 if (i != 0) { | |
202 result.append(","); | |
203 } | |
204 result.append(QuicVersionToString(versions[i])); | |
205 } | |
206 return result; | |
207 } | |
208 | |
209 ostream& operator<<(ostream& os, const QuicPacketHeader& header) { | |
210 os << "{ connection_id: " << header.public_header.connection_id | |
211 << ", connection_id_length:" << header.public_header.connection_id_length | |
212 << ", sequence_number_length:" | |
213 << header.public_header.sequence_number_length | |
214 << ", reset_flag: " << header.public_header.reset_flag | |
215 << ", version_flag: " << header.public_header.version_flag; | |
216 if (header.public_header.version_flag) { | |
217 os << " version: "; | |
218 for (size_t i = 0; i < header.public_header.versions.size(); ++i) { | |
219 os << header.public_header.versions[0] << " "; | |
220 } | |
221 } | |
222 os << ", fec_flag: " << header.fec_flag | |
223 << ", entropy_flag: " << header.entropy_flag | |
224 << ", entropy hash: " << static_cast<int>(header.entropy_hash) | |
225 << ", sequence_number: " << header.packet_sequence_number | |
226 << ", is_in_fec_group:" << header.is_in_fec_group | |
227 << ", fec_group: " << header.fec_group<< "}\n"; | |
228 return os; | |
229 } | |
230 | |
231 bool IsAwaitingPacket(const QuicAckFrame& ack_frame, | |
232 QuicPacketSequenceNumber sequence_number) { | |
233 return sequence_number > ack_frame.largest_observed || | |
234 ContainsKey(ack_frame.missing_packets, sequence_number); | |
235 } | |
236 | |
237 void InsertMissingPacketsBetween(QuicAckFrame* ack_frame, | |
238 QuicPacketSequenceNumber lower, | |
239 QuicPacketSequenceNumber higher) { | |
240 for (QuicPacketSequenceNumber i = lower; i < higher; ++i) { | |
241 ack_frame->missing_packets.insert(i); | |
242 } | |
243 } | |
244 | |
245 QuicStopWaitingFrame::QuicStopWaitingFrame() | |
246 : entropy_hash(0), | |
247 least_unacked(0) { | |
248 } | |
249 | |
250 QuicStopWaitingFrame::~QuicStopWaitingFrame() {} | |
251 | |
252 QuicAckFrame::QuicAckFrame() | |
253 : entropy_hash(0), | |
254 largest_observed(0), | |
255 delta_time_largest_observed(QuicTime::Delta::Infinite()), | |
256 is_truncated(false) {} | |
257 | |
258 QuicAckFrame::~QuicAckFrame() {} | |
259 | |
260 QuicRstStreamErrorCode AdjustErrorForVersion( | |
261 QuicRstStreamErrorCode error_code, | |
262 QuicVersion version) { | |
263 return error_code; | |
264 } | |
265 | |
266 QuicRstStreamFrame::QuicRstStreamFrame() | |
267 : stream_id(0), | |
268 error_code(QUIC_STREAM_NO_ERROR) { | |
269 } | |
270 | |
271 QuicRstStreamFrame::QuicRstStreamFrame(QuicStreamId stream_id, | |
272 QuicRstStreamErrorCode error_code, | |
273 QuicStreamOffset bytes_written) | |
274 : stream_id(stream_id), | |
275 error_code(error_code), | |
276 byte_offset(bytes_written) { | |
277 DCHECK_LE(error_code, numeric_limits<uint8>::max()); | |
278 } | |
279 | |
280 QuicConnectionCloseFrame::QuicConnectionCloseFrame() | |
281 : error_code(QUIC_NO_ERROR) { | |
282 } | |
283 | |
284 QuicFrame::QuicFrame() {} | |
285 | |
286 QuicFrame::QuicFrame(QuicPaddingFrame* padding_frame) | |
287 : type(PADDING_FRAME), | |
288 padding_frame(padding_frame) { | |
289 } | |
290 | |
291 QuicFrame::QuicFrame(QuicStreamFrame* stream_frame) | |
292 : type(STREAM_FRAME), | |
293 stream_frame(stream_frame) { | |
294 } | |
295 | |
296 QuicFrame::QuicFrame(QuicAckFrame* frame) | |
297 : type(ACK_FRAME), | |
298 ack_frame(frame) { | |
299 } | |
300 | |
301 QuicFrame::QuicFrame(QuicStopWaitingFrame* frame) | |
302 : type(STOP_WAITING_FRAME), | |
303 stop_waiting_frame(frame) { | |
304 } | |
305 | |
306 QuicFrame::QuicFrame(QuicPingFrame* frame) | |
307 : type(PING_FRAME), | |
308 ping_frame(frame) { | |
309 } | |
310 | |
311 QuicFrame::QuicFrame(QuicRstStreamFrame* frame) | |
312 : type(RST_STREAM_FRAME), | |
313 rst_stream_frame(frame) { | |
314 } | |
315 | |
316 QuicFrame::QuicFrame(QuicConnectionCloseFrame* frame) | |
317 : type(CONNECTION_CLOSE_FRAME), | |
318 connection_close_frame(frame) { | |
319 } | |
320 | |
321 QuicFrame::QuicFrame(QuicGoAwayFrame* frame) | |
322 : type(GOAWAY_FRAME), | |
323 goaway_frame(frame) { | |
324 } | |
325 | |
326 QuicFrame::QuicFrame(QuicWindowUpdateFrame* frame) | |
327 : type(WINDOW_UPDATE_FRAME), | |
328 window_update_frame(frame) { | |
329 } | |
330 | |
331 QuicFrame::QuicFrame(QuicBlockedFrame* frame) | |
332 : type(BLOCKED_FRAME), | |
333 blocked_frame(frame) { | |
334 } | |
335 | |
336 QuicFecData::QuicFecData() : fec_group(0) {} | |
337 | |
338 ostream& operator<<(ostream& os, const QuicStopWaitingFrame& sent_info) { | |
339 os << "entropy_hash: " << static_cast<int>(sent_info.entropy_hash) | |
340 << " least_unacked: " << sent_info.least_unacked; | |
341 return os; | |
342 } | |
343 | |
344 ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) { | |
345 os << "entropy_hash: " << static_cast<int>(ack_frame.entropy_hash) | |
346 << " largest_observed: " << ack_frame.largest_observed | |
347 << " delta_time_largest_observed: " | |
348 << ack_frame.delta_time_largest_observed.ToMicroseconds() | |
349 << " missing_packets: [ "; | |
350 for (SequenceNumberSet::const_iterator it = ack_frame.missing_packets.begin(); | |
351 it != ack_frame.missing_packets.end(); ++it) { | |
352 os << *it << " "; | |
353 } | |
354 os << " ] is_truncated: " << ack_frame.is_truncated; | |
355 os << " revived_packets: [ "; | |
356 for (SequenceNumberSet::const_iterator it = ack_frame.revived_packets.begin(); | |
357 it != ack_frame.revived_packets.end(); ++it) { | |
358 os << *it << " "; | |
359 } | |
360 os << " ] received_packets: [ "; | |
361 for (PacketTimeList::const_iterator it = | |
362 ack_frame.received_packet_times.begin(); | |
363 it != ack_frame.received_packet_times.end(); ++it) { | |
364 os << it->first << " at " << it->second.ToDebuggingValue() << " "; | |
365 } | |
366 os << " ]"; | |
367 return os; | |
368 } | |
369 | |
370 ostream& operator<<(ostream& os, const QuicFrame& frame) { | |
371 switch (frame.type) { | |
372 case PADDING_FRAME: { | |
373 os << "type { PADDING_FRAME } "; | |
374 break; | |
375 } | |
376 case RST_STREAM_FRAME: { | |
377 os << "type { " << RST_STREAM_FRAME << " } " << *(frame.rst_stream_frame); | |
378 break; | |
379 } | |
380 case CONNECTION_CLOSE_FRAME: { | |
381 os << "type { CONNECTION_CLOSE_FRAME } " | |
382 << *(frame.connection_close_frame); | |
383 break; | |
384 } | |
385 case GOAWAY_FRAME: { | |
386 os << "type { GOAWAY_FRAME } " << *(frame.goaway_frame); | |
387 break; | |
388 } | |
389 case WINDOW_UPDATE_FRAME: { | |
390 os << "type { WINDOW_UPDATE_FRAME } " << *(frame.window_update_frame); | |
391 break; | |
392 } | |
393 case BLOCKED_FRAME: { | |
394 os << "type { BLOCKED_FRAME } " << *(frame.blocked_frame); | |
395 break; | |
396 } | |
397 case STREAM_FRAME: { | |
398 os << "type { STREAM_FRAME } " << *(frame.stream_frame); | |
399 break; | |
400 } | |
401 case ACK_FRAME: { | |
402 os << "type { ACK_FRAME } " << *(frame.ack_frame); | |
403 break; | |
404 } | |
405 case STOP_WAITING_FRAME: { | |
406 os << "type { STOP_WAITING_FRAME } " << *(frame.stop_waiting_frame); | |
407 break; | |
408 } | |
409 case PING_FRAME: { | |
410 os << "type { PING_FRAME } "; | |
411 break; | |
412 } | |
413 default: { | |
414 LOG(ERROR) << "Unknown frame type: " << frame.type; | |
415 break; | |
416 } | |
417 } | |
418 return os; | |
419 } | |
420 | |
421 ostream& operator<<(ostream& os, const QuicRstStreamFrame& rst_frame) { | |
422 os << "stream_id { " << rst_frame.stream_id << " } " | |
423 << "error_code { " << rst_frame.error_code << " } " | |
424 << "error_details { " << rst_frame.error_details << " }\n"; | |
425 return os; | |
426 } | |
427 | |
428 ostream& operator<<(ostream& os, | |
429 const QuicConnectionCloseFrame& connection_close_frame) { | |
430 os << "error_code { " << connection_close_frame.error_code << " } " | |
431 << "error_details { " << connection_close_frame.error_details << " }\n"; | |
432 return os; | |
433 } | |
434 | |
435 ostream& operator<<(ostream& os, const QuicGoAwayFrame& goaway_frame) { | |
436 os << "error_code { " << goaway_frame.error_code << " } " | |
437 << "last_good_stream_id { " << goaway_frame.last_good_stream_id << " } " | |
438 << "reason_phrase { " << goaway_frame.reason_phrase << " }\n"; | |
439 return os; | |
440 } | |
441 | |
442 ostream& operator<<(ostream& os, | |
443 const QuicWindowUpdateFrame& window_update_frame) { | |
444 os << "stream_id { " << window_update_frame.stream_id << " } " | |
445 << "byte_offset { " << window_update_frame.byte_offset << " }\n"; | |
446 return os; | |
447 } | |
448 | |
449 ostream& operator<<(ostream& os, const QuicBlockedFrame& blocked_frame) { | |
450 os << "stream_id { " << blocked_frame.stream_id << " }\n"; | |
451 return os; | |
452 } | |
453 | |
454 ostream& operator<<(ostream& os, const QuicStreamFrame& stream_frame) { | |
455 os << "stream_id { " << stream_frame.stream_id << " } " | |
456 << "fin { " << stream_frame.fin << " } " | |
457 << "offset { " << stream_frame.offset << " } " | |
458 << "data { " | |
459 << QuicUtils::StringToHexASCIIDump(*(stream_frame.GetDataAsString())) | |
460 << " }\n"; | |
461 return os; | |
462 } | |
463 | |
464 QuicGoAwayFrame::QuicGoAwayFrame() | |
465 : error_code(QUIC_NO_ERROR), | |
466 last_good_stream_id(0) { | |
467 } | |
468 | |
469 QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code, | |
470 QuicStreamId last_good_stream_id, | |
471 const string& reason) | |
472 : error_code(error_code), | |
473 last_good_stream_id(last_good_stream_id), | |
474 reason_phrase(reason) { | |
475 DCHECK_LE(error_code, numeric_limits<uint8>::max()); | |
476 } | |
477 | |
478 QuicData::QuicData(const char* buffer, | |
479 size_t length) | |
480 : buffer_(buffer), | |
481 length_(length), | |
482 owns_buffer_(false) { | |
483 } | |
484 | |
485 QuicData::QuicData(char* buffer, | |
486 size_t length, | |
487 bool owns_buffer) | |
488 : buffer_(buffer), | |
489 length_(length), | |
490 owns_buffer_(owns_buffer) { | |
491 } | |
492 | |
493 QuicData::~QuicData() { | |
494 if (owns_buffer_) { | |
495 delete [] const_cast<char*>(buffer_); | |
496 } | |
497 } | |
498 | |
499 QuicWindowUpdateFrame::QuicWindowUpdateFrame(QuicStreamId stream_id, | |
500 QuicStreamOffset byte_offset) | |
501 : stream_id(stream_id), | |
502 byte_offset(byte_offset) {} | |
503 | |
504 QuicBlockedFrame::QuicBlockedFrame(QuicStreamId stream_id) | |
505 : stream_id(stream_id) {} | |
506 | |
507 QuicPacket::QuicPacket(char* buffer, | |
508 size_t length, | |
509 bool owns_buffer, | |
510 QuicConnectionIdLength connection_id_length, | |
511 bool includes_version, | |
512 QuicSequenceNumberLength sequence_number_length) | |
513 : QuicData(buffer, length, owns_buffer), | |
514 buffer_(buffer), | |
515 connection_id_length_(connection_id_length), | |
516 includes_version_(includes_version), | |
517 sequence_number_length_(sequence_number_length) { | |
518 } | |
519 | |
520 QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer, | |
521 size_t length) | |
522 : QuicData(buffer, length) { | |
523 } | |
524 | |
525 QuicEncryptedPacket::QuicEncryptedPacket(char* buffer, | |
526 size_t length, | |
527 bool owns_buffer) | |
528 : QuicData(buffer, length, owns_buffer) { | |
529 } | |
530 | |
531 StringPiece QuicPacket::FecProtectedData() const { | |
532 const size_t start_of_fec = GetStartOfFecProtectedData( | |
533 connection_id_length_, includes_version_, sequence_number_length_); | |
534 return StringPiece(data() + start_of_fec, length() - start_of_fec); | |
535 } | |
536 | |
537 StringPiece QuicPacket::AssociatedData() const { | |
538 return StringPiece( | |
539 data() + kStartOfHashData, | |
540 GetStartOfEncryptedData( | |
541 connection_id_length_, includes_version_, sequence_number_length_) - | |
542 kStartOfHashData); | |
543 } | |
544 | |
545 StringPiece QuicPacket::BeforePlaintext() const { | |
546 return StringPiece(data(), GetStartOfEncryptedData(connection_id_length_, | |
547 includes_version_, | |
548 sequence_number_length_)); | |
549 } | |
550 | |
551 StringPiece QuicPacket::Plaintext() const { | |
552 const size_t start_of_encrypted_data = | |
553 GetStartOfEncryptedData( | |
554 connection_id_length_, includes_version_, sequence_number_length_); | |
555 return StringPiece(data() + start_of_encrypted_data, | |
556 length() - start_of_encrypted_data); | |
557 } | |
558 | |
559 RetransmittableFrames::RetransmittableFrames() | |
560 : encryption_level_(NUM_ENCRYPTION_LEVELS), | |
561 has_crypto_handshake_(NOT_HANDSHAKE) { | |
562 } | |
563 | |
564 RetransmittableFrames::~RetransmittableFrames() { | |
565 for (QuicFrames::iterator it = frames_.begin(); it != frames_.end(); ++it) { | |
566 switch (it->type) { | |
567 case PADDING_FRAME: | |
568 delete it->padding_frame; | |
569 break; | |
570 case STREAM_FRAME: | |
571 delete it->stream_frame; | |
572 break; | |
573 case ACK_FRAME: | |
574 delete it->ack_frame; | |
575 break; | |
576 case STOP_WAITING_FRAME: | |
577 delete it->stop_waiting_frame; | |
578 break; | |
579 case PING_FRAME: | |
580 delete it->ping_frame; | |
581 break; | |
582 case RST_STREAM_FRAME: | |
583 delete it->rst_stream_frame; | |
584 break; | |
585 case CONNECTION_CLOSE_FRAME: | |
586 delete it->connection_close_frame; | |
587 break; | |
588 case GOAWAY_FRAME: | |
589 delete it->goaway_frame; | |
590 break; | |
591 case WINDOW_UPDATE_FRAME: | |
592 delete it->window_update_frame; | |
593 break; | |
594 case BLOCKED_FRAME: | |
595 delete it->blocked_frame; | |
596 break; | |
597 case NUM_FRAME_TYPES: | |
598 DCHECK(false) << "Cannot delete type: " << it->type; | |
599 } | |
600 } | |
601 STLDeleteElements(&stream_data_); | |
602 } | |
603 | |
604 const QuicFrame& RetransmittableFrames::AddStreamFrame( | |
605 QuicStreamFrame* stream_frame) { | |
606 // Make an owned copy of the stream frame's data. | |
607 stream_data_.push_back(stream_frame->GetDataAsString()); | |
608 // Ensure the stream frame's IOVector points to the owned copy of the data. | |
609 stream_frame->data.Clear(); | |
610 stream_frame->data.Append(const_cast<char*>(stream_data_.back()->data()), | |
611 stream_data_.back()->size()); | |
612 frames_.push_back(QuicFrame(stream_frame)); | |
613 if (stream_frame->stream_id == kCryptoStreamId) { | |
614 has_crypto_handshake_ = IS_HANDSHAKE; | |
615 } | |
616 return frames_.back(); | |
617 } | |
618 | |
619 const QuicFrame& RetransmittableFrames::AddNonStreamFrame( | |
620 const QuicFrame& frame) { | |
621 DCHECK_NE(frame.type, STREAM_FRAME); | |
622 frames_.push_back(frame); | |
623 return frames_.back(); | |
624 } | |
625 | |
626 void RetransmittableFrames::set_encryption_level(EncryptionLevel level) { | |
627 encryption_level_ = level; | |
628 } | |
629 | |
630 SerializedPacket::SerializedPacket( | |
631 QuicPacketSequenceNumber sequence_number, | |
632 QuicSequenceNumberLength sequence_number_length, | |
633 QuicEncryptedPacket* packet, | |
634 QuicPacketEntropyHash entropy_hash, | |
635 RetransmittableFrames* retransmittable_frames) | |
636 : sequence_number(sequence_number), | |
637 sequence_number_length(sequence_number_length), | |
638 packet(packet), | |
639 entropy_hash(entropy_hash), | |
640 retransmittable_frames(retransmittable_frames), | |
641 is_fec_packet(false) { | |
642 } | |
643 | |
644 SerializedPacket::~SerializedPacket() {} | |
645 | |
646 QuicEncryptedPacket* QuicEncryptedPacket::Clone() const { | |
647 char* buffer = new char[this->length()]; | |
648 memcpy(buffer, this->data(), this->length()); | |
649 return new QuicEncryptedPacket(buffer, this->length(), true); | |
650 } | |
651 | |
652 ostream& operator<<(ostream& os, const QuicEncryptedPacket& s) { | |
653 os << s.length() << "-byte data"; | |
654 return os; | |
655 } | |
656 | |
657 TransmissionInfo::TransmissionInfo() | |
658 : retransmittable_frames(nullptr), | |
659 sequence_number_length(PACKET_1BYTE_SEQUENCE_NUMBER), | |
660 sent_time(QuicTime::Zero()), | |
661 bytes_sent(0), | |
662 nack_count(0), | |
663 transmission_type(NOT_RETRANSMISSION), | |
664 all_transmissions(nullptr), | |
665 in_flight(false), | |
666 is_unackable(false), | |
667 is_fec_packet(false) {} | |
668 | |
669 TransmissionInfo::TransmissionInfo( | |
670 RetransmittableFrames* retransmittable_frames, | |
671 QuicSequenceNumberLength sequence_number_length, | |
672 TransmissionType transmission_type, | |
673 QuicTime sent_time) | |
674 : retransmittable_frames(retransmittable_frames), | |
675 sequence_number_length(sequence_number_length), | |
676 sent_time(sent_time), | |
677 bytes_sent(0), | |
678 nack_count(0), | |
679 transmission_type(transmission_type), | |
680 all_transmissions(nullptr), | |
681 in_flight(false), | |
682 is_unackable(false), | |
683 is_fec_packet(false) {} | |
684 | |
685 } // namespace net | |
OLD | NEW |