Home | History | Annotate | Download | only in quic
      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(NULL) {}
    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(NULL) {
    127 }
    128 
    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);
    135   }
    136   DCHECK_EQ(data_string->size(), data.TotalBufferSize());
    137   return data_string;
    138 }
    139 
    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;
    145 }
    146 
    147 bool ContainsQuicTag(const QuicTagVector& tag_vector, QuicTag tag) {
    148   return std::find(tag_vector.begin(), tag_vector.end(),  tag)
    149       != tag_vector.end();
    150 }
    151 
    152 QuicVersionVector QuicSupportedVersions() {
    153   QuicVersionVector supported_versions;
    154   for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
    155     supported_versions.push_back(kSupportedQuicVersions[i]);
    156   }
    157   return supported_versions;
    158 }
    159 
    160 QuicTag QuicVersionToQuicTag(const QuicVersion version) {
    161   switch (version) {
    162     case QUIC_VERSION_16:
    163       return MakeQuicTag('Q', '0', '1', '6');
    164     case QUIC_VERSION_18:
    165       return MakeQuicTag('Q', '0', '1', '8');
    166     case QUIC_VERSION_19:
    167       return MakeQuicTag('Q', '0', '1', '9');
    168     case QUIC_VERSION_21:
    169       return MakeQuicTag('Q', '0', '2', '1');
    170     case QUIC_VERSION_22:
    171       return MakeQuicTag('Q', '0', '2', '2');
    172     case QUIC_VERSION_23:
    173       return MakeQuicTag('Q', '0', '2', '3');
    174     default:
    175       // This shold be an ERROR because we should never attempt to convert an
    176       // invalid QuicVersion to be written to the wire.
    177       LOG(ERROR) << "Unsupported QuicVersion: " << version;
    178       return 0;
    179   }
    180 }
    181 
    182 QuicVersion QuicTagToQuicVersion(const QuicTag version_tag) {
    183   for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
    184     if (version_tag == QuicVersionToQuicTag(kSupportedQuicVersions[i])) {
    185       return kSupportedQuicVersions[i];
    186     }
    187   }
    188   // Reading from the client so this should not be considered an ERROR.
    189   DVLOG(1) << "Unsupported QuicTag version: "
    190            << QuicUtils::TagToString(version_tag);
    191   return QUIC_VERSION_UNSUPPORTED;
    192 }
    193 
    194 #define RETURN_STRING_LITERAL(x) \
    195 case x: \
    196 return #x
    197 
    198 string QuicVersionToString(const QuicVersion version) {
    199   switch (version) {
    200     RETURN_STRING_LITERAL(QUIC_VERSION_16);
    201     RETURN_STRING_LITERAL(QUIC_VERSION_18);
    202     RETURN_STRING_LITERAL(QUIC_VERSION_19);
    203     RETURN_STRING_LITERAL(QUIC_VERSION_21);
    204     RETURN_STRING_LITERAL(QUIC_VERSION_22);
    205     RETURN_STRING_LITERAL(QUIC_VERSION_23);
    206     default:
    207       return "QUIC_VERSION_UNSUPPORTED";
    208   }
    209 }
    210 
    211 string QuicVersionVectorToString(const QuicVersionVector& versions) {
    212   string result = "";
    213   for (size_t i = 0; i < versions.size(); ++i) {
    214     if (i != 0) {
    215       result.append(",");
    216     }
    217     result.append(QuicVersionToString(versions[i]));
    218   }
    219   return result;
    220 }
    221 
    222 ostream& operator<<(ostream& os, const QuicPacketHeader& header) {
    223   os << "{ connection_id: " << header.public_header.connection_id
    224      << ", connection_id_length:" << header.public_header.connection_id_length
    225      << ", sequence_number_length:"
    226      << header.public_header.sequence_number_length
    227      << ", reset_flag: " << header.public_header.reset_flag
    228      << ", version_flag: " << header.public_header.version_flag;
    229   if (header.public_header.version_flag) {
    230     os << " version: ";
    231     for (size_t i = 0; i < header.public_header.versions.size(); ++i) {
    232       os << header.public_header.versions[0] << " ";
    233     }
    234   }
    235   os << ", fec_flag: " << header.fec_flag
    236      << ", entropy_flag: " << header.entropy_flag
    237      << ", entropy hash: " << static_cast<int>(header.entropy_hash)
    238      << ", sequence_number: " << header.packet_sequence_number
    239      << ", is_in_fec_group:" << header.is_in_fec_group
    240      << ", fec_group: " << header.fec_group<< "}\n";
    241   return os;
    242 }
    243 
    244 bool IsAwaitingPacket(const QuicAckFrame& ack_frame,
    245                       QuicPacketSequenceNumber sequence_number) {
    246   return sequence_number > ack_frame.largest_observed ||
    247       ContainsKey(ack_frame.missing_packets, sequence_number);
    248 }
    249 
    250 void InsertMissingPacketsBetween(QuicAckFrame* ack_frame,
    251                                  QuicPacketSequenceNumber lower,
    252                                  QuicPacketSequenceNumber higher) {
    253   for (QuicPacketSequenceNumber i = lower; i < higher; ++i) {
    254     ack_frame->missing_packets.insert(i);
    255   }
    256 }
    257 
    258 QuicStopWaitingFrame::QuicStopWaitingFrame()
    259     : entropy_hash(0),
    260       least_unacked(0) {
    261 }
    262 
    263 QuicStopWaitingFrame::~QuicStopWaitingFrame() {}
    264 
    265 QuicAckFrame::QuicAckFrame()
    266     : entropy_hash(0),
    267       largest_observed(0),
    268       delta_time_largest_observed(QuicTime::Delta::Infinite()),
    269       is_truncated(false) {}
    270 
    271 QuicAckFrame::~QuicAckFrame() {}
    272 
    273 CongestionFeedbackMessageTCP::CongestionFeedbackMessageTCP()
    274     : receive_window(0) {
    275 }
    276 
    277 QuicCongestionFeedbackFrame::QuicCongestionFeedbackFrame() : type(kTCP) {}
    278 
    279 QuicCongestionFeedbackFrame::~QuicCongestionFeedbackFrame() {}
    280 
    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_18) {
    287         return QUIC_STREAM_NO_ERROR;
    288       }
    289       break;
    290     default:
    291       return error_code;
    292   }
    293   return error_code;
    294 }
    295 
    296 QuicRstStreamFrame::QuicRstStreamFrame()
    297     : stream_id(0),
    298       error_code(QUIC_STREAM_NO_ERROR) {
    299 }
    300 
    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());
    308 }
    309 
    310 QuicConnectionCloseFrame::QuicConnectionCloseFrame()
    311     : error_code(QUIC_NO_ERROR) {
    312 }
    313 
    314 QuicFrame::QuicFrame() {}
    315 
    316 QuicFrame::QuicFrame(QuicPaddingFrame* padding_frame)
    317     : type(PADDING_FRAME),
    318       padding_frame(padding_frame) {
    319 }
    320 
    321 QuicFrame::QuicFrame(QuicStreamFrame* stream_frame)
    322     : type(STREAM_FRAME),
    323       stream_frame(stream_frame) {
    324 }
    325 
    326 QuicFrame::QuicFrame(QuicAckFrame* frame)
    327     : type(ACK_FRAME),
    328       ack_frame(frame) {
    329 }
    330 
    331 QuicFrame::QuicFrame(QuicCongestionFeedbackFrame* frame)
    332     : type(CONGESTION_FEEDBACK_FRAME),
    333       congestion_feedback_frame(frame) {
    334 }
    335 
    336 QuicFrame::QuicFrame(QuicStopWaitingFrame* frame)
    337     : type(STOP_WAITING_FRAME),
    338       stop_waiting_frame(frame) {
    339 }
    340 
    341 QuicFrame::QuicFrame(QuicPingFrame* frame)
    342     : type(PING_FRAME),
    343       ping_frame(frame) {
    344 }
    345 
    346 QuicFrame::QuicFrame(QuicRstStreamFrame* frame)
    347     : type(RST_STREAM_FRAME),
    348       rst_stream_frame(frame) {
    349 }
    350 
    351 QuicFrame::QuicFrame(QuicConnectionCloseFrame* frame)
    352     : type(CONNECTION_CLOSE_FRAME),
    353       connection_close_frame(frame) {
    354 }
    355 
    356 QuicFrame::QuicFrame(QuicGoAwayFrame* frame)
    357     : type(GOAWAY_FRAME),
    358       goaway_frame(frame) {
    359 }
    360 
    361 QuicFrame::QuicFrame(QuicWindowUpdateFrame* frame)
    362     : type(WINDOW_UPDATE_FRAME),
    363       window_update_frame(frame) {
    364 }
    365 
    366 QuicFrame::QuicFrame(QuicBlockedFrame* frame)
    367     : type(BLOCKED_FRAME),
    368       blocked_frame(frame) {
    369 }
    370 
    371 QuicFecData::QuicFecData() : fec_group(0) {}
    372 
    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;
    376   return os;
    377 }
    378 
    379 ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) {
    380   os << "entropy_hash: " << static_cast<int>(ack_frame.entropy_hash)
    381      << " largest_observed: " << ack_frame.largest_observed
    382      << " delta_time_largest_observed: "
    383      << ack_frame.delta_time_largest_observed.ToMicroseconds()
    384      << " missing_packets: [ ";
    385   for (SequenceNumberSet::const_iterator it = ack_frame.missing_packets.begin();
    386        it != ack_frame.missing_packets.end(); ++it) {
    387     os << *it << " ";
    388   }
    389   os << " ] is_truncated: " << ack_frame.is_truncated;
    390   os << " revived_packets: [ ";
    391   for (SequenceNumberSet::const_iterator it = ack_frame.revived_packets.begin();
    392        it != ack_frame.revived_packets.end(); ++it) {
    393     os << *it << " ";
    394   }
    395   os << " ] received_packets: [ ";
    396   for (PacketTimeList::const_iterator it =
    397            ack_frame.received_packet_times.begin();
    398            it != ack_frame.received_packet_times.end(); ++it) {
    399     os << it->first << " at " << it->second.ToDebuggingValue() << " ";
    400   }
    401   os << " ]";
    402   return os;
    403 }
    404 
    405 ostream& operator<<(ostream& os, const QuicFrame& frame) {
    406   switch (frame.type) {
    407   case PADDING_FRAME: {
    408       os << "type { PADDING_FRAME } ";
    409       break;
    410     }
    411     case RST_STREAM_FRAME: {
    412       os << "type { " << RST_STREAM_FRAME << " } " << *(frame.rst_stream_frame);
    413       break;
    414     }
    415     case CONNECTION_CLOSE_FRAME: {
    416       os << "type { CONNECTION_CLOSE_FRAME } "
    417          << *(frame.connection_close_frame);
    418       break;
    419     }
    420     case GOAWAY_FRAME: {
    421       os << "type { GOAWAY_FRAME } " << *(frame.goaway_frame);
    422       break;
    423     }
    424     case WINDOW_UPDATE_FRAME: {
    425       os << "type { WINDOW_UPDATE_FRAME } " << *(frame.window_update_frame);
    426       break;
    427     }
    428     case BLOCKED_FRAME: {
    429       os << "type { BLOCKED_FRAME } " << *(frame.blocked_frame);
    430       break;
    431     }
    432     case STREAM_FRAME: {
    433       os << "type { STREAM_FRAME } " << *(frame.stream_frame);
    434       break;
    435     }
    436     case ACK_FRAME: {
    437       os << "type { ACK_FRAME } " << *(frame.ack_frame);
    438       break;
    439     }
    440     case CONGESTION_FEEDBACK_FRAME: {
    441       os << "type { CONGESTION_FEEDBACK_FRAME } "
    442          << *(frame.congestion_feedback_frame);
    443       break;
    444     }
    445     case STOP_WAITING_FRAME: {
    446       os << "type { STOP_WAITING_FRAME } " << *(frame.stop_waiting_frame);
    447       break;
    448     }
    449     case PING_FRAME: {
    450       os << "type { PING_FRAME } ";
    451       break;
    452     }
    453     default: {
    454       LOG(ERROR) << "Unknown frame type: " << frame.type;
    455       break;
    456     }
    457   }
    458   return os;
    459 }
    460 
    461 ostream& operator<<(ostream& os, const QuicRstStreamFrame& rst_frame) {
    462   os << "stream_id { " << rst_frame.stream_id << " } "
    463      << "error_code { " << rst_frame.error_code << " } "
    464      << "error_details { " << rst_frame.error_details << " }\n";
    465   return os;
    466 }
    467 
    468 ostream& operator<<(ostream& os,
    469                     const QuicConnectionCloseFrame& connection_close_frame) {
    470   os << "error_code { " << connection_close_frame.error_code << " } "
    471      << "error_details { " << connection_close_frame.error_details << " }\n";
    472   return os;
    473 }
    474 
    475 ostream& operator<<(ostream& os, const QuicGoAwayFrame& goaway_frame) {
    476   os << "error_code { " << goaway_frame.error_code << " } "
    477      << "last_good_stream_id { " << goaway_frame.last_good_stream_id << " } "
    478      << "reason_phrase { " << goaway_frame.reason_phrase << " }\n";
    479   return os;
    480 }
    481 
    482 ostream& operator<<(ostream& os,
    483                     const QuicWindowUpdateFrame& window_update_frame) {
    484   os << "stream_id { " << window_update_frame.stream_id << " } "
    485      << "byte_offset { " << window_update_frame.byte_offset << " }\n";
    486   return os;
    487 }
    488 
    489 ostream& operator<<(ostream& os, const QuicBlockedFrame& blocked_frame) {
    490   os << "stream_id { " << blocked_frame.stream_id << " }\n";
    491   return os;
    492 }
    493 
    494 ostream& operator<<(ostream& os, const QuicStreamFrame& stream_frame) {
    495   os << "stream_id { " << stream_frame.stream_id << " } "
    496      << "fin { " << stream_frame.fin << " } "
    497      << "offset { " << stream_frame.offset << " } "
    498      << "data { "
    499      << QuicUtils::StringToHexASCIIDump(*(stream_frame.GetDataAsString()))
    500      << " }\n";
    501   return os;
    502 }
    503 
    504 ostream& operator<<(ostream& os,
    505                     const QuicCongestionFeedbackFrame& congestion_frame) {
    506   os << "type: " << congestion_frame.type;
    507   switch (congestion_frame.type) {
    508     case kTCP: {
    509       const CongestionFeedbackMessageTCP& tcp = congestion_frame.tcp;
    510       os << " receive_window: " << tcp.receive_window;
    511       break;
    512     }
    513   }
    514   return os;
    515 }
    516 
    517 QuicGoAwayFrame::QuicGoAwayFrame()
    518     : error_code(QUIC_NO_ERROR),
    519       last_good_stream_id(0) {
    520 }
    521 
    522 QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code,
    523                                  QuicStreamId last_good_stream_id,
    524                                  const string& reason)
    525     : error_code(error_code),
    526       last_good_stream_id(last_good_stream_id),
    527       reason_phrase(reason) {
    528   DCHECK_LE(error_code, numeric_limits<uint8>::max());
    529 }
    530 
    531 QuicData::QuicData(const char* buffer,
    532                    size_t length)
    533     : buffer_(buffer),
    534       length_(length),
    535       owns_buffer_(false) {
    536 }
    537 
    538 QuicData::QuicData(char* buffer,
    539                    size_t length,
    540                    bool owns_buffer)
    541     : buffer_(buffer),
    542       length_(length),
    543       owns_buffer_(owns_buffer) {
    544 }
    545 
    546 QuicData::~QuicData() {
    547   if (owns_buffer_) {
    548     delete [] const_cast<char*>(buffer_);
    549   }
    550 }
    551 
    552 QuicWindowUpdateFrame::QuicWindowUpdateFrame(QuicStreamId stream_id,
    553                                              QuicStreamOffset byte_offset)
    554     : stream_id(stream_id),
    555       byte_offset(byte_offset) {}
    556 
    557 QuicBlockedFrame::QuicBlockedFrame(QuicStreamId stream_id)
    558     : stream_id(stream_id) {}
    559 
    560 QuicPacket::QuicPacket(char* buffer,
    561                        size_t length,
    562                        bool owns_buffer,
    563                        QuicConnectionIdLength connection_id_length,
    564                        bool includes_version,
    565                        QuicSequenceNumberLength sequence_number_length,
    566                        bool is_fec_packet)
    567     : QuicData(buffer, length, owns_buffer),
    568       buffer_(buffer),
    569       is_fec_packet_(is_fec_packet),
    570       connection_id_length_(connection_id_length),
    571       includes_version_(includes_version),
    572       sequence_number_length_(sequence_number_length) {
    573 }
    574 
    575 QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer,
    576                                          size_t length)
    577     : QuicData(buffer, length) {
    578 }
    579 
    580 QuicEncryptedPacket::QuicEncryptedPacket(char* buffer,
    581                                          size_t length,
    582                                          bool owns_buffer)
    583       : QuicData(buffer, length, owns_buffer) {
    584 }
    585 
    586 StringPiece QuicPacket::FecProtectedData() const {
    587   const size_t start_of_fec = GetStartOfFecProtectedData(
    588       connection_id_length_, includes_version_, sequence_number_length_);
    589   return StringPiece(data() + start_of_fec, length() - start_of_fec);
    590 }
    591 
    592 StringPiece QuicPacket::AssociatedData() const {
    593   return StringPiece(
    594       data() + kStartOfHashData,
    595       GetStartOfEncryptedData(
    596           connection_id_length_, includes_version_, sequence_number_length_) -
    597       kStartOfHashData);
    598 }
    599 
    600 StringPiece QuicPacket::BeforePlaintext() const {
    601   return StringPiece(data(), GetStartOfEncryptedData(connection_id_length_,
    602                                                      includes_version_,
    603                                                      sequence_number_length_));
    604 }
    605 
    606 StringPiece QuicPacket::Plaintext() const {
    607   const size_t start_of_encrypted_data =
    608       GetStartOfEncryptedData(
    609           connection_id_length_, includes_version_, sequence_number_length_);
    610   return StringPiece(data() + start_of_encrypted_data,
    611                      length() - start_of_encrypted_data);
    612 }
    613 
    614 RetransmittableFrames::RetransmittableFrames()
    615     : encryption_level_(NUM_ENCRYPTION_LEVELS),
    616       has_crypto_handshake_(NOT_HANDSHAKE) {
    617 }
    618 
    619 RetransmittableFrames::~RetransmittableFrames() {
    620   for (QuicFrames::iterator it = frames_.begin(); it != frames_.end(); ++it) {
    621     switch (it->type) {
    622       case PADDING_FRAME:
    623         delete it->padding_frame;
    624         break;
    625       case STREAM_FRAME:
    626         delete it->stream_frame;
    627         break;
    628       case ACK_FRAME:
    629         delete it->ack_frame;
    630         break;
    631       case CONGESTION_FEEDBACK_FRAME:
    632         delete it->congestion_feedback_frame;
    633         break;
    634       case STOP_WAITING_FRAME:
    635         delete it->stop_waiting_frame;
    636         break;
    637       case PING_FRAME:
    638         delete it->ping_frame;
    639         break;
    640       case RST_STREAM_FRAME:
    641         delete it->rst_stream_frame;
    642         break;
    643       case CONNECTION_CLOSE_FRAME:
    644         delete it->connection_close_frame;
    645         break;
    646       case GOAWAY_FRAME:
    647         delete it->goaway_frame;
    648         break;
    649       case WINDOW_UPDATE_FRAME:
    650         delete it->window_update_frame;
    651         break;
    652       case BLOCKED_FRAME:
    653         delete it->blocked_frame;
    654         break;
    655       case NUM_FRAME_TYPES:
    656         DCHECK(false) << "Cannot delete type: " << it->type;
    657     }
    658   }
    659   STLDeleteElements(&stream_data_);
    660 }
    661 
    662 const QuicFrame& RetransmittableFrames::AddStreamFrame(
    663     QuicStreamFrame* stream_frame) {
    664   // Make an owned copy of the stream frame's data.
    665   stream_data_.push_back(stream_frame->GetDataAsString());
    666   // Ensure the stream frame's IOVector points to the owned copy of the data.
    667   stream_frame->data.Clear();
    668   stream_frame->data.Append(const_cast<char*>(stream_data_.back()->data()),
    669                             stream_data_.back()->size());
    670   frames_.push_back(QuicFrame(stream_frame));
    671   if (stream_frame->stream_id == kCryptoStreamId) {
    672     has_crypto_handshake_ = IS_HANDSHAKE;
    673   }
    674   return frames_.back();
    675 }
    676 
    677 const QuicFrame& RetransmittableFrames::AddNonStreamFrame(
    678     const QuicFrame& frame) {
    679   DCHECK_NE(frame.type, STREAM_FRAME);
    680   frames_.push_back(frame);
    681   return frames_.back();
    682 }
    683 
    684 void RetransmittableFrames::set_encryption_level(EncryptionLevel level) {
    685   encryption_level_ = level;
    686 }
    687 
    688 SerializedPacket::SerializedPacket(
    689     QuicPacketSequenceNumber sequence_number,
    690     QuicSequenceNumberLength sequence_number_length,
    691     QuicPacket* packet,
    692     QuicPacketEntropyHash entropy_hash,
    693     RetransmittableFrames* retransmittable_frames)
    694     : sequence_number(sequence_number),
    695       sequence_number_length(sequence_number_length),
    696       packet(packet),
    697       entropy_hash(entropy_hash),
    698       retransmittable_frames(retransmittable_frames) {
    699 }
    700 
    701 SerializedPacket::~SerializedPacket() {}
    702 
    703 QuicEncryptedPacket* QuicEncryptedPacket::Clone() const {
    704   char* buffer = new char[this->length()];
    705   memcpy(buffer, this->data(), this->length());
    706   return new QuicEncryptedPacket(buffer, this->length(), true);
    707 }
    708 
    709 ostream& operator<<(ostream& os, const QuicEncryptedPacket& s) {
    710   os << s.length() << "-byte data";
    711   return os;
    712 }
    713 
    714 TransmissionInfo::TransmissionInfo()
    715     : retransmittable_frames(NULL),
    716       sequence_number_length(PACKET_1BYTE_SEQUENCE_NUMBER),
    717       sent_time(QuicTime::Zero()),
    718       bytes_sent(0),
    719       nack_count(0),
    720       transmission_type(NOT_RETRANSMISSION),
    721       all_transmissions(NULL),
    722       in_flight(false),
    723       is_unackable(false) {}
    724 
    725 TransmissionInfo::TransmissionInfo(
    726     RetransmittableFrames* retransmittable_frames,
    727     QuicSequenceNumberLength sequence_number_length)
    728     : retransmittable_frames(retransmittable_frames),
    729       sequence_number_length(sequence_number_length),
    730       sent_time(QuicTime::Zero()),
    731       bytes_sent(0),
    732       nack_count(0),
    733       transmission_type(NOT_RETRANSMISSION),
    734       all_transmissions(NULL),
    735       in_flight(false),
    736       is_unackable(false) {}
    737 
    738 TransmissionInfo::TransmissionInfo(
    739     RetransmittableFrames* retransmittable_frames,
    740     QuicSequenceNumberLength sequence_number_length,
    741     TransmissionType transmission_type,
    742     SequenceNumberList* all_transmissions)
    743     : retransmittable_frames(retransmittable_frames),
    744       sequence_number_length(sequence_number_length),
    745       sent_time(QuicTime::Zero()),
    746       bytes_sent(0),
    747       nack_count(0),
    748       transmission_type(transmission_type),
    749       all_transmissions(all_transmissions),
    750       in_flight(false),
    751       is_unackable(false) {}
    752 
    753 }  // namespace net
    754