Index: net/quic/quic_protocol.cc |
diff --git a/net/quic/quic_protocol.cc b/net/quic/quic_protocol.cc |
deleted file mode 100644 |
index 6ad07431e4bb36fae4c779e97900ef63b7970986..0000000000000000000000000000000000000000 |
--- a/net/quic/quic_protocol.cc |
+++ /dev/null |
@@ -1,685 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "net/quic/quic_protocol.h" |
- |
-#include "base/stl_util.h" |
-#include "net/quic/quic_utils.h" |
- |
-using base::StringPiece; |
-using std::map; |
-using std::numeric_limits; |
-using std::ostream; |
-using std::string; |
- |
-namespace net { |
- |
-size_t GetPacketHeaderSize(const QuicPacketHeader& header) { |
- return GetPacketHeaderSize(header.public_header.connection_id_length, |
- header.public_header.version_flag, |
- header.public_header.sequence_number_length, |
- header.is_in_fec_group); |
-} |
- |
-size_t GetPacketHeaderSize(QuicConnectionIdLength connection_id_length, |
- bool include_version, |
- QuicSequenceNumberLength sequence_number_length, |
- InFecGroup is_in_fec_group) { |
- return kPublicFlagsSize + connection_id_length + |
- (include_version ? kQuicVersionSize : 0) + sequence_number_length + |
- kPrivateFlagsSize + (is_in_fec_group == IN_FEC_GROUP ? kFecGroupSize : 0); |
-} |
- |
-size_t GetStartOfFecProtectedData( |
- QuicConnectionIdLength connection_id_length, |
- bool include_version, |
- QuicSequenceNumberLength sequence_number_length) { |
- return GetPacketHeaderSize(connection_id_length, |
- include_version, |
- sequence_number_length, |
- IN_FEC_GROUP); |
-} |
- |
-size_t GetStartOfEncryptedData( |
- QuicConnectionIdLength connection_id_length, |
- bool include_version, |
- QuicSequenceNumberLength sequence_number_length) { |
- // Don't include the fec size, since encryption starts before private flags. |
- return GetPacketHeaderSize(connection_id_length, |
- include_version, |
- sequence_number_length, |
- NOT_IN_FEC_GROUP) - kPrivateFlagsSize; |
-} |
- |
-QuicPacketPublicHeader::QuicPacketPublicHeader() |
- : connection_id(0), |
- connection_id_length(PACKET_8BYTE_CONNECTION_ID), |
- reset_flag(false), |
- version_flag(false), |
- sequence_number_length(PACKET_6BYTE_SEQUENCE_NUMBER) { |
-} |
- |
-QuicPacketPublicHeader::QuicPacketPublicHeader( |
- const QuicPacketPublicHeader& other) |
- : connection_id(other.connection_id), |
- connection_id_length(other.connection_id_length), |
- reset_flag(other.reset_flag), |
- version_flag(other.version_flag), |
- sequence_number_length(other.sequence_number_length), |
- versions(other.versions) { |
-} |
- |
-QuicPacketPublicHeader::~QuicPacketPublicHeader() {} |
- |
-QuicPacketHeader::QuicPacketHeader() |
- : fec_flag(false), |
- entropy_flag(false), |
- entropy_hash(0), |
- packet_sequence_number(0), |
- is_in_fec_group(NOT_IN_FEC_GROUP), |
- fec_group(0) { |
-} |
- |
-QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader& header) |
- : public_header(header), |
- fec_flag(false), |
- entropy_flag(false), |
- entropy_hash(0), |
- packet_sequence_number(0), |
- is_in_fec_group(NOT_IN_FEC_GROUP), |
- fec_group(0) { |
-} |
- |
-QuicPublicResetPacket::QuicPublicResetPacket() |
- : nonce_proof(0), |
- rejected_sequence_number(0) {} |
- |
-QuicPublicResetPacket::QuicPublicResetPacket( |
- const QuicPacketPublicHeader& header) |
- : public_header(header), |
- nonce_proof(0), |
- rejected_sequence_number(0) {} |
- |
-QuicStreamFrame::QuicStreamFrame() |
- : stream_id(0), |
- fin(false), |
- offset(0), |
- notifier(nullptr) {} |
- |
-QuicStreamFrame::QuicStreamFrame(const QuicStreamFrame& frame) |
- : stream_id(frame.stream_id), |
- fin(frame.fin), |
- offset(frame.offset), |
- data(frame.data), |
- notifier(frame.notifier) { |
-} |
- |
-QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id, |
- bool fin, |
- QuicStreamOffset offset, |
- IOVector data) |
- : stream_id(stream_id), |
- fin(fin), |
- offset(offset), |
- data(data), |
- notifier(nullptr) {} |
- |
-string* QuicStreamFrame::GetDataAsString() const { |
- string* data_string = new string(); |
- data_string->reserve(data.TotalBufferSize()); |
- for (size_t i = 0; i < data.Size(); ++i) { |
- data_string->append(static_cast<char*>(data.iovec()[i].iov_base), |
- data.iovec()[i].iov_len); |
- } |
- DCHECK_EQ(data_string->size(), data.TotalBufferSize()); |
- return data_string; |
-} |
- |
-uint32 MakeQuicTag(char a, char b, char c, char d) { |
- return static_cast<uint32>(a) | |
- static_cast<uint32>(b) << 8 | |
- static_cast<uint32>(c) << 16 | |
- static_cast<uint32>(d) << 24; |
-} |
- |
-bool ContainsQuicTag(const QuicTagVector& tag_vector, QuicTag tag) { |
- return std::find(tag_vector.begin(), tag_vector.end(), tag) |
- != tag_vector.end(); |
-} |
- |
-QuicVersionVector QuicSupportedVersions() { |
- QuicVersionVector supported_versions; |
- for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { |
- supported_versions.push_back(kSupportedQuicVersions[i]); |
- } |
- return supported_versions; |
-} |
- |
-QuicTag QuicVersionToQuicTag(const QuicVersion version) { |
- switch (version) { |
- case QUIC_VERSION_23: |
- return MakeQuicTag('Q', '0', '2', '3'); |
- case QUIC_VERSION_24: |
- return MakeQuicTag('Q', '0', '2', '4'); |
- default: |
- // This shold be an ERROR because we should never attempt to convert an |
- // invalid QuicVersion to be written to the wire. |
- LOG(ERROR) << "Unsupported QuicVersion: " << version; |
- return 0; |
- } |
-} |
- |
-QuicVersion QuicTagToQuicVersion(const QuicTag version_tag) { |
- for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { |
- if (version_tag == QuicVersionToQuicTag(kSupportedQuicVersions[i])) { |
- return kSupportedQuicVersions[i]; |
- } |
- } |
- // Reading from the client so this should not be considered an ERROR. |
- DVLOG(1) << "Unsupported QuicTag version: " |
- << QuicUtils::TagToString(version_tag); |
- return QUIC_VERSION_UNSUPPORTED; |
-} |
- |
-#define RETURN_STRING_LITERAL(x) \ |
-case x: \ |
-return #x |
- |
-string QuicVersionToString(const QuicVersion version) { |
- switch (version) { |
- RETURN_STRING_LITERAL(QUIC_VERSION_23); |
- RETURN_STRING_LITERAL(QUIC_VERSION_24); |
- default: |
- return "QUIC_VERSION_UNSUPPORTED"; |
- } |
-} |
- |
-string QuicVersionVectorToString(const QuicVersionVector& versions) { |
- string result = ""; |
- for (size_t i = 0; i < versions.size(); ++i) { |
- if (i != 0) { |
- result.append(","); |
- } |
- result.append(QuicVersionToString(versions[i])); |
- } |
- return result; |
-} |
- |
-ostream& operator<<(ostream& os, const QuicPacketHeader& header) { |
- os << "{ connection_id: " << header.public_header.connection_id |
- << ", connection_id_length:" << header.public_header.connection_id_length |
- << ", sequence_number_length:" |
- << header.public_header.sequence_number_length |
- << ", reset_flag: " << header.public_header.reset_flag |
- << ", version_flag: " << header.public_header.version_flag; |
- if (header.public_header.version_flag) { |
- os << " version: "; |
- for (size_t i = 0; i < header.public_header.versions.size(); ++i) { |
- os << header.public_header.versions[0] << " "; |
- } |
- } |
- os << ", fec_flag: " << header.fec_flag |
- << ", entropy_flag: " << header.entropy_flag |
- << ", entropy hash: " << static_cast<int>(header.entropy_hash) |
- << ", sequence_number: " << header.packet_sequence_number |
- << ", is_in_fec_group:" << header.is_in_fec_group |
- << ", fec_group: " << header.fec_group<< "}\n"; |
- return os; |
-} |
- |
-bool IsAwaitingPacket(const QuicAckFrame& ack_frame, |
- QuicPacketSequenceNumber sequence_number) { |
- return sequence_number > ack_frame.largest_observed || |
- ContainsKey(ack_frame.missing_packets, sequence_number); |
-} |
- |
-void InsertMissingPacketsBetween(QuicAckFrame* ack_frame, |
- QuicPacketSequenceNumber lower, |
- QuicPacketSequenceNumber higher) { |
- for (QuicPacketSequenceNumber i = lower; i < higher; ++i) { |
- ack_frame->missing_packets.insert(i); |
- } |
-} |
- |
-QuicStopWaitingFrame::QuicStopWaitingFrame() |
- : entropy_hash(0), |
- least_unacked(0) { |
-} |
- |
-QuicStopWaitingFrame::~QuicStopWaitingFrame() {} |
- |
-QuicAckFrame::QuicAckFrame() |
- : entropy_hash(0), |
- largest_observed(0), |
- delta_time_largest_observed(QuicTime::Delta::Infinite()), |
- is_truncated(false) {} |
- |
-QuicAckFrame::~QuicAckFrame() {} |
- |
-QuicRstStreamErrorCode AdjustErrorForVersion( |
- QuicRstStreamErrorCode error_code, |
- QuicVersion version) { |
- return error_code; |
-} |
- |
-QuicRstStreamFrame::QuicRstStreamFrame() |
- : stream_id(0), |
- error_code(QUIC_STREAM_NO_ERROR) { |
-} |
- |
-QuicRstStreamFrame::QuicRstStreamFrame(QuicStreamId stream_id, |
- QuicRstStreamErrorCode error_code, |
- QuicStreamOffset bytes_written) |
- : stream_id(stream_id), |
- error_code(error_code), |
- byte_offset(bytes_written) { |
- DCHECK_LE(error_code, numeric_limits<uint8>::max()); |
-} |
- |
-QuicConnectionCloseFrame::QuicConnectionCloseFrame() |
- : error_code(QUIC_NO_ERROR) { |
-} |
- |
-QuicFrame::QuicFrame() {} |
- |
-QuicFrame::QuicFrame(QuicPaddingFrame* padding_frame) |
- : type(PADDING_FRAME), |
- padding_frame(padding_frame) { |
-} |
- |
-QuicFrame::QuicFrame(QuicStreamFrame* stream_frame) |
- : type(STREAM_FRAME), |
- stream_frame(stream_frame) { |
-} |
- |
-QuicFrame::QuicFrame(QuicAckFrame* frame) |
- : type(ACK_FRAME), |
- ack_frame(frame) { |
-} |
- |
-QuicFrame::QuicFrame(QuicStopWaitingFrame* frame) |
- : type(STOP_WAITING_FRAME), |
- stop_waiting_frame(frame) { |
-} |
- |
-QuicFrame::QuicFrame(QuicPingFrame* frame) |
- : type(PING_FRAME), |
- ping_frame(frame) { |
-} |
- |
-QuicFrame::QuicFrame(QuicRstStreamFrame* frame) |
- : type(RST_STREAM_FRAME), |
- rst_stream_frame(frame) { |
-} |
- |
-QuicFrame::QuicFrame(QuicConnectionCloseFrame* frame) |
- : type(CONNECTION_CLOSE_FRAME), |
- connection_close_frame(frame) { |
-} |
- |
-QuicFrame::QuicFrame(QuicGoAwayFrame* frame) |
- : type(GOAWAY_FRAME), |
- goaway_frame(frame) { |
-} |
- |
-QuicFrame::QuicFrame(QuicWindowUpdateFrame* frame) |
- : type(WINDOW_UPDATE_FRAME), |
- window_update_frame(frame) { |
-} |
- |
-QuicFrame::QuicFrame(QuicBlockedFrame* frame) |
- : type(BLOCKED_FRAME), |
- blocked_frame(frame) { |
-} |
- |
-QuicFecData::QuicFecData() : fec_group(0) {} |
- |
-ostream& operator<<(ostream& os, const QuicStopWaitingFrame& sent_info) { |
- os << "entropy_hash: " << static_cast<int>(sent_info.entropy_hash) |
- << " least_unacked: " << sent_info.least_unacked; |
- return os; |
-} |
- |
-ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) { |
- os << "entropy_hash: " << static_cast<int>(ack_frame.entropy_hash) |
- << " largest_observed: " << ack_frame.largest_observed |
- << " delta_time_largest_observed: " |
- << ack_frame.delta_time_largest_observed.ToMicroseconds() |
- << " missing_packets: [ "; |
- for (SequenceNumberSet::const_iterator it = ack_frame.missing_packets.begin(); |
- it != ack_frame.missing_packets.end(); ++it) { |
- os << *it << " "; |
- } |
- os << " ] is_truncated: " << ack_frame.is_truncated; |
- os << " revived_packets: [ "; |
- for (SequenceNumberSet::const_iterator it = ack_frame.revived_packets.begin(); |
- it != ack_frame.revived_packets.end(); ++it) { |
- os << *it << " "; |
- } |
- os << " ] received_packets: [ "; |
- for (PacketTimeList::const_iterator it = |
- ack_frame.received_packet_times.begin(); |
- it != ack_frame.received_packet_times.end(); ++it) { |
- os << it->first << " at " << it->second.ToDebuggingValue() << " "; |
- } |
- os << " ]"; |
- return os; |
-} |
- |
-ostream& operator<<(ostream& os, const QuicFrame& frame) { |
- switch (frame.type) { |
- case PADDING_FRAME: { |
- os << "type { PADDING_FRAME } "; |
- break; |
- } |
- case RST_STREAM_FRAME: { |
- os << "type { " << RST_STREAM_FRAME << " } " << *(frame.rst_stream_frame); |
- break; |
- } |
- case CONNECTION_CLOSE_FRAME: { |
- os << "type { CONNECTION_CLOSE_FRAME } " |
- << *(frame.connection_close_frame); |
- break; |
- } |
- case GOAWAY_FRAME: { |
- os << "type { GOAWAY_FRAME } " << *(frame.goaway_frame); |
- break; |
- } |
- case WINDOW_UPDATE_FRAME: { |
- os << "type { WINDOW_UPDATE_FRAME } " << *(frame.window_update_frame); |
- break; |
- } |
- case BLOCKED_FRAME: { |
- os << "type { BLOCKED_FRAME } " << *(frame.blocked_frame); |
- break; |
- } |
- case STREAM_FRAME: { |
- os << "type { STREAM_FRAME } " << *(frame.stream_frame); |
- break; |
- } |
- case ACK_FRAME: { |
- os << "type { ACK_FRAME } " << *(frame.ack_frame); |
- break; |
- } |
- case STOP_WAITING_FRAME: { |
- os << "type { STOP_WAITING_FRAME } " << *(frame.stop_waiting_frame); |
- break; |
- } |
- case PING_FRAME: { |
- os << "type { PING_FRAME } "; |
- break; |
- } |
- default: { |
- LOG(ERROR) << "Unknown frame type: " << frame.type; |
- break; |
- } |
- } |
- return os; |
-} |
- |
-ostream& operator<<(ostream& os, const QuicRstStreamFrame& rst_frame) { |
- os << "stream_id { " << rst_frame.stream_id << " } " |
- << "error_code { " << rst_frame.error_code << " } " |
- << "error_details { " << rst_frame.error_details << " }\n"; |
- return os; |
-} |
- |
-ostream& operator<<(ostream& os, |
- const QuicConnectionCloseFrame& connection_close_frame) { |
- os << "error_code { " << connection_close_frame.error_code << " } " |
- << "error_details { " << connection_close_frame.error_details << " }\n"; |
- return os; |
-} |
- |
-ostream& operator<<(ostream& os, const QuicGoAwayFrame& goaway_frame) { |
- os << "error_code { " << goaway_frame.error_code << " } " |
- << "last_good_stream_id { " << goaway_frame.last_good_stream_id << " } " |
- << "reason_phrase { " << goaway_frame.reason_phrase << " }\n"; |
- return os; |
-} |
- |
-ostream& operator<<(ostream& os, |
- const QuicWindowUpdateFrame& window_update_frame) { |
- os << "stream_id { " << window_update_frame.stream_id << " } " |
- << "byte_offset { " << window_update_frame.byte_offset << " }\n"; |
- return os; |
-} |
- |
-ostream& operator<<(ostream& os, const QuicBlockedFrame& blocked_frame) { |
- os << "stream_id { " << blocked_frame.stream_id << " }\n"; |
- return os; |
-} |
- |
-ostream& operator<<(ostream& os, const QuicStreamFrame& stream_frame) { |
- os << "stream_id { " << stream_frame.stream_id << " } " |
- << "fin { " << stream_frame.fin << " } " |
- << "offset { " << stream_frame.offset << " } " |
- << "data { " |
- << QuicUtils::StringToHexASCIIDump(*(stream_frame.GetDataAsString())) |
- << " }\n"; |
- return os; |
-} |
- |
-QuicGoAwayFrame::QuicGoAwayFrame() |
- : error_code(QUIC_NO_ERROR), |
- last_good_stream_id(0) { |
-} |
- |
-QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code, |
- QuicStreamId last_good_stream_id, |
- const string& reason) |
- : error_code(error_code), |
- last_good_stream_id(last_good_stream_id), |
- reason_phrase(reason) { |
- DCHECK_LE(error_code, numeric_limits<uint8>::max()); |
-} |
- |
-QuicData::QuicData(const char* buffer, |
- size_t length) |
- : buffer_(buffer), |
- length_(length), |
- owns_buffer_(false) { |
-} |
- |
-QuicData::QuicData(char* buffer, |
- size_t length, |
- bool owns_buffer) |
- : buffer_(buffer), |
- length_(length), |
- owns_buffer_(owns_buffer) { |
-} |
- |
-QuicData::~QuicData() { |
- if (owns_buffer_) { |
- delete [] const_cast<char*>(buffer_); |
- } |
-} |
- |
-QuicWindowUpdateFrame::QuicWindowUpdateFrame(QuicStreamId stream_id, |
- QuicStreamOffset byte_offset) |
- : stream_id(stream_id), |
- byte_offset(byte_offset) {} |
- |
-QuicBlockedFrame::QuicBlockedFrame(QuicStreamId stream_id) |
- : stream_id(stream_id) {} |
- |
-QuicPacket::QuicPacket(char* buffer, |
- size_t length, |
- bool owns_buffer, |
- QuicConnectionIdLength connection_id_length, |
- bool includes_version, |
- QuicSequenceNumberLength sequence_number_length) |
- : QuicData(buffer, length, owns_buffer), |
- buffer_(buffer), |
- connection_id_length_(connection_id_length), |
- includes_version_(includes_version), |
- sequence_number_length_(sequence_number_length) { |
-} |
- |
-QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer, |
- size_t length) |
- : QuicData(buffer, length) { |
-} |
- |
-QuicEncryptedPacket::QuicEncryptedPacket(char* buffer, |
- size_t length, |
- bool owns_buffer) |
- : QuicData(buffer, length, owns_buffer) { |
-} |
- |
-StringPiece QuicPacket::FecProtectedData() const { |
- const size_t start_of_fec = GetStartOfFecProtectedData( |
- connection_id_length_, includes_version_, sequence_number_length_); |
- return StringPiece(data() + start_of_fec, length() - start_of_fec); |
-} |
- |
-StringPiece QuicPacket::AssociatedData() const { |
- return StringPiece( |
- data() + kStartOfHashData, |
- GetStartOfEncryptedData( |
- connection_id_length_, includes_version_, sequence_number_length_) - |
- kStartOfHashData); |
-} |
- |
-StringPiece QuicPacket::BeforePlaintext() const { |
- return StringPiece(data(), GetStartOfEncryptedData(connection_id_length_, |
- includes_version_, |
- sequence_number_length_)); |
-} |
- |
-StringPiece QuicPacket::Plaintext() const { |
- const size_t start_of_encrypted_data = |
- GetStartOfEncryptedData( |
- connection_id_length_, includes_version_, sequence_number_length_); |
- return StringPiece(data() + start_of_encrypted_data, |
- length() - start_of_encrypted_data); |
-} |
- |
-RetransmittableFrames::RetransmittableFrames() |
- : encryption_level_(NUM_ENCRYPTION_LEVELS), |
- has_crypto_handshake_(NOT_HANDSHAKE) { |
-} |
- |
-RetransmittableFrames::~RetransmittableFrames() { |
- for (QuicFrames::iterator it = frames_.begin(); it != frames_.end(); ++it) { |
- switch (it->type) { |
- case PADDING_FRAME: |
- delete it->padding_frame; |
- break; |
- case STREAM_FRAME: |
- delete it->stream_frame; |
- break; |
- case ACK_FRAME: |
- delete it->ack_frame; |
- break; |
- case STOP_WAITING_FRAME: |
- delete it->stop_waiting_frame; |
- break; |
- case PING_FRAME: |
- delete it->ping_frame; |
- break; |
- case RST_STREAM_FRAME: |
- delete it->rst_stream_frame; |
- break; |
- case CONNECTION_CLOSE_FRAME: |
- delete it->connection_close_frame; |
- break; |
- case GOAWAY_FRAME: |
- delete it->goaway_frame; |
- break; |
- case WINDOW_UPDATE_FRAME: |
- delete it->window_update_frame; |
- break; |
- case BLOCKED_FRAME: |
- delete it->blocked_frame; |
- break; |
- case NUM_FRAME_TYPES: |
- DCHECK(false) << "Cannot delete type: " << it->type; |
- } |
- } |
- STLDeleteElements(&stream_data_); |
-} |
- |
-const QuicFrame& RetransmittableFrames::AddStreamFrame( |
- QuicStreamFrame* stream_frame) { |
- // Make an owned copy of the stream frame's data. |
- stream_data_.push_back(stream_frame->GetDataAsString()); |
- // Ensure the stream frame's IOVector points to the owned copy of the data. |
- stream_frame->data.Clear(); |
- stream_frame->data.Append(const_cast<char*>(stream_data_.back()->data()), |
- stream_data_.back()->size()); |
- frames_.push_back(QuicFrame(stream_frame)); |
- if (stream_frame->stream_id == kCryptoStreamId) { |
- has_crypto_handshake_ = IS_HANDSHAKE; |
- } |
- return frames_.back(); |
-} |
- |
-const QuicFrame& RetransmittableFrames::AddNonStreamFrame( |
- const QuicFrame& frame) { |
- DCHECK_NE(frame.type, STREAM_FRAME); |
- frames_.push_back(frame); |
- return frames_.back(); |
-} |
- |
-void RetransmittableFrames::set_encryption_level(EncryptionLevel level) { |
- encryption_level_ = level; |
-} |
- |
-SerializedPacket::SerializedPacket( |
- QuicPacketSequenceNumber sequence_number, |
- QuicSequenceNumberLength sequence_number_length, |
- QuicEncryptedPacket* packet, |
- QuicPacketEntropyHash entropy_hash, |
- RetransmittableFrames* retransmittable_frames) |
- : sequence_number(sequence_number), |
- sequence_number_length(sequence_number_length), |
- packet(packet), |
- entropy_hash(entropy_hash), |
- retransmittable_frames(retransmittable_frames), |
- is_fec_packet(false) { |
-} |
- |
-SerializedPacket::~SerializedPacket() {} |
- |
-QuicEncryptedPacket* QuicEncryptedPacket::Clone() const { |
- char* buffer = new char[this->length()]; |
- memcpy(buffer, this->data(), this->length()); |
- return new QuicEncryptedPacket(buffer, this->length(), true); |
-} |
- |
-ostream& operator<<(ostream& os, const QuicEncryptedPacket& s) { |
- os << s.length() << "-byte data"; |
- return os; |
-} |
- |
-TransmissionInfo::TransmissionInfo() |
- : retransmittable_frames(nullptr), |
- sequence_number_length(PACKET_1BYTE_SEQUENCE_NUMBER), |
- sent_time(QuicTime::Zero()), |
- bytes_sent(0), |
- nack_count(0), |
- transmission_type(NOT_RETRANSMISSION), |
- all_transmissions(nullptr), |
- in_flight(false), |
- is_unackable(false), |
- is_fec_packet(false) {} |
- |
-TransmissionInfo::TransmissionInfo( |
- RetransmittableFrames* retransmittable_frames, |
- QuicSequenceNumberLength sequence_number_length, |
- TransmissionType transmission_type, |
- QuicTime sent_time) |
- : retransmittable_frames(retransmittable_frames), |
- sequence_number_length(sequence_number_length), |
- sent_time(sent_time), |
- bytes_sent(0), |
- nack_count(0), |
- transmission_type(transmission_type), |
- all_transmissions(nullptr), |
- in_flight(false), |
- is_unackable(false), |
- is_fec_packet(false) {} |
- |
-} // namespace net |