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

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

Issue 992733002: Remove //net (except for Android test stuff) and sdch (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 9 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/quic_protocol.h ('k') | net/quic/quic_protocol_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) 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
OLDNEW
« no previous file with comments | « net/quic/quic_protocol.h ('k') | net/quic/quic_protocol_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698