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.
5 #include "net/quic/quic_protocol.h"
7 #include "base/stl_util.h"
8 #include "net/quic/quic_utils.h"
10 using base::StringPiece
;
12 using std::numeric_limits
;
18 size_t GetPacketHeaderSize(const QuicPacketHeader
& header
) {
19 return GetPacketHeaderSize(header
.public_header
.guid_length
,
20 header
.public_header
.version_flag
,
21 header
.public_header
.sequence_number_length
,
22 header
.is_in_fec_group
);
25 size_t GetPacketHeaderSize(QuicGuidLength guid_length
,
27 QuicSequenceNumberLength sequence_number_length
,
28 InFecGroup is_in_fec_group
) {
29 return kPublicFlagsSize
+ guid_length
+
30 (include_version
? kQuicVersionSize
: 0) + sequence_number_length
+
31 kPrivateFlagsSize
+ (is_in_fec_group
== IN_FEC_GROUP
? kFecGroupSize
: 0);
34 size_t GetStartOfFecProtectedData(
35 QuicGuidLength guid_length
,
37 QuicSequenceNumberLength sequence_number_length
) {
38 return GetPacketHeaderSize(
39 guid_length
, include_version
, sequence_number_length
, IN_FEC_GROUP
);
42 size_t GetStartOfEncryptedData(
43 QuicGuidLength guid_length
,
45 QuicSequenceNumberLength sequence_number_length
) {
46 // Don't include the fec size, since encryption starts before private flags.
47 return GetPacketHeaderSize(
48 guid_length
, include_version
, sequence_number_length
, NOT_IN_FEC_GROUP
) -
52 QuicPacketPublicHeader::QuicPacketPublicHeader()
54 guid_length(PACKET_8BYTE_GUID
),
57 sequence_number_length(PACKET_6BYTE_SEQUENCE_NUMBER
) {
60 QuicPacketPublicHeader::QuicPacketPublicHeader(
61 const QuicPacketPublicHeader
& other
)
63 guid_length(other
.guid_length
),
64 reset_flag(other
.reset_flag
),
65 version_flag(other
.version_flag
),
66 sequence_number_length(other
.sequence_number_length
),
67 versions(other
.versions
) {
70 QuicPacketPublicHeader::~QuicPacketPublicHeader() {}
72 QuicPacketHeader::QuicPacketHeader()
76 packet_sequence_number(0),
77 is_in_fec_group(NOT_IN_FEC_GROUP
),
81 QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader
& header
)
82 : public_header(header
),
86 packet_sequence_number(0),
87 is_in_fec_group(NOT_IN_FEC_GROUP
),
91 QuicPublicResetPacket::QuicPublicResetPacket()
93 rejected_sequence_number(0) {}
95 QuicPublicResetPacket::QuicPublicResetPacket(
96 const QuicPacketPublicHeader
& header
)
97 : public_header(header
),
99 rejected_sequence_number(0) {}
101 QuicStreamFrame::QuicStreamFrame()
107 QuicStreamFrame::QuicStreamFrame(const QuicStreamFrame
& frame
)
108 : stream_id(frame
.stream_id
),
110 offset(frame
.offset
),
112 notifier(frame
.notifier
) {
115 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id
,
117 QuicStreamOffset offset
,
119 : stream_id(stream_id
),
126 string
* QuicStreamFrame::GetDataAsString() const {
127 string
* data_string
= new string();
128 data_string
->reserve(data
.TotalBufferSize());
129 for (size_t i
= 0; i
< data
.Size(); ++i
) {
130 data_string
->append(static_cast<char*>(data
.iovec()[i
].iov_base
),
131 data
.iovec()[i
].iov_len
);
133 DCHECK_EQ(data_string
->size(), data
.TotalBufferSize());
137 uint32
MakeQuicTag(char a
, char b
, char c
, char d
) {
138 return static_cast<uint32
>(a
) |
139 static_cast<uint32
>(b
) << 8 |
140 static_cast<uint32
>(c
) << 16 |
141 static_cast<uint32
>(d
) << 24;
144 QuicVersionVector
QuicSupportedVersions() {
145 QuicVersionVector supported_versions
;
146 for (size_t i
= 0; i
< arraysize(kSupportedQuicVersions
); ++i
) {
147 supported_versions
.push_back(kSupportedQuicVersions
[i
]);
149 return supported_versions
;
152 QuicTag
QuicVersionToQuicTag(const QuicVersion version
) {
154 case QUIC_VERSION_12
:
155 return MakeQuicTag('Q', '0', '1', '2');
156 case QUIC_VERSION_13
:
157 return MakeQuicTag('Q', '0', '1', '3');
158 case QUIC_VERSION_14
:
159 return MakeQuicTag('Q', '0', '1', '4');
160 case QUIC_VERSION_15
:
161 return MakeQuicTag('Q', '0', '1', '5');
162 case QUIC_VERSION_16
:
163 return MakeQuicTag('Q', '0', '1', '6');
165 // This shold be an ERROR because we should never attempt to convert an
166 // invalid QuicVersion to be written to the wire.
167 LOG(ERROR
) << "Unsupported QuicVersion: " << version
;
172 QuicVersion
QuicTagToQuicVersion(const QuicTag version_tag
) {
173 for (size_t i
= 0; i
< arraysize(kSupportedQuicVersions
); ++i
) {
174 if (version_tag
== QuicVersionToQuicTag(kSupportedQuicVersions
[i
])) {
175 return kSupportedQuicVersions
[i
];
178 // Reading from the client so this should not be considered an ERROR.
179 DVLOG(1) << "Unsupported QuicTag version: "
180 << QuicUtils::TagToString(version_tag
);
181 return QUIC_VERSION_UNSUPPORTED
;
184 #define RETURN_STRING_LITERAL(x) \
188 string
QuicVersionToString(const QuicVersion version
) {
190 RETURN_STRING_LITERAL(QUIC_VERSION_12
);
191 RETURN_STRING_LITERAL(QUIC_VERSION_13
);
192 RETURN_STRING_LITERAL(QUIC_VERSION_14
);
193 RETURN_STRING_LITERAL(QUIC_VERSION_15
);
194 RETURN_STRING_LITERAL(QUIC_VERSION_16
);
196 return "QUIC_VERSION_UNSUPPORTED";
200 string
QuicVersionVectorToString(const QuicVersionVector
& versions
) {
202 for (size_t i
= 0; i
< versions
.size(); ++i
) {
206 result
.append(QuicVersionToString(versions
[i
]));
211 ostream
& operator<<(ostream
& os
, const QuicPacketHeader
& header
) {
212 os
<< "{ guid: " << header
.public_header
.guid
213 << ", guid_length:" << header
.public_header
.guid_length
214 << ", sequence_number_length:"
215 << header
.public_header
.sequence_number_length
216 << ", reset_flag: " << header
.public_header
.reset_flag
217 << ", version_flag: " << header
.public_header
.version_flag
;
218 if (header
.public_header
.version_flag
) {
220 for (size_t i
= 0; i
< header
.public_header
.versions
.size(); ++i
) {
221 os
<< header
.public_header
.versions
[0] << " ";
224 os
<< ", fec_flag: " << header
.fec_flag
225 << ", entropy_flag: " << header
.entropy_flag
226 << ", entropy hash: " << static_cast<int>(header
.entropy_hash
)
227 << ", sequence_number: " << header
.packet_sequence_number
228 << ", is_in_fec_group:" << header
.is_in_fec_group
229 << ", fec_group: " << header
.fec_group
<< "}\n";
233 ReceivedPacketInfo::ReceivedPacketInfo()
236 delta_time_largest_observed(QuicTime::Delta::Infinite()),
237 is_truncated(false) {}
239 ReceivedPacketInfo::~ReceivedPacketInfo() {}
241 bool IsAwaitingPacket(const ReceivedPacketInfo
& received_info
,
242 QuicPacketSequenceNumber sequence_number
) {
243 return sequence_number
> received_info
.largest_observed
||
244 ContainsKey(received_info
.missing_packets
, sequence_number
);
247 void InsertMissingPacketsBetween(ReceivedPacketInfo
* received_info
,
248 QuicPacketSequenceNumber lower
,
249 QuicPacketSequenceNumber higher
) {
250 for (QuicPacketSequenceNumber i
= lower
; i
< higher
; ++i
) {
251 received_info
->missing_packets
.insert(i
);
255 QuicStopWaitingFrame::QuicStopWaitingFrame()
260 QuicStopWaitingFrame::~QuicStopWaitingFrame() {}
262 QuicAckFrame::QuicAckFrame() {}
264 QuicAckFrame::QuicAckFrame(QuicPacketSequenceNumber largest_observed
,
265 QuicTime largest_observed_receive_time
,
266 QuicPacketSequenceNumber least_unacked
) {
267 received_info
.largest_observed
= largest_observed
;
268 received_info
.entropy_hash
= 0;
269 sent_info
.least_unacked
= least_unacked
;
270 sent_info
.entropy_hash
= 0;
273 CongestionFeedbackMessageTCP::CongestionFeedbackMessageTCP()
274 : receive_window(0) {
277 CongestionFeedbackMessageInterArrival::CongestionFeedbackMessageInterArrival() {
280 CongestionFeedbackMessageInterArrival::
281 ~CongestionFeedbackMessageInterArrival() {}
283 QuicCongestionFeedbackFrame::QuicCongestionFeedbackFrame() : type(kTCP
) {}
285 QuicCongestionFeedbackFrame::~QuicCongestionFeedbackFrame() {}
287 QuicRstStreamFrame::QuicRstStreamFrame()
289 error_code(QUIC_STREAM_NO_ERROR
) {
292 QuicRstStreamFrame::QuicRstStreamFrame(QuicStreamId stream_id
,
293 QuicRstStreamErrorCode error_code
,
294 QuicStreamOffset bytes_written
)
295 : stream_id(stream_id
),
296 error_code(error_code
),
297 byte_offset(bytes_written
) {
298 DCHECK_LE(error_code
, numeric_limits
<uint8
>::max());
301 QuicConnectionCloseFrame::QuicConnectionCloseFrame()
302 : error_code(QUIC_NO_ERROR
) {
305 QuicFrame::QuicFrame() {}
307 QuicFrame::QuicFrame(QuicPaddingFrame
* padding_frame
)
308 : type(PADDING_FRAME
),
309 padding_frame(padding_frame
) {
312 QuicFrame::QuicFrame(QuicStreamFrame
* stream_frame
)
313 : type(STREAM_FRAME
),
314 stream_frame(stream_frame
) {
317 QuicFrame::QuicFrame(QuicAckFrame
* frame
)
322 QuicFrame::QuicFrame(QuicCongestionFeedbackFrame
* frame
)
323 : type(CONGESTION_FEEDBACK_FRAME
),
324 congestion_feedback_frame(frame
) {
327 QuicFrame::QuicFrame(QuicStopWaitingFrame
* frame
)
328 : type(STOP_WAITING_FRAME
),
329 stop_waiting_frame(frame
) {
332 QuicFrame::QuicFrame(QuicRstStreamFrame
* frame
)
333 : type(RST_STREAM_FRAME
),
334 rst_stream_frame(frame
) {
337 QuicFrame::QuicFrame(QuicConnectionCloseFrame
* frame
)
338 : type(CONNECTION_CLOSE_FRAME
),
339 connection_close_frame(frame
) {
342 QuicFrame::QuicFrame(QuicGoAwayFrame
* frame
)
343 : type(GOAWAY_FRAME
),
344 goaway_frame(frame
) {
347 QuicFrame::QuicFrame(QuicWindowUpdateFrame
* frame
)
348 : type(WINDOW_UPDATE_FRAME
),
349 window_update_frame(frame
) {
352 QuicFrame::QuicFrame(QuicBlockedFrame
* frame
)
353 : type(BLOCKED_FRAME
),
354 blocked_frame(frame
) {
357 QuicFecData::QuicFecData() : fec_group(0) {}
359 ostream
& operator<<(ostream
& os
, const QuicStopWaitingFrame
& sent_info
) {
360 os
<< "entropy_hash: " << static_cast<int>(sent_info
.entropy_hash
)
361 << " least_unacked: " << sent_info
.least_unacked
;
365 ostream
& operator<<(ostream
& os
, const ReceivedPacketInfo
& received_info
) {
366 os
<< "entropy_hash: " << static_cast<int>(received_info
.entropy_hash
)
367 << " is_truncated: " << received_info
.is_truncated
368 << " largest_observed: " << received_info
.largest_observed
369 << " missing_packets: [ ";
370 for (SequenceNumberSet::const_iterator it
=
371 received_info
.missing_packets
.begin();
372 it
!= received_info
.missing_packets
.end(); ++it
) {
375 os
<< " ] revived_packets: [ ";
376 for (SequenceNumberSet::const_iterator it
=
377 received_info
.revived_packets
.begin();
378 it
!= received_info
.revived_packets
.end(); ++it
) {
385 ostream
& operator<<(ostream
& os
, const QuicFrame
& frame
) {
386 switch (frame
.type
) {
387 case PADDING_FRAME
: {
388 os
<< "type { PADDING_FRAME } ";
391 case RST_STREAM_FRAME
: {
392 os
<< "type { " << RST_STREAM_FRAME
<< " } " << *(frame
.rst_stream_frame
);
395 case CONNECTION_CLOSE_FRAME
: {
396 os
<< "type { CONNECTION_CLOSE_FRAME } "
397 << *(frame
.connection_close_frame
);
401 os
<< "type { GOAWAY_FRAME } " << *(frame
.goaway_frame
);
404 case WINDOW_UPDATE_FRAME
: {
405 os
<< "type { WINDOW_UPDATE_FRAME } " << *(frame
.window_update_frame
);
408 case BLOCKED_FRAME
: {
409 os
<< "type { BLOCKED_FRAME } " << *(frame
.blocked_frame
);
413 os
<< "type { STREAM_FRAME } " << *(frame
.stream_frame
);
417 os
<< "type { ACK_FRAME } " << *(frame
.ack_frame
);
420 case CONGESTION_FEEDBACK_FRAME
: {
421 os
<< "type { CONGESTION_FEEDBACK_FRAME } "
422 << *(frame
.congestion_feedback_frame
);
425 case STOP_WAITING_FRAME
: {
426 os
<< "type { STOP_WAITING_FRAME } " << *(frame
.stop_waiting_frame
);
430 LOG(ERROR
) << "Unknown frame type: " << frame
.type
;
437 ostream
& operator<<(ostream
& os
, const QuicRstStreamFrame
& rst_frame
) {
438 os
<< "stream_id { " << rst_frame
.stream_id
<< " } "
439 << "error_code { " << rst_frame
.error_code
<< " } "
440 << "error_details { " << rst_frame
.error_details
<< " }\n";
444 ostream
& operator<<(ostream
& os
,
445 const QuicConnectionCloseFrame
& connection_close_frame
) {
446 os
<< "error_code { " << connection_close_frame
.error_code
<< " } "
447 << "error_details { " << connection_close_frame
.error_details
<< " }\n";
451 ostream
& operator<<(ostream
& os
, const QuicGoAwayFrame
& goaway_frame
) {
452 os
<< "error_code { " << goaway_frame
.error_code
<< " } "
453 << "last_good_stream_id { " << goaway_frame
.last_good_stream_id
<< " } "
454 << "reason_phrase { " << goaway_frame
.reason_phrase
<< " }\n";
458 ostream
& operator<<(ostream
& os
,
459 const QuicWindowUpdateFrame
& window_update_frame
) {
460 os
<< "stream_id { " << window_update_frame
.stream_id
<< " } "
461 << "byte_offset { " << window_update_frame
.byte_offset
<< " }\n";
465 ostream
& operator<<(ostream
& os
, const QuicBlockedFrame
& blocked_frame
) {
466 os
<< "stream_id { " << blocked_frame
.stream_id
<< " }\n";
470 ostream
& operator<<(ostream
& os
, const QuicStreamFrame
& stream_frame
) {
471 os
<< "stream_id { " << stream_frame
.stream_id
<< " } "
472 << "fin { " << stream_frame
.fin
<< " } "
473 << "offset { " << stream_frame
.offset
<< " } "
475 << QuicUtils::StringToHexASCIIDump(*(stream_frame
.GetDataAsString()))
480 ostream
& operator<<(ostream
& os
, const QuicAckFrame
& ack_frame
) {
481 os
<< "sent info { " << ack_frame
.sent_info
<< " } "
482 << "received info { " << ack_frame
.received_info
<< " }\n";
486 ostream
& operator<<(ostream
& os
,
487 const QuicCongestionFeedbackFrame
& congestion_frame
) {
488 os
<< "type: " << congestion_frame
.type
;
489 switch (congestion_frame
.type
) {
490 case kInterArrival
: {
491 const CongestionFeedbackMessageInterArrival
& inter_arrival
=
492 congestion_frame
.inter_arrival
;
493 os
<< " received packets: [ ";
494 for (TimeMap::const_iterator it
=
495 inter_arrival
.received_packet_times
.begin();
496 it
!= inter_arrival
.received_packet_times
.end(); ++it
) {
497 os
<< it
->first
<< "@" << it
->second
.ToDebuggingValue() << " ";
503 os
<< " bitrate_in_bytes_per_second: "
504 << congestion_frame
.fix_rate
.bitrate
.ToBytesPerSecond();
508 const CongestionFeedbackMessageTCP
& tcp
= congestion_frame
.tcp
;
509 os
<< " receive_window: " << tcp
.receive_window
;
516 CongestionFeedbackMessageFixRate::CongestionFeedbackMessageFixRate()
517 : bitrate(QuicBandwidth::Zero()) {
520 QuicGoAwayFrame::QuicGoAwayFrame()
521 : error_code(QUIC_NO_ERROR
),
522 last_good_stream_id(0) {
525 QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code
,
526 QuicStreamId last_good_stream_id
,
527 const string
& reason
)
528 : error_code(error_code
),
529 last_good_stream_id(last_good_stream_id
),
530 reason_phrase(reason
) {
531 DCHECK_LE(error_code
, numeric_limits
<uint8
>::max());
534 QuicData::QuicData(const char* buffer
,
538 owns_buffer_(false) {
541 QuicData::QuicData(char* buffer
,
546 owns_buffer_(owns_buffer
) {
549 QuicData::~QuicData() {
551 delete [] const_cast<char*>(buffer_
);
555 QuicWindowUpdateFrame::QuicWindowUpdateFrame(QuicStreamId stream_id
,
556 QuicStreamOffset byte_offset
)
557 : stream_id(stream_id
),
558 byte_offset(byte_offset
) {}
560 QuicBlockedFrame::QuicBlockedFrame(QuicStreamId stream_id
)
561 : stream_id(stream_id
) {}
563 QuicPacket::QuicPacket(char* buffer
,
566 QuicGuidLength guid_length
,
567 bool includes_version
,
568 QuicSequenceNumberLength sequence_number_length
,
570 : QuicData(buffer
, length
, owns_buffer
),
572 is_fec_packet_(is_fec_packet
),
573 guid_length_(guid_length
),
574 includes_version_(includes_version
),
575 sequence_number_length_(sequence_number_length
) {
578 QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer
,
580 : QuicData(buffer
, length
) {
583 QuicEncryptedPacket::QuicEncryptedPacket(char* buffer
,
586 : QuicData(buffer
, length
, owns_buffer
) {
589 StringPiece
QuicPacket::FecProtectedData() const {
590 const size_t start_of_fec
= GetStartOfFecProtectedData(
591 guid_length_
, includes_version_
, sequence_number_length_
);
592 return StringPiece(data() + start_of_fec
, length() - start_of_fec
);
595 StringPiece
QuicPacket::AssociatedData() const {
597 data() + kStartOfHashData
,
598 GetStartOfEncryptedData(
599 guid_length_
, includes_version_
, sequence_number_length_
) -
603 StringPiece
QuicPacket::BeforePlaintext() const {
604 return StringPiece(data(), GetStartOfEncryptedData(guid_length_
,
606 sequence_number_length_
));
609 StringPiece
QuicPacket::Plaintext() const {
610 const size_t start_of_encrypted_data
=
611 GetStartOfEncryptedData(
612 guid_length_
, includes_version_
, sequence_number_length_
);
613 return StringPiece(data() + start_of_encrypted_data
,
614 length() - start_of_encrypted_data
);
617 RetransmittableFrames::RetransmittableFrames()
618 : encryption_level_(NUM_ENCRYPTION_LEVELS
) {
621 RetransmittableFrames::~RetransmittableFrames() {
622 for (QuicFrames::iterator it
= frames_
.begin(); it
!= frames_
.end(); ++it
) {
625 delete it
->padding_frame
;
628 delete it
->stream_frame
;
631 delete it
->ack_frame
;
633 case CONGESTION_FEEDBACK_FRAME
:
634 delete it
->congestion_feedback_frame
;
636 case STOP_WAITING_FRAME
:
637 delete it
->stop_waiting_frame
;
639 case RST_STREAM_FRAME
:
640 delete it
->rst_stream_frame
;
642 case CONNECTION_CLOSE_FRAME
:
643 delete it
->connection_close_frame
;
646 delete it
->goaway_frame
;
648 case WINDOW_UPDATE_FRAME
:
649 delete it
->window_update_frame
;
652 delete it
->blocked_frame
;
654 case NUM_FRAME_TYPES
:
655 DCHECK(false) << "Cannot delete type: " << it
->type
;
658 STLDeleteElements(&stream_data_
);
661 const QuicFrame
& RetransmittableFrames::AddStreamFrame(
662 QuicStreamFrame
* stream_frame
) {
663 // Make an owned copy of the stream frame's data.
664 stream_data_
.push_back(stream_frame
->GetDataAsString());
665 // Ensure the stream frame's IOVector points to the owned copy of the data.
666 stream_frame
->data
.Clear();
667 stream_frame
->data
.Append(const_cast<char*>(stream_data_
.back()->data()),
668 stream_data_
.back()->size());
669 frames_
.push_back(QuicFrame(stream_frame
));
670 return frames_
.back();
673 const QuicFrame
& RetransmittableFrames::AddNonStreamFrame(
674 const QuicFrame
& frame
) {
675 DCHECK_NE(frame
.type
, STREAM_FRAME
);
676 frames_
.push_back(frame
);
677 return frames_
.back();
680 IsHandshake
RetransmittableFrames::HasCryptoHandshake() const {
681 for (size_t i
= 0; i
< frames().size(); ++i
) {
682 if (frames()[i
].type
== STREAM_FRAME
&&
683 frames()[i
].stream_frame
->stream_id
== kCryptoStreamId
) {
687 return NOT_HANDSHAKE
;
690 void RetransmittableFrames::set_encryption_level(EncryptionLevel level
) {
691 encryption_level_
= level
;
694 SerializedPacket::SerializedPacket(
695 QuicPacketSequenceNumber sequence_number
,
696 QuicSequenceNumberLength sequence_number_length
,
698 QuicPacketEntropyHash entropy_hash
,
699 RetransmittableFrames
* retransmittable_frames
)
700 : sequence_number(sequence_number
),
701 sequence_number_length(sequence_number_length
),
703 entropy_hash(entropy_hash
),
704 retransmittable_frames(retransmittable_frames
) {
707 SerializedPacket::~SerializedPacket() {}
709 QuicEncryptedPacket
* QuicEncryptedPacket::Clone() const {
710 char* buffer
= new char[this->length()];
711 memcpy(buffer
, this->data(), this->length());
712 return new QuicEncryptedPacket(buffer
, this->length(), true);
715 ostream
& operator<<(ostream
& os
, const QuicEncryptedPacket
& s
) {
716 os
<< s
.length() << "-byte data";
720 QuicConsumedData::QuicConsumedData(size_t bytes_consumed
,
722 : bytes_consumed(bytes_consumed
),
723 fin_consumed(fin_consumed
) {
726 ostream
& operator<<(ostream
& os
, const QuicConsumedData
& s
) {
727 os
<< "bytes_consumed: " << s
.bytes_consumed
728 << " fin_consumed: " << s
.fin_consumed
;
732 WriteResult::WriteResult(WriteStatus status
,
733 int bytes_written_or_error_code
)
735 bytes_written(bytes_written_or_error_code
) {