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
.connection_id_length
,
20 header
.public_header
.version_flag
,
21 header
.public_header
.packet_number_length
,
22 header
.is_in_fec_group
);
25 size_t GetPacketHeaderSize(QuicConnectionIdLength connection_id_length
,
27 QuicPacketNumberLength packet_number_length
,
28 InFecGroup is_in_fec_group
) {
29 return kPublicFlagsSize
+ connection_id_length
+
30 (include_version
? kQuicVersionSize
: 0) + packet_number_length
+
32 (is_in_fec_group
== IN_FEC_GROUP
? kFecGroupSize
: 0);
35 size_t GetStartOfFecProtectedData(QuicConnectionIdLength connection_id_length
,
37 QuicPacketNumberLength packet_number_length
) {
38 return GetPacketHeaderSize(connection_id_length
, include_version
,
39 packet_number_length
, IN_FEC_GROUP
);
42 size_t GetStartOfEncryptedData(QuicConnectionIdLength connection_id_length
,
44 QuicPacketNumberLength packet_number_length
) {
45 // Don't include the fec size, since encryption starts before private flags.
46 return GetPacketHeaderSize(connection_id_length
, include_version
,
47 packet_number_length
, NOT_IN_FEC_GROUP
) -
51 QuicPacketPublicHeader::QuicPacketPublicHeader()
53 connection_id_length(PACKET_8BYTE_CONNECTION_ID
),
56 packet_number_length(PACKET_6BYTE_PACKET_NUMBER
) {}
58 QuicPacketPublicHeader::QuicPacketPublicHeader(
59 const QuicPacketPublicHeader
& other
)
60 : connection_id(other
.connection_id
),
61 connection_id_length(other
.connection_id_length
),
62 reset_flag(other
.reset_flag
),
63 version_flag(other
.version_flag
),
64 packet_number_length(other
.packet_number_length
),
65 versions(other
.versions
) {}
67 QuicPacketPublicHeader::~QuicPacketPublicHeader() {}
69 QuicPacketHeader::QuicPacketHeader()
70 : packet_packet_number(0),
74 is_in_fec_group(NOT_IN_FEC_GROUP
),
77 QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader
& header
)
78 : public_header(header
),
79 packet_packet_number(0),
83 is_in_fec_group(NOT_IN_FEC_GROUP
),
86 QuicPublicResetPacket::QuicPublicResetPacket()
87 : nonce_proof(0), rejected_packet_number(0) {}
89 QuicPublicResetPacket::QuicPublicResetPacket(
90 const QuicPacketPublicHeader
& header
)
91 : public_header(header
), nonce_proof(0), rejected_packet_number(0) {}
93 QuicStreamFrame::QuicStreamFrame() : stream_id(0), fin(false), offset(0) {
96 QuicStreamFrame::QuicStreamFrame(const QuicStreamFrame
& frame
)
97 : stream_id(frame
.stream_id
),
103 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id
,
105 QuicStreamOffset offset
,
107 : stream_id(stream_id
), fin(fin
), offset(offset
), data(data
) {
110 uint32
MakeQuicTag(char a
, char b
, char c
, char d
) {
111 return static_cast<uint32
>(a
) |
112 static_cast<uint32
>(b
) << 8 |
113 static_cast<uint32
>(c
) << 16 |
114 static_cast<uint32
>(d
) << 24;
117 bool ContainsQuicTag(const QuicTagVector
& tag_vector
, QuicTag tag
) {
118 return std::find(tag_vector
.begin(), tag_vector
.end(), tag
)
122 QuicVersionVector
QuicSupportedVersions() {
123 QuicVersionVector supported_versions
;
124 for (size_t i
= 0; i
< arraysize(kSupportedQuicVersions
); ++i
) {
125 supported_versions
.push_back(kSupportedQuicVersions
[i
]);
127 return supported_versions
;
130 QuicTag
QuicVersionToQuicTag(const QuicVersion version
) {
132 case QUIC_VERSION_24
:
133 return MakeQuicTag('Q', '0', '2', '4');
134 case QUIC_VERSION_25
:
135 return MakeQuicTag('Q', '0', '2', '5');
137 // This shold be an ERROR because we should never attempt to convert an
138 // invalid QuicVersion to be written to the wire.
139 LOG(ERROR
) << "Unsupported QuicVersion: " << version
;
144 QuicVersion
QuicTagToQuicVersion(const QuicTag version_tag
) {
145 for (size_t i
= 0; i
< arraysize(kSupportedQuicVersions
); ++i
) {
146 if (version_tag
== QuicVersionToQuicTag(kSupportedQuicVersions
[i
])) {
147 return kSupportedQuicVersions
[i
];
150 // Reading from the client so this should not be considered an ERROR.
151 DVLOG(1) << "Unsupported QuicTag version: "
152 << QuicUtils::TagToString(version_tag
);
153 return QUIC_VERSION_UNSUPPORTED
;
156 #define RETURN_STRING_LITERAL(x) \
160 string
QuicVersionToString(const QuicVersion version
) {
162 RETURN_STRING_LITERAL(QUIC_VERSION_24
);
163 RETURN_STRING_LITERAL(QUIC_VERSION_25
);
165 return "QUIC_VERSION_UNSUPPORTED";
169 string
QuicVersionVectorToString(const QuicVersionVector
& versions
) {
171 for (size_t i
= 0; i
< versions
.size(); ++i
) {
175 result
.append(QuicVersionToString(versions
[i
]));
180 ostream
& operator<<(ostream
& os
, const Perspective
& s
) {
181 if (s
== Perspective::IS_SERVER
) {
189 ostream
& operator<<(ostream
& os
, const QuicPacketHeader
& header
) {
190 os
<< "{ connection_id: " << header
.public_header
.connection_id
191 << ", connection_id_length:" << header
.public_header
.connection_id_length
192 << ", packet_number_length:" << header
.public_header
.packet_number_length
193 << ", reset_flag: " << header
.public_header
.reset_flag
194 << ", version_flag: " << header
.public_header
.version_flag
;
195 if (header
.public_header
.version_flag
) {
197 for (size_t i
= 0; i
< header
.public_header
.versions
.size(); ++i
) {
198 os
<< header
.public_header
.versions
[i
] << " ";
201 os
<< ", fec_flag: " << header
.fec_flag
202 << ", entropy_flag: " << header
.entropy_flag
203 << ", entropy hash: " << static_cast<int>(header
.entropy_hash
)
204 << ", packet_number: " << header
.packet_packet_number
205 << ", is_in_fec_group:" << header
.is_in_fec_group
206 << ", fec_group: " << header
.fec_group
<< "}\n";
210 bool IsAwaitingPacket(const QuicAckFrame
& ack_frame
,
211 QuicPacketNumber packet_number
) {
212 return packet_number
> ack_frame
.largest_observed
||
213 ack_frame
.missing_packets
.Contains(packet_number
);
216 QuicStopWaitingFrame::QuicStopWaitingFrame()
221 QuicStopWaitingFrame::~QuicStopWaitingFrame() {}
223 QuicAckFrame::QuicAckFrame()
226 delta_time_largest_observed(QuicTime::Delta::Infinite()),
227 is_truncated(false) {}
229 QuicAckFrame::~QuicAckFrame() {}
231 QuicRstStreamErrorCode
AdjustErrorForVersion(
232 QuicRstStreamErrorCode error_code
,
233 QuicVersion version
) {
237 QuicRstStreamFrame::QuicRstStreamFrame()
238 : stream_id(0), error_code(QUIC_STREAM_NO_ERROR
), byte_offset(0) {}
240 QuicRstStreamFrame::QuicRstStreamFrame(QuicStreamId stream_id
,
241 QuicRstStreamErrorCode error_code
,
242 QuicStreamOffset bytes_written
)
243 : stream_id(stream_id
),
244 error_code(error_code
),
245 byte_offset(bytes_written
) {
246 DCHECK_LE(error_code
, numeric_limits
<uint8
>::max());
249 QuicConnectionCloseFrame::QuicConnectionCloseFrame()
250 : error_code(QUIC_NO_ERROR
) {
253 QuicFrame::QuicFrame() {}
255 QuicFrame::QuicFrame(QuicPaddingFrame
* padding_frame
)
256 : type(PADDING_FRAME
),
257 padding_frame(padding_frame
) {
260 QuicFrame::QuicFrame(QuicStreamFrame
* stream_frame
)
261 : type(STREAM_FRAME
),
262 stream_frame(stream_frame
) {
265 QuicFrame::QuicFrame(QuicAckFrame
* frame
)
270 QuicFrame::QuicFrame(QuicMtuDiscoveryFrame
* frame
)
271 : type(MTU_DISCOVERY_FRAME
), mtu_discovery_frame(frame
) {
274 QuicFrame::QuicFrame(QuicStopWaitingFrame
* frame
)
275 : type(STOP_WAITING_FRAME
),
276 stop_waiting_frame(frame
) {
279 QuicFrame::QuicFrame(QuicPingFrame
* frame
)
284 QuicFrame::QuicFrame(QuicRstStreamFrame
* frame
)
285 : type(RST_STREAM_FRAME
),
286 rst_stream_frame(frame
) {
289 QuicFrame::QuicFrame(QuicConnectionCloseFrame
* frame
)
290 : type(CONNECTION_CLOSE_FRAME
),
291 connection_close_frame(frame
) {
294 QuicFrame::QuicFrame(QuicGoAwayFrame
* frame
)
295 : type(GOAWAY_FRAME
),
296 goaway_frame(frame
) {
299 QuicFrame::QuicFrame(QuicWindowUpdateFrame
* frame
)
300 : type(WINDOW_UPDATE_FRAME
),
301 window_update_frame(frame
) {
304 QuicFrame::QuicFrame(QuicBlockedFrame
* frame
)
305 : type(BLOCKED_FRAME
),
306 blocked_frame(frame
) {
309 QuicFecData::QuicFecData() : fec_group(0) {}
311 ostream
& operator<<(ostream
& os
, const QuicStopWaitingFrame
& sent_info
) {
312 os
<< "entropy_hash: " << static_cast<int>(sent_info
.entropy_hash
)
313 << " least_unacked: " << sent_info
.least_unacked
;
317 PacketNumberQueue::PacketNumberQueue() {}
319 PacketNumberQueue::~PacketNumberQueue() {}
321 void PacketNumberQueue::Add(QuicPacketNumber packet_number
) {
322 packet_numbers_
.insert(packet_number
);
325 void PacketNumberQueue::Add(QuicPacketNumber lower
, QuicPacketNumber higher
) {
326 for (QuicPacketNumber packet_number
= lower
; packet_number
< higher
;
332 void PacketNumberQueue::Remove(QuicPacketNumber packet_number
) {
333 packet_numbers_
.erase(packet_number
);
336 bool PacketNumberQueue::RemoveUpTo(QuicPacketNumber higher
) {
337 size_t orig_size
= packet_numbers_
.size();
338 packet_numbers_
.erase(packet_numbers_
.begin(),
339 packet_numbers_
.lower_bound(higher
));
340 return orig_size
!= packet_numbers_
.size();
343 bool PacketNumberQueue::Contains(QuicPacketNumber packet_number
) const {
344 return ContainsKey(packet_numbers_
, packet_number
);
347 bool PacketNumberQueue::Empty() const {
348 return packet_numbers_
.empty();
351 QuicPacketNumber
PacketNumberQueue::Min() const {
353 return *packet_numbers_
.begin();
356 QuicPacketNumber
PacketNumberQueue::Max() const {
358 return *packet_numbers_
.rbegin();
361 size_t PacketNumberQueue::NumPackets() const {
362 return packet_numbers_
.size();
365 PacketNumberQueue::iterator
PacketNumberQueue::begin() const {
366 return packet_numbers_
.begin();
369 PacketNumberQueue::iterator
PacketNumberQueue::end() const {
370 return packet_numbers_
.end();
373 PacketNumberQueue::const_iterator
PacketNumberQueue::lower_bound(
374 QuicPacketNumber packet_number
) const {
375 return packet_numbers_
.lower_bound(packet_number
);
378 PacketNumberQueue::const_iterator
PacketNumberQueue::upper_bound(
379 QuicPacketNumber packet_number
) const {
380 return packet_numbers_
.upper_bound(packet_number
);
383 ostream
& operator<<(ostream
& os
, const PacketNumberQueue
& q
) {
384 for (QuicPacketNumber packet_number
: q
.packet_numbers_
) {
385 os
<< packet_number
<< " ";
390 ostream
& operator<<(ostream
& os
, const QuicAckFrame
& ack_frame
) {
391 os
<< "entropy_hash: " << static_cast<int>(ack_frame
.entropy_hash
)
392 << " largest_observed: " << ack_frame
.largest_observed
393 << " delta_time_largest_observed: "
394 << ack_frame
.delta_time_largest_observed
.ToMicroseconds()
395 << " missing_packets: [ " << ack_frame
.missing_packets
396 << " ] is_truncated: " << ack_frame
.is_truncated
;
397 os
<< " revived_packets: [ ";
398 for (PacketNumberSet::const_iterator it
= ack_frame
.revived_packets
.begin();
399 it
!= ack_frame
.revived_packets
.end(); ++it
) {
402 os
<< " ] received_packets: [ ";
403 for (PacketTimeList::const_iterator it
=
404 ack_frame
.received_packet_times
.begin();
405 it
!= ack_frame
.received_packet_times
.end(); ++it
) {
406 os
<< it
->first
<< " at " << it
->second
.ToDebuggingValue() << " ";
412 ostream
& operator<<(ostream
& os
, const QuicFrame
& frame
) {
413 switch (frame
.type
) {
414 case PADDING_FRAME
: {
415 os
<< "type { PADDING_FRAME } ";
418 case RST_STREAM_FRAME
: {
419 os
<< "type { RST_STREAM_FRAME } " << *(frame
.rst_stream_frame
);
422 case CONNECTION_CLOSE_FRAME
: {
423 os
<< "type { CONNECTION_CLOSE_FRAME } "
424 << *(frame
.connection_close_frame
);
428 os
<< "type { GOAWAY_FRAME } " << *(frame
.goaway_frame
);
431 case WINDOW_UPDATE_FRAME
: {
432 os
<< "type { WINDOW_UPDATE_FRAME } " << *(frame
.window_update_frame
);
435 case BLOCKED_FRAME
: {
436 os
<< "type { BLOCKED_FRAME } " << *(frame
.blocked_frame
);
440 os
<< "type { STREAM_FRAME } " << *(frame
.stream_frame
);
444 os
<< "type { ACK_FRAME } " << *(frame
.ack_frame
);
447 case STOP_WAITING_FRAME
: {
448 os
<< "type { STOP_WAITING_FRAME } " << *(frame
.stop_waiting_frame
);
452 os
<< "type { PING_FRAME } ";
455 case MTU_DISCOVERY_FRAME
: {
456 os
<< "type { MTU_DISCOVERY_FRAME } ";
460 LOG(ERROR
) << "Unknown frame type: " << frame
.type
;
467 ostream
& operator<<(ostream
& os
, const QuicRstStreamFrame
& rst_frame
) {
468 os
<< "stream_id { " << rst_frame
.stream_id
<< " } "
469 << "error_code { " << rst_frame
.error_code
<< " } "
470 << "error_details { " << rst_frame
.error_details
<< " }\n";
474 ostream
& operator<<(ostream
& os
,
475 const QuicConnectionCloseFrame
& connection_close_frame
) {
476 os
<< "error_code { " << connection_close_frame
.error_code
<< " } "
477 << "error_details { " << connection_close_frame
.error_details
<< " }\n";
481 ostream
& operator<<(ostream
& os
, const QuicGoAwayFrame
& goaway_frame
) {
482 os
<< "error_code { " << goaway_frame
.error_code
<< " } "
483 << "last_good_stream_id { " << goaway_frame
.last_good_stream_id
<< " } "
484 << "reason_phrase { " << goaway_frame
.reason_phrase
<< " }\n";
488 ostream
& operator<<(ostream
& os
,
489 const QuicWindowUpdateFrame
& window_update_frame
) {
490 os
<< "stream_id { " << window_update_frame
.stream_id
<< " } "
491 << "byte_offset { " << window_update_frame
.byte_offset
<< " }\n";
495 ostream
& operator<<(ostream
& os
, const QuicBlockedFrame
& blocked_frame
) {
496 os
<< "stream_id { " << blocked_frame
.stream_id
<< " }\n";
500 ostream
& operator<<(ostream
& os
, const QuicStreamFrame
& stream_frame
) {
501 os
<< "stream_id { " << stream_frame
.stream_id
<< " } "
502 << "fin { " << stream_frame
.fin
<< " } "
503 << "offset { " << stream_frame
.offset
<< " } "
504 << "data { " << QuicUtils::StringToHexASCIIDump(stream_frame
.data
)
509 QuicGoAwayFrame::QuicGoAwayFrame()
510 : error_code(QUIC_NO_ERROR
),
511 last_good_stream_id(0) {
514 QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code
,
515 QuicStreamId last_good_stream_id
,
516 const string
& reason
)
517 : error_code(error_code
),
518 last_good_stream_id(last_good_stream_id
),
519 reason_phrase(reason
) {
520 DCHECK_LE(error_code
, numeric_limits
<uint8
>::max());
523 QuicData::QuicData(const char* buffer
,
527 owns_buffer_(false) {
530 QuicData::QuicData(char* buffer
,
535 owns_buffer_(owns_buffer
) {
538 QuicData::~QuicData() {
540 delete [] const_cast<char*>(buffer_
);
544 QuicWindowUpdateFrame::QuicWindowUpdateFrame(QuicStreamId stream_id
,
545 QuicStreamOffset byte_offset
)
546 : stream_id(stream_id
),
547 byte_offset(byte_offset
) {}
549 QuicBlockedFrame::QuicBlockedFrame(QuicStreamId stream_id
)
550 : stream_id(stream_id
) {}
552 QuicPacket::QuicPacket(char* buffer
,
555 QuicConnectionIdLength connection_id_length
,
556 bool includes_version
,
557 QuicPacketNumberLength packet_number_length
)
558 : QuicData(buffer
, length
, owns_buffer
),
560 connection_id_length_(connection_id_length
),
561 includes_version_(includes_version
),
562 packet_number_length_(packet_number_length
) {}
564 QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer
,
566 : QuicData(buffer
, length
) {
569 QuicEncryptedPacket::QuicEncryptedPacket(char* buffer
,
572 : QuicData(buffer
, length
, owns_buffer
) {
575 StringPiece
QuicPacket::FecProtectedData() const {
576 const size_t start_of_fec
= GetStartOfFecProtectedData(
577 connection_id_length_
, includes_version_
, packet_number_length_
);
578 return StringPiece(data() + start_of_fec
, length() - start_of_fec
);
581 StringPiece
QuicPacket::AssociatedData() const {
583 data() + kStartOfHashData
,
584 GetStartOfEncryptedData(connection_id_length_
, includes_version_
,
585 packet_number_length_
) -
589 StringPiece
QuicPacket::BeforePlaintext() const {
591 data(), GetStartOfEncryptedData(connection_id_length_
, includes_version_
,
592 packet_number_length_
));
595 StringPiece
QuicPacket::Plaintext() const {
596 const size_t start_of_encrypted_data
= GetStartOfEncryptedData(
597 connection_id_length_
, includes_version_
, packet_number_length_
);
598 return StringPiece(data() + start_of_encrypted_data
,
599 length() - start_of_encrypted_data
);
602 RetransmittableFrames::RetransmittableFrames(EncryptionLevel level
)
603 : encryption_level_(level
),
604 has_crypto_handshake_(NOT_HANDSHAKE
),
605 needs_padding_(false) {
608 RetransmittableFrames::~RetransmittableFrames() {
609 for (QuicFrames::iterator it
= frames_
.begin(); it
!= frames_
.end(); ++it
) {
612 delete it
->padding_frame
;
615 delete it
->stream_frame
;
618 delete it
->ack_frame
;
620 case MTU_DISCOVERY_FRAME
:
621 delete it
->mtu_discovery_frame
;
623 case STOP_WAITING_FRAME
:
624 delete it
->stop_waiting_frame
;
627 delete it
->ping_frame
;
629 case RST_STREAM_FRAME
:
630 delete it
->rst_stream_frame
;
632 case CONNECTION_CLOSE_FRAME
:
633 delete it
->connection_close_frame
;
636 delete it
->goaway_frame
;
638 case WINDOW_UPDATE_FRAME
:
639 delete it
->window_update_frame
;
642 delete it
->blocked_frame
;
644 case NUM_FRAME_TYPES
:
645 DCHECK(false) << "Cannot delete type: " << it
->type
;
648 for (const char* buffer
: stream_data_
) {
653 const QuicFrame
& RetransmittableFrames::AddFrame(const QuicFrame
& frame
) {
654 return AddFrame(frame
, nullptr);
657 const QuicFrame
& RetransmittableFrames::AddFrame(const QuicFrame
& frame
,
659 if (frame
.type
== STREAM_FRAME
&&
660 frame
.stream_frame
->stream_id
== kCryptoStreamId
) {
661 has_crypto_handshake_
= IS_HANDSHAKE
;
663 if (buffer
!= nullptr) {
664 stream_data_
.push_back(buffer
);
666 frames_
.push_back(frame
);
667 return frames_
.back();
670 void RetransmittableFrames::RemoveFramesForStream(QuicStreamId stream_id
) {
671 QuicFrames::iterator it
= frames_
.begin();
672 while (it
!= frames_
.end()) {
673 if (it
->type
!= STREAM_FRAME
|| it
->stream_frame
->stream_id
!= stream_id
) {
677 delete it
->stream_frame
;
678 it
= frames_
.erase(it
);
682 SerializedPacket::SerializedPacket(
683 QuicPacketNumber packet_number
,
684 QuicPacketNumberLength packet_number_length
,
685 QuicEncryptedPacket
* packet
,
686 QuicPacketEntropyHash entropy_hash
,
687 RetransmittableFrames
* retransmittable_frames
,
689 bool has_stop_waiting
)
691 retransmittable_frames(retransmittable_frames
),
692 packet_number(packet_number
),
693 packet_number_length(packet_number_length
),
694 entropy_hash(entropy_hash
),
695 is_fec_packet(false),
697 has_stop_waiting(has_stop_waiting
) {}
699 SerializedPacket::~SerializedPacket() {}
701 QuicEncryptedPacket
* QuicEncryptedPacket::Clone() const {
702 char* buffer
= new char[this->length()];
703 memcpy(buffer
, this->data(), this->length());
704 return new QuicEncryptedPacket(buffer
, this->length(), true);
707 ostream
& operator<<(ostream
& os
, const QuicEncryptedPacket
& s
) {
708 os
<< s
.length() << "-byte data";
712 TransmissionInfo::TransmissionInfo()
713 : retransmittable_frames(nullptr),
714 packet_number_length(PACKET_1BYTE_PACKET_NUMBER
),
715 sent_time(QuicTime::Zero()),
718 transmission_type(NOT_RETRANSMISSION
),
719 all_transmissions(nullptr),
722 is_fec_packet(false) {}
724 TransmissionInfo::TransmissionInfo(
725 RetransmittableFrames
* retransmittable_frames
,
726 QuicPacketNumberLength packet_number_length
,
727 TransmissionType transmission_type
,
729 QuicByteCount bytes_sent
,
731 : retransmittable_frames(retransmittable_frames
),
732 packet_number_length(packet_number_length
),
733 sent_time(sent_time
),
734 bytes_sent(bytes_sent
),
736 transmission_type(transmission_type
),
737 all_transmissions(nullptr),
740 is_fec_packet(is_fec_packet
) {}