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.sequence_number_length,
22 header.is_in_fec_group);
25 size_t GetPacketHeaderSize(QuicConnectionIdLength connection_id_length,
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);
34 size_t GetStartOfFecProtectedData(
35 QuicConnectionIdLength connection_id_length,
37 QuicSequenceNumberLength sequence_number_length) {
38 return GetPacketHeaderSize(connection_id_length,
40 sequence_number_length,
44 size_t GetStartOfEncryptedData(
45 QuicConnectionIdLength connection_id_length,
47 QuicSequenceNumberLength sequence_number_length) {
48 // Don't include the fec size, since encryption starts before private flags.
49 return GetPacketHeaderSize(connection_id_length,
51 sequence_number_length,
52 NOT_IN_FEC_GROUP) - kPrivateFlagsSize;
55 QuicPacketPublicHeader::QuicPacketPublicHeader()
57 connection_id_length(PACKET_8BYTE_CONNECTION_ID),
60 sequence_number_length(PACKET_6BYTE_SEQUENCE_NUMBER) {
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) {
73 QuicPacketPublicHeader::~QuicPacketPublicHeader() {}
75 QuicPacketHeader::QuicPacketHeader()
79 packet_sequence_number(0),
80 is_in_fec_group(NOT_IN_FEC_GROUP),
84 QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader& header)
85 : public_header(header),
89 packet_sequence_number(0),
90 is_in_fec_group(NOT_IN_FEC_GROUP),
94 QuicPublicResetPacket::QuicPublicResetPacket()
96 rejected_sequence_number(0) {}
98 QuicPublicResetPacket::QuicPublicResetPacket(
99 const QuicPacketPublicHeader& header)
100 : public_header(header),
102 rejected_sequence_number(0) {}
104 QuicStreamFrame::QuicStreamFrame()
110 QuicStreamFrame::QuicStreamFrame(const QuicStreamFrame& frame)
111 : stream_id(frame.stream_id),
113 offset(frame.offset),
115 notifier(frame.notifier) {
118 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id,
120 QuicStreamOffset offset,
122 : stream_id(stream_id),
129 string* QuicStreamFrame::GetDataAsString() const {
130 string* data_string = new string();
131 data_string->reserve(data.TotalBufferSize());
132 for (size_t i = 0; i < data.Size(); ++i) {
133 data_string->append(static_cast<char*>(data.iovec()[i].iov_base),
134 data.iovec()[i].iov_len);
136 DCHECK_EQ(data_string->size(), data.TotalBufferSize());
140 uint32 MakeQuicTag(char a, char b, char c, char d) {
141 return static_cast<uint32>(a) |
142 static_cast<uint32>(b) << 8 |
143 static_cast<uint32>(c) << 16 |
144 static_cast<uint32>(d) << 24;
147 QuicVersionVector QuicSupportedVersions() {
148 QuicVersionVector supported_versions;
149 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
150 supported_versions.push_back(kSupportedQuicVersions[i]);
152 return supported_versions;
155 QuicTag QuicVersionToQuicTag(const QuicVersion version) {
157 case QUIC_VERSION_15:
158 return MakeQuicTag('Q', '0', '1', '5');
159 case QUIC_VERSION_16:
160 return MakeQuicTag('Q', '0', '1', '6');
161 case QUIC_VERSION_17:
162 return MakeQuicTag('Q', '0', '1', '7');
163 case QUIC_VERSION_18:
164 return MakeQuicTag('Q', '0', '1', '8');
165 case QUIC_VERSION_19:
166 return MakeQuicTag('Q', '0', '1', '9');
168 // This shold be an ERROR because we should never attempt to convert an
169 // invalid QuicVersion to be written to the wire.
170 LOG(ERROR) << "Unsupported QuicVersion: " << version;
175 QuicVersion QuicTagToQuicVersion(const QuicTag version_tag) {
176 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
177 if (version_tag == QuicVersionToQuicTag(kSupportedQuicVersions[i])) {
178 return kSupportedQuicVersions[i];
181 // Reading from the client so this should not be considered an ERROR.
182 DVLOG(1) << "Unsupported QuicTag version: "
183 << QuicUtils::TagToString(version_tag);
184 return QUIC_VERSION_UNSUPPORTED;
187 #define RETURN_STRING_LITERAL(x) \
191 string QuicVersionToString(const QuicVersion version) {
193 RETURN_STRING_LITERAL(QUIC_VERSION_15);
194 RETURN_STRING_LITERAL(QUIC_VERSION_16);
195 RETURN_STRING_LITERAL(QUIC_VERSION_17);
196 RETURN_STRING_LITERAL(QUIC_VERSION_18);
197 RETURN_STRING_LITERAL(QUIC_VERSION_19);
199 return "QUIC_VERSION_UNSUPPORTED";
203 string QuicVersionVectorToString(const QuicVersionVector& versions) {
205 for (size_t i = 0; i < versions.size(); ++i) {
209 result.append(QuicVersionToString(versions[i]));
214 ostream& operator<<(ostream& os, const QuicPacketHeader& header) {
215 os << "{ connection_id: " << header.public_header.connection_id
216 << ", connection_id_length:" << header.public_header.connection_id_length
217 << ", sequence_number_length:"
218 << header.public_header.sequence_number_length
219 << ", reset_flag: " << header.public_header.reset_flag
220 << ", version_flag: " << header.public_header.version_flag;
221 if (header.public_header.version_flag) {
223 for (size_t i = 0; i < header.public_header.versions.size(); ++i) {
224 os << header.public_header.versions[0] << " ";
227 os << ", fec_flag: " << header.fec_flag
228 << ", entropy_flag: " << header.entropy_flag
229 << ", entropy hash: " << static_cast<int>(header.entropy_hash)
230 << ", sequence_number: " << header.packet_sequence_number
231 << ", is_in_fec_group:" << header.is_in_fec_group
232 << ", fec_group: " << header.fec_group<< "}\n";
236 ReceivedPacketInfo::ReceivedPacketInfo()
239 delta_time_largest_observed(QuicTime::Delta::Infinite()),
240 is_truncated(false) {}
242 ReceivedPacketInfo::~ReceivedPacketInfo() {}
244 bool IsAwaitingPacket(const ReceivedPacketInfo& received_info,
245 QuicPacketSequenceNumber sequence_number) {
246 return sequence_number > received_info.largest_observed ||
247 ContainsKey(received_info.missing_packets, sequence_number);
250 void InsertMissingPacketsBetween(ReceivedPacketInfo* received_info,
251 QuicPacketSequenceNumber lower,
252 QuicPacketSequenceNumber higher) {
253 for (QuicPacketSequenceNumber i = lower; i < higher; ++i) {
254 received_info->missing_packets.insert(i);
258 QuicStopWaitingFrame::QuicStopWaitingFrame()
263 QuicStopWaitingFrame::~QuicStopWaitingFrame() {}
265 QuicAckFrame::QuicAckFrame() {}
267 CongestionFeedbackMessageTCP::CongestionFeedbackMessageTCP()
268 : receive_window(0) {
271 CongestionFeedbackMessageInterArrival::CongestionFeedbackMessageInterArrival() {
274 CongestionFeedbackMessageInterArrival::
275 ~CongestionFeedbackMessageInterArrival() {}
277 QuicCongestionFeedbackFrame::QuicCongestionFeedbackFrame() : type(kTCP) {}
279 QuicCongestionFeedbackFrame::~QuicCongestionFeedbackFrame() {}
281 QuicRstStreamErrorCode AdjustErrorForVersion(
282 QuicRstStreamErrorCode error_code,
283 QuicVersion version) {
284 switch (error_code) {
285 case QUIC_RST_FLOW_CONTROL_ACCOUNTING:
286 if (version <= QUIC_VERSION_17) {
287 return QUIC_STREAM_NO_ERROR;
296 QuicRstStreamFrame::QuicRstStreamFrame()
298 error_code(QUIC_STREAM_NO_ERROR) {
301 QuicRstStreamFrame::QuicRstStreamFrame(QuicStreamId stream_id,
302 QuicRstStreamErrorCode error_code,
303 QuicStreamOffset bytes_written)
304 : stream_id(stream_id),
305 error_code(error_code),
306 byte_offset(bytes_written) {
307 DCHECK_LE(error_code, numeric_limits<uint8>::max());
310 QuicConnectionCloseFrame::QuicConnectionCloseFrame()
311 : error_code(QUIC_NO_ERROR) {
314 QuicFrame::QuicFrame() {}
316 QuicFrame::QuicFrame(QuicPaddingFrame* padding_frame)
317 : type(PADDING_FRAME),
318 padding_frame(padding_frame) {
321 QuicFrame::QuicFrame(QuicStreamFrame* stream_frame)
322 : type(STREAM_FRAME),
323 stream_frame(stream_frame) {
326 QuicFrame::QuicFrame(QuicAckFrame* frame)
331 QuicFrame::QuicFrame(QuicCongestionFeedbackFrame* frame)
332 : type(CONGESTION_FEEDBACK_FRAME),
333 congestion_feedback_frame(frame) {
336 QuicFrame::QuicFrame(QuicStopWaitingFrame* frame)
337 : type(STOP_WAITING_FRAME),
338 stop_waiting_frame(frame) {
341 QuicFrame::QuicFrame(QuicPingFrame* frame)
346 QuicFrame::QuicFrame(QuicRstStreamFrame* frame)
347 : type(RST_STREAM_FRAME),
348 rst_stream_frame(frame) {
351 QuicFrame::QuicFrame(QuicConnectionCloseFrame* frame)
352 : type(CONNECTION_CLOSE_FRAME),
353 connection_close_frame(frame) {
356 QuicFrame::QuicFrame(QuicGoAwayFrame* frame)
357 : type(GOAWAY_FRAME),
358 goaway_frame(frame) {
361 QuicFrame::QuicFrame(QuicWindowUpdateFrame* frame)
362 : type(WINDOW_UPDATE_FRAME),
363 window_update_frame(frame) {
366 QuicFrame::QuicFrame(QuicBlockedFrame* frame)
367 : type(BLOCKED_FRAME),
368 blocked_frame(frame) {
371 QuicFecData::QuicFecData() : fec_group(0) {}
373 ostream& operator<<(ostream& os, const QuicStopWaitingFrame& sent_info) {
374 os << "entropy_hash: " << static_cast<int>(sent_info.entropy_hash)
375 << " least_unacked: " << sent_info.least_unacked;
379 ostream& operator<<(ostream& os, const ReceivedPacketInfo& received_info) {
380 os << "entropy_hash: " << static_cast<int>(received_info.entropy_hash)
381 << " is_truncated: " << received_info.is_truncated
382 << " largest_observed: " << received_info.largest_observed
383 << " delta_time_largest_observed: "
384 << received_info.delta_time_largest_observed.ToMicroseconds()
385 << " missing_packets: [ ";
386 for (SequenceNumberSet::const_iterator it =
387 received_info.missing_packets.begin();
388 it != received_info.missing_packets.end(); ++it) {
391 os << " ] revived_packets: [ ";
392 for (SequenceNumberSet::const_iterator it =
393 received_info.revived_packets.begin();
394 it != received_info.revived_packets.end(); ++it) {
401 ostream& operator<<(ostream& os, const QuicFrame& frame) {
402 switch (frame.type) {
403 case PADDING_FRAME: {
404 os << "type { PADDING_FRAME } ";
407 case RST_STREAM_FRAME: {
408 os << "type { " << RST_STREAM_FRAME << " } " << *(frame.rst_stream_frame);
411 case CONNECTION_CLOSE_FRAME: {
412 os << "type { CONNECTION_CLOSE_FRAME } "
413 << *(frame.connection_close_frame);
417 os << "type { GOAWAY_FRAME } " << *(frame.goaway_frame);
420 case WINDOW_UPDATE_FRAME: {
421 os << "type { WINDOW_UPDATE_FRAME } " << *(frame.window_update_frame);
424 case BLOCKED_FRAME: {
425 os << "type { BLOCKED_FRAME } " << *(frame.blocked_frame);
429 os << "type { STREAM_FRAME } " << *(frame.stream_frame);
433 os << "type { ACK_FRAME } " << *(frame.ack_frame);
436 case CONGESTION_FEEDBACK_FRAME: {
437 os << "type { CONGESTION_FEEDBACK_FRAME } "
438 << *(frame.congestion_feedback_frame);
441 case STOP_WAITING_FRAME: {
442 os << "type { STOP_WAITING_FRAME } " << *(frame.stop_waiting_frame);
446 LOG(ERROR) << "Unknown frame type: " << frame.type;
453 ostream& operator<<(ostream& os, const QuicRstStreamFrame& rst_frame) {
454 os << "stream_id { " << rst_frame.stream_id << " } "
455 << "error_code { " << rst_frame.error_code << " } "
456 << "error_details { " << rst_frame.error_details << " }\n";
460 ostream& operator<<(ostream& os,
461 const QuicConnectionCloseFrame& connection_close_frame) {
462 os << "error_code { " << connection_close_frame.error_code << " } "
463 << "error_details { " << connection_close_frame.error_details << " }\n";
467 ostream& operator<<(ostream& os, const QuicGoAwayFrame& goaway_frame) {
468 os << "error_code { " << goaway_frame.error_code << " } "
469 << "last_good_stream_id { " << goaway_frame.last_good_stream_id << " } "
470 << "reason_phrase { " << goaway_frame.reason_phrase << " }\n";
474 ostream& operator<<(ostream& os,
475 const QuicWindowUpdateFrame& window_update_frame) {
476 os << "stream_id { " << window_update_frame.stream_id << " } "
477 << "byte_offset { " << window_update_frame.byte_offset << " }\n";
481 ostream& operator<<(ostream& os, const QuicBlockedFrame& blocked_frame) {
482 os << "stream_id { " << blocked_frame.stream_id << " }\n";
486 ostream& operator<<(ostream& os, const QuicStreamFrame& stream_frame) {
487 os << "stream_id { " << stream_frame.stream_id << " } "
488 << "fin { " << stream_frame.fin << " } "
489 << "offset { " << stream_frame.offset << " } "
491 << QuicUtils::StringToHexASCIIDump(*(stream_frame.GetDataAsString()))
496 ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) {
497 os << "sent info { " << ack_frame.sent_info << " } "
498 << "received info { " << ack_frame.received_info << " }\n";
502 ostream& operator<<(ostream& os,
503 const QuicCongestionFeedbackFrame& congestion_frame) {
504 os << "type: " << congestion_frame.type;
505 switch (congestion_frame.type) {
506 case kInterArrival: {
507 const CongestionFeedbackMessageInterArrival& inter_arrival =
508 congestion_frame.inter_arrival;
509 os << " received packets: [ ";
510 for (TimeMap::const_iterator it =
511 inter_arrival.received_packet_times.begin();
512 it != inter_arrival.received_packet_times.end(); ++it) {
513 os << it->first << "@" << it->second.ToDebuggingValue() << " ";
519 os << " bitrate_in_bytes_per_second: "
520 << congestion_frame.fix_rate.bitrate.ToBytesPerSecond();
524 const CongestionFeedbackMessageTCP& tcp = congestion_frame.tcp;
525 os << " receive_window: " << tcp.receive_window;
532 CongestionFeedbackMessageFixRate::CongestionFeedbackMessageFixRate()
533 : bitrate(QuicBandwidth::Zero()) {
536 QuicGoAwayFrame::QuicGoAwayFrame()
537 : error_code(QUIC_NO_ERROR),
538 last_good_stream_id(0) {
541 QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code,
542 QuicStreamId last_good_stream_id,
543 const string& reason)
544 : error_code(error_code),
545 last_good_stream_id(last_good_stream_id),
546 reason_phrase(reason) {
547 DCHECK_LE(error_code, numeric_limits<uint8>::max());
550 QuicData::QuicData(const char* buffer,
554 owns_buffer_(false) {
557 QuicData::QuicData(char* buffer,
562 owns_buffer_(owns_buffer) {
565 QuicData::~QuicData() {
567 delete [] const_cast<char*>(buffer_);
571 QuicWindowUpdateFrame::QuicWindowUpdateFrame(QuicStreamId stream_id,
572 QuicStreamOffset byte_offset)
573 : stream_id(stream_id),
574 byte_offset(byte_offset) {}
576 QuicBlockedFrame::QuicBlockedFrame(QuicStreamId stream_id)
577 : stream_id(stream_id) {}
579 QuicPacket::QuicPacket(char* buffer,
582 QuicConnectionIdLength connection_id_length,
583 bool includes_version,
584 QuicSequenceNumberLength sequence_number_length,
586 : QuicData(buffer, length, owns_buffer),
588 is_fec_packet_(is_fec_packet),
589 connection_id_length_(connection_id_length),
590 includes_version_(includes_version),
591 sequence_number_length_(sequence_number_length) {
594 QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer,
596 : QuicData(buffer, length) {
599 QuicEncryptedPacket::QuicEncryptedPacket(char* buffer,
602 : QuicData(buffer, length, owns_buffer) {
605 StringPiece QuicPacket::FecProtectedData() const {
606 const size_t start_of_fec = GetStartOfFecProtectedData(
607 connection_id_length_, includes_version_, sequence_number_length_);
608 return StringPiece(data() + start_of_fec, length() - start_of_fec);
611 StringPiece QuicPacket::AssociatedData() const {
613 data() + kStartOfHashData,
614 GetStartOfEncryptedData(
615 connection_id_length_, includes_version_, sequence_number_length_) -
619 StringPiece QuicPacket::BeforePlaintext() const {
620 return StringPiece(data(), GetStartOfEncryptedData(connection_id_length_,
622 sequence_number_length_));
625 StringPiece QuicPacket::Plaintext() const {
626 const size_t start_of_encrypted_data =
627 GetStartOfEncryptedData(
628 connection_id_length_, includes_version_, sequence_number_length_);
629 return StringPiece(data() + start_of_encrypted_data,
630 length() - start_of_encrypted_data);
633 RetransmittableFrames::RetransmittableFrames()
634 : encryption_level_(NUM_ENCRYPTION_LEVELS) {
637 RetransmittableFrames::~RetransmittableFrames() {
638 for (QuicFrames::iterator it = frames_.begin(); it != frames_.end(); ++it) {
641 delete it->padding_frame;
644 delete it->stream_frame;
647 delete it->ack_frame;
649 case CONGESTION_FEEDBACK_FRAME:
650 delete it->congestion_feedback_frame;
652 case STOP_WAITING_FRAME:
653 delete it->stop_waiting_frame;
656 delete it->ping_frame;
658 case RST_STREAM_FRAME:
659 delete it->rst_stream_frame;
661 case CONNECTION_CLOSE_FRAME:
662 delete it->connection_close_frame;
665 delete it->goaway_frame;
667 case WINDOW_UPDATE_FRAME:
668 delete it->window_update_frame;
671 delete it->blocked_frame;
673 case NUM_FRAME_TYPES:
674 DCHECK(false) << "Cannot delete type: " << it->type;
677 STLDeleteElements(&stream_data_);
680 const QuicFrame& RetransmittableFrames::AddStreamFrame(
681 QuicStreamFrame* stream_frame) {
682 // Make an owned copy of the stream frame's data.
683 stream_data_.push_back(stream_frame->GetDataAsString());
684 // Ensure the stream frame's IOVector points to the owned copy of the data.
685 stream_frame->data.Clear();
686 stream_frame->data.Append(const_cast<char*>(stream_data_.back()->data()),
687 stream_data_.back()->size());
688 frames_.push_back(QuicFrame(stream_frame));
689 return frames_.back();
692 const QuicFrame& RetransmittableFrames::AddNonStreamFrame(
693 const QuicFrame& frame) {
694 DCHECK_NE(frame.type, STREAM_FRAME);
695 frames_.push_back(frame);
696 return frames_.back();
699 IsHandshake RetransmittableFrames::HasCryptoHandshake() const {
700 for (size_t i = 0; i < frames().size(); ++i) {
701 if (frames()[i].type == STREAM_FRAME &&
702 frames()[i].stream_frame->stream_id == kCryptoStreamId) {
706 return NOT_HANDSHAKE;
709 void RetransmittableFrames::set_encryption_level(EncryptionLevel level) {
710 encryption_level_ = level;
713 SerializedPacket::SerializedPacket(
714 QuicPacketSequenceNumber sequence_number,
715 QuicSequenceNumberLength sequence_number_length,
717 QuicPacketEntropyHash entropy_hash,
718 RetransmittableFrames* retransmittable_frames)
719 : sequence_number(sequence_number),
720 sequence_number_length(sequence_number_length),
722 entropy_hash(entropy_hash),
723 retransmittable_frames(retransmittable_frames) {
726 SerializedPacket::~SerializedPacket() {}
728 QuicEncryptedPacket* QuicEncryptedPacket::Clone() const {
729 char* buffer = new char[this->length()];
730 memcpy(buffer, this->data(), this->length());
731 return new QuicEncryptedPacket(buffer, this->length(), true);
734 ostream& operator<<(ostream& os, const QuicEncryptedPacket& s) {
735 os << s.length() << "-byte data";
739 TransmissionInfo::TransmissionInfo()
740 : retransmittable_frames(NULL),
741 sequence_number_length(PACKET_1BYTE_SEQUENCE_NUMBER),
742 sent_time(QuicTime::Zero()),
745 all_transmissions(NULL),
748 TransmissionInfo::TransmissionInfo(
749 RetransmittableFrames* retransmittable_frames,
750 QuicPacketSequenceNumber sequence_number,
751 QuicSequenceNumberLength sequence_number_length)
752 : retransmittable_frames(retransmittable_frames),
753 sequence_number_length(sequence_number_length),
754 sent_time(QuicTime::Zero()),
757 all_transmissions(new SequenceNumberSet),
759 all_transmissions->insert(sequence_number);
762 TransmissionInfo::TransmissionInfo(
763 RetransmittableFrames* retransmittable_frames,
764 QuicPacketSequenceNumber sequence_number,
765 QuicSequenceNumberLength sequence_number_length,
766 SequenceNumberSet* all_transmissions)
767 : retransmittable_frames(retransmittable_frames),
768 sequence_number_length(sequence_number_length),
769 sent_time(QuicTime::Zero()),
772 all_transmissions(all_transmissions),
774 all_transmissions->insert(sequence_number);
777 QuicConsumedData::QuicConsumedData(size_t bytes_consumed,
779 : bytes_consumed(bytes_consumed),
780 fin_consumed(fin_consumed) {
783 ostream& operator<<(ostream& os, const QuicConsumedData& s) {
784 os << "bytes_consumed: " << s.bytes_consumed
785 << " fin_consumed: " << s.fin_consumed;
789 WriteResult::WriteResult()
790 : status(WRITE_STATUS_ERROR),
794 WriteResult::WriteResult(WriteStatus status,
795 int bytes_written_or_error_code)
797 bytes_written(bytes_written_or_error_code) {