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_15:
    163       return MakeQuicTag('Q', '0', '1', '5');
    164     case QUIC_VERSION_16:
    165       return MakeQuicTag('Q', '0', '1', '6');
    166     case QUIC_VERSION_17:
    167       return MakeQuicTag('Q', '0', '1', '7');
    168     case QUIC_VERSION_18:
    169       return MakeQuicTag('Q', '0', '1', '8');
    170     case QUIC_VERSION_19:
    171       return MakeQuicTag('Q', '0', '1', '9');
    172     case QUIC_VERSION_20:
    173       return MakeQuicTag('Q', '0', '2', '0');
    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_15);
    201     RETURN_STRING_LITERAL(QUIC_VERSION_16);
    202     RETURN_STRING_LITERAL(QUIC_VERSION_17);
    203     RETURN_STRING_LITERAL(QUIC_VERSION_18);
    204     RETURN_STRING_LITERAL(QUIC_VERSION_19);
    205     RETURN_STRING_LITERAL(QUIC_VERSION_20);
    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 ReceivedPacketInfo::ReceivedPacketInfo()
    245     : entropy_hash(0),
    246       largest_observed(0),
    247       delta_time_largest_observed(QuicTime::Delta::Infinite()),
    248       is_truncated(false) {}
    249 
    250 ReceivedPacketInfo::~ReceivedPacketInfo() {}
    251 
    252 bool IsAwaitingPacket(const ReceivedPacketInfo& received_info,
    253                       QuicPacketSequenceNumber sequence_number) {
    254   return sequence_number > received_info.largest_observed ||
    255       ContainsKey(received_info.missing_packets, sequence_number);
    256 }
    257 
    258 void InsertMissingPacketsBetween(ReceivedPacketInfo* received_info,
    259                                  QuicPacketSequenceNumber lower,
    260                                  QuicPacketSequenceNumber higher) {
    261   for (QuicPacketSequenceNumber i = lower; i < higher; ++i) {
    262     received_info->missing_packets.insert(i);
    263   }
    264 }
    265 
    266 QuicStopWaitingFrame::QuicStopWaitingFrame()
    267     : entropy_hash(0),
    268       least_unacked(0) {
    269 }
    270 
    271 QuicStopWaitingFrame::~QuicStopWaitingFrame() {}
    272 
    273 QuicAckFrame::QuicAckFrame() {}
    274 
    275 CongestionFeedbackMessageTCP::CongestionFeedbackMessageTCP()
    276     : receive_window(0) {
    277 }
    278 
    279 CongestionFeedbackMessageInterArrival::CongestionFeedbackMessageInterArrival() {
    280 }
    281 
    282 CongestionFeedbackMessageInterArrival::
    283     ~CongestionFeedbackMessageInterArrival() {}
    284 
    285 QuicCongestionFeedbackFrame::QuicCongestionFeedbackFrame() : type(kTCP) {}
    286 
    287 QuicCongestionFeedbackFrame::~QuicCongestionFeedbackFrame() {}
    288 
    289 QuicRstStreamErrorCode AdjustErrorForVersion(
    290     QuicRstStreamErrorCode error_code,
    291     QuicVersion version) {
    292   switch (error_code) {
    293     case QUIC_RST_FLOW_CONTROL_ACCOUNTING:
    294       if (version <= QUIC_VERSION_17) {
    295         return QUIC_STREAM_NO_ERROR;
    296       }
    297       break;
    298     default:
    299       return error_code;
    300   }
    301   return error_code;
    302 }
    303 
    304 QuicRstStreamFrame::QuicRstStreamFrame()
    305     : stream_id(0),
    306       error_code(QUIC_STREAM_NO_ERROR) {
    307 }
    308 
    309 QuicRstStreamFrame::QuicRstStreamFrame(QuicStreamId stream_id,
    310                                        QuicRstStreamErrorCode error_code,
    311                                        QuicStreamOffset bytes_written)
    312     : stream_id(stream_id),
    313       error_code(error_code),
    314       byte_offset(bytes_written) {
    315   DCHECK_LE(error_code, numeric_limits<uint8>::max());
    316 }
    317 
    318 QuicConnectionCloseFrame::QuicConnectionCloseFrame()
    319     : error_code(QUIC_NO_ERROR) {
    320 }
    321 
    322 QuicFrame::QuicFrame() {}
    323 
    324 QuicFrame::QuicFrame(QuicPaddingFrame* padding_frame)
    325     : type(PADDING_FRAME),
    326       padding_frame(padding_frame) {
    327 }
    328 
    329 QuicFrame::QuicFrame(QuicStreamFrame* stream_frame)
    330     : type(STREAM_FRAME),
    331       stream_frame(stream_frame) {
    332 }
    333 
    334 QuicFrame::QuicFrame(QuicAckFrame* frame)
    335     : type(ACK_FRAME),
    336       ack_frame(frame) {
    337 }
    338 
    339 QuicFrame::QuicFrame(QuicCongestionFeedbackFrame* frame)
    340     : type(CONGESTION_FEEDBACK_FRAME),
    341       congestion_feedback_frame(frame) {
    342 }
    343 
    344 QuicFrame::QuicFrame(QuicStopWaitingFrame* frame)
    345     : type(STOP_WAITING_FRAME),
    346       stop_waiting_frame(frame) {
    347 }
    348 
    349 QuicFrame::QuicFrame(QuicPingFrame* frame)
    350     : type(PING_FRAME),
    351       ping_frame(frame) {
    352 }
    353 
    354 QuicFrame::QuicFrame(QuicRstStreamFrame* frame)
    355     : type(RST_STREAM_FRAME),
    356       rst_stream_frame(frame) {
    357 }
    358 
    359 QuicFrame::QuicFrame(QuicConnectionCloseFrame* frame)
    360     : type(CONNECTION_CLOSE_FRAME),
    361       connection_close_frame(frame) {
    362 }
    363 
    364 QuicFrame::QuicFrame(QuicGoAwayFrame* frame)
    365     : type(GOAWAY_FRAME),
    366       goaway_frame(frame) {
    367 }
    368 
    369 QuicFrame::QuicFrame(QuicWindowUpdateFrame* frame)
    370     : type(WINDOW_UPDATE_FRAME),
    371       window_update_frame(frame) {
    372 }
    373 
    374 QuicFrame::QuicFrame(QuicBlockedFrame* frame)
    375     : type(BLOCKED_FRAME),
    376       blocked_frame(frame) {
    377 }
    378 
    379 QuicFecData::QuicFecData() : fec_group(0) {}
    380 
    381 ostream& operator<<(ostream& os, const QuicStopWaitingFrame& sent_info) {
    382   os << "entropy_hash: " << static_cast<int>(sent_info.entropy_hash)
    383      << " least_unacked: " << sent_info.least_unacked;
    384   return os;
    385 }
    386 
    387 ostream& operator<<(ostream& os, const ReceivedPacketInfo& received_info) {
    388   os << "entropy_hash: " << static_cast<int>(received_info.entropy_hash)
    389      << " is_truncated: " << received_info.is_truncated
    390      << " largest_observed: " << received_info.largest_observed
    391      << " delta_time_largest_observed: "
    392      << received_info.delta_time_largest_observed.ToMicroseconds()
    393      << " missing_packets: [ ";
    394   for (SequenceNumberSet::const_iterator it =
    395            received_info.missing_packets.begin();
    396        it != received_info.missing_packets.end(); ++it) {
    397     os << *it << " ";
    398   }
    399   os << " ] revived_packets: [ ";
    400   for (SequenceNumberSet::const_iterator it =
    401            received_info.revived_packets.begin();
    402        it != received_info.revived_packets.end(); ++it) {
    403     os << *it << " ";
    404   }
    405   os << " ]";
    406   return os;
    407 }
    408 
    409 ostream& operator<<(ostream& os, const QuicFrame& frame) {
    410   switch (frame.type) {
    411   case PADDING_FRAME: {
    412       os << "type { PADDING_FRAME } ";
    413       break;
    414     }
    415     case RST_STREAM_FRAME: {
    416       os << "type { " << RST_STREAM_FRAME << " } " << *(frame.rst_stream_frame);
    417       break;
    418     }
    419     case CONNECTION_CLOSE_FRAME: {
    420       os << "type { CONNECTION_CLOSE_FRAME } "
    421          << *(frame.connection_close_frame);
    422       break;
    423     }
    424     case GOAWAY_FRAME: {
    425       os << "type { GOAWAY_FRAME } " << *(frame.goaway_frame);
    426       break;
    427     }
    428     case WINDOW_UPDATE_FRAME: {
    429       os << "type { WINDOW_UPDATE_FRAME } " << *(frame.window_update_frame);
    430       break;
    431     }
    432     case BLOCKED_FRAME: {
    433       os << "type { BLOCKED_FRAME } " << *(frame.blocked_frame);
    434       break;
    435     }
    436     case STREAM_FRAME: {
    437       os << "type { STREAM_FRAME } " << *(frame.stream_frame);
    438       break;
    439     }
    440     case ACK_FRAME: {
    441       os << "type { ACK_FRAME } " << *(frame.ack_frame);
    442       break;
    443     }
    444     case CONGESTION_FEEDBACK_FRAME: {
    445       os << "type { CONGESTION_FEEDBACK_FRAME } "
    446          << *(frame.congestion_feedback_frame);
    447       break;
    448     }
    449     case STOP_WAITING_FRAME: {
    450       os << "type { STOP_WAITING_FRAME } " << *(frame.stop_waiting_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, const QuicAckFrame& ack_frame) {
    505   os << "sent info { " << ack_frame.sent_info << " } "
    506      << "received info { " << ack_frame.received_info << " }\n";
    507   return os;
    508 }
    509 
    510 ostream& operator<<(ostream& os,
    511                     const QuicCongestionFeedbackFrame& congestion_frame) {
    512   os << "type: " << congestion_frame.type;
    513   switch (congestion_frame.type) {
    514     case kInterArrival: {
    515       const CongestionFeedbackMessageInterArrival& inter_arrival =
    516           congestion_frame.inter_arrival;
    517       os << " received packets: [ ";
    518       for (TimeMap::const_iterator it =
    519                inter_arrival.received_packet_times.begin();
    520            it != inter_arrival.received_packet_times.end(); ++it) {
    521         os << it->first << "@" << it->second.ToDebuggingValue() << " ";
    522       }
    523       os << "]";
    524       break;
    525     }
    526     case kFixRate: {
    527       os << " bitrate_in_bytes_per_second: "
    528          << congestion_frame.fix_rate.bitrate.ToBytesPerSecond();
    529       break;
    530     }
    531     case kTCP: {
    532       const CongestionFeedbackMessageTCP& tcp = congestion_frame.tcp;
    533       os << " receive_window: " << tcp.receive_window;
    534       break;
    535     }
    536     case kTCPBBR: {
    537       LOG(DFATAL) << "TCPBBR is not yet supported.";
    538       break;
    539     }
    540   }
    541   return os;
    542 }
    543 
    544 CongestionFeedbackMessageFixRate::CongestionFeedbackMessageFixRate()
    545     : bitrate(QuicBandwidth::Zero()) {
    546 }
    547 
    548 QuicGoAwayFrame::QuicGoAwayFrame()
    549     : error_code(QUIC_NO_ERROR),
    550       last_good_stream_id(0) {
    551 }
    552 
    553 QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code,
    554                                  QuicStreamId last_good_stream_id,
    555                                  const string& reason)
    556     : error_code(error_code),
    557       last_good_stream_id(last_good_stream_id),
    558       reason_phrase(reason) {
    559   DCHECK_LE(error_code, numeric_limits<uint8>::max());
    560 }
    561 
    562 QuicData::QuicData(const char* buffer,
    563                    size_t length)
    564     : buffer_(buffer),
    565       length_(length),
    566       owns_buffer_(false) {
    567 }
    568 
    569 QuicData::QuicData(char* buffer,
    570                    size_t length,
    571                    bool owns_buffer)
    572     : buffer_(buffer),
    573       length_(length),
    574       owns_buffer_(owns_buffer) {
    575 }
    576 
    577 QuicData::~QuicData() {
    578   if (owns_buffer_) {
    579     delete [] const_cast<char*>(buffer_);
    580   }
    581 }
    582 
    583 QuicWindowUpdateFrame::QuicWindowUpdateFrame(QuicStreamId stream_id,
    584                                              QuicStreamOffset byte_offset)
    585     : stream_id(stream_id),
    586       byte_offset(byte_offset) {}
    587 
    588 QuicBlockedFrame::QuicBlockedFrame(QuicStreamId stream_id)
    589     : stream_id(stream_id) {}
    590 
    591 QuicPacket::QuicPacket(char* buffer,
    592                        size_t length,
    593                        bool owns_buffer,
    594                        QuicConnectionIdLength connection_id_length,
    595                        bool includes_version,
    596                        QuicSequenceNumberLength sequence_number_length,
    597                        bool is_fec_packet)
    598     : QuicData(buffer, length, owns_buffer),
    599       buffer_(buffer),
    600       is_fec_packet_(is_fec_packet),
    601       connection_id_length_(connection_id_length),
    602       includes_version_(includes_version),
    603       sequence_number_length_(sequence_number_length) {
    604 }
    605 
    606 QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer,
    607                                          size_t length)
    608     : QuicData(buffer, length) {
    609 }
    610 
    611 QuicEncryptedPacket::QuicEncryptedPacket(char* buffer,
    612                                          size_t length,
    613                                          bool owns_buffer)
    614       : QuicData(buffer, length, owns_buffer) {
    615 }
    616 
    617 StringPiece QuicPacket::FecProtectedData() const {
    618   const size_t start_of_fec = GetStartOfFecProtectedData(
    619       connection_id_length_, includes_version_, sequence_number_length_);
    620   return StringPiece(data() + start_of_fec, length() - start_of_fec);
    621 }
    622 
    623 StringPiece QuicPacket::AssociatedData() const {
    624   return StringPiece(
    625       data() + kStartOfHashData,
    626       GetStartOfEncryptedData(
    627           connection_id_length_, includes_version_, sequence_number_length_) -
    628       kStartOfHashData);
    629 }
    630 
    631 StringPiece QuicPacket::BeforePlaintext() const {
    632   return StringPiece(data(), GetStartOfEncryptedData(connection_id_length_,
    633                                                      includes_version_,
    634                                                      sequence_number_length_));
    635 }
    636 
    637 StringPiece QuicPacket::Plaintext() const {
    638   const size_t start_of_encrypted_data =
    639       GetStartOfEncryptedData(
    640           connection_id_length_, includes_version_, sequence_number_length_);
    641   return StringPiece(data() + start_of_encrypted_data,
    642                      length() - start_of_encrypted_data);
    643 }
    644 
    645 RetransmittableFrames::RetransmittableFrames()
    646     : encryption_level_(NUM_ENCRYPTION_LEVELS) {
    647 }
    648 
    649 RetransmittableFrames::~RetransmittableFrames() {
    650   for (QuicFrames::iterator it = frames_.begin(); it != frames_.end(); ++it) {
    651     switch (it->type) {
    652       case PADDING_FRAME:
    653         delete it->padding_frame;
    654         break;
    655       case STREAM_FRAME:
    656         delete it->stream_frame;
    657         break;
    658       case ACK_FRAME:
    659         delete it->ack_frame;
    660         break;
    661       case CONGESTION_FEEDBACK_FRAME:
    662         delete it->congestion_feedback_frame;
    663         break;
    664       case STOP_WAITING_FRAME:
    665         delete it->stop_waiting_frame;
    666         break;
    667       case PING_FRAME:
    668         delete it->ping_frame;
    669         break;
    670       case RST_STREAM_FRAME:
    671         delete it->rst_stream_frame;
    672         break;
    673       case CONNECTION_CLOSE_FRAME:
    674         delete it->connection_close_frame;
    675         break;
    676       case GOAWAY_FRAME:
    677         delete it->goaway_frame;
    678         break;
    679       case WINDOW_UPDATE_FRAME:
    680         delete it->window_update_frame;
    681         break;
    682       case BLOCKED_FRAME:
    683         delete it->blocked_frame;
    684         break;
    685       case NUM_FRAME_TYPES:
    686         DCHECK(false) << "Cannot delete type: " << it->type;
    687     }
    688   }
    689   STLDeleteElements(&stream_data_);
    690 }
    691 
    692 const QuicFrame& RetransmittableFrames::AddStreamFrame(
    693     QuicStreamFrame* stream_frame) {
    694   // Make an owned copy of the stream frame's data.
    695   stream_data_.push_back(stream_frame->GetDataAsString());
    696   // Ensure the stream frame's IOVector points to the owned copy of the data.
    697   stream_frame->data.Clear();
    698   stream_frame->data.Append(const_cast<char*>(stream_data_.back()->data()),
    699                             stream_data_.back()->size());
    700   frames_.push_back(QuicFrame(stream_frame));
    701   return frames_.back();
    702 }
    703 
    704 const QuicFrame& RetransmittableFrames::AddNonStreamFrame(
    705     const QuicFrame& frame) {
    706   DCHECK_NE(frame.type, STREAM_FRAME);
    707   frames_.push_back(frame);
    708   return frames_.back();
    709 }
    710 
    711 IsHandshake RetransmittableFrames::HasCryptoHandshake() const {
    712   for (size_t i = 0; i < frames().size(); ++i) {
    713     if (frames()[i].type == STREAM_FRAME &&
    714         frames()[i].stream_frame->stream_id == kCryptoStreamId) {
    715       return IS_HANDSHAKE;
    716     }
    717   }
    718   return NOT_HANDSHAKE;
    719 }
    720 
    721 void RetransmittableFrames::set_encryption_level(EncryptionLevel level) {
    722   encryption_level_ = level;
    723 }
    724 
    725 SerializedPacket::SerializedPacket(
    726     QuicPacketSequenceNumber sequence_number,
    727     QuicSequenceNumberLength sequence_number_length,
    728     QuicPacket* packet,
    729     QuicPacketEntropyHash entropy_hash,
    730     RetransmittableFrames* retransmittable_frames)
    731     : sequence_number(sequence_number),
    732       sequence_number_length(sequence_number_length),
    733       packet(packet),
    734       entropy_hash(entropy_hash),
    735       retransmittable_frames(retransmittable_frames) {
    736 }
    737 
    738 SerializedPacket::~SerializedPacket() {}
    739 
    740 QuicEncryptedPacket* QuicEncryptedPacket::Clone() const {
    741   char* buffer = new char[this->length()];
    742   memcpy(buffer, this->data(), this->length());
    743   return new QuicEncryptedPacket(buffer, this->length(), true);
    744 }
    745 
    746 ostream& operator<<(ostream& os, const QuicEncryptedPacket& s) {
    747   os << s.length() << "-byte data";
    748   return os;
    749 }
    750 
    751 TransmissionInfo::TransmissionInfo()
    752     : retransmittable_frames(NULL),
    753       sequence_number_length(PACKET_1BYTE_SEQUENCE_NUMBER),
    754       sent_time(QuicTime::Zero()),
    755       bytes_sent(0),
    756       nack_count(0),
    757       transmission_type(NOT_RETRANSMISSION),
    758       all_transmissions(NULL),
    759       in_flight(false) {}
    760 
    761 TransmissionInfo::TransmissionInfo(
    762     RetransmittableFrames* retransmittable_frames,
    763     QuicPacketSequenceNumber sequence_number,
    764     QuicSequenceNumberLength sequence_number_length)
    765     : retransmittable_frames(retransmittable_frames),
    766       sequence_number_length(sequence_number_length),
    767       sent_time(QuicTime::Zero()),
    768       bytes_sent(0),
    769       nack_count(0),
    770       transmission_type(NOT_RETRANSMISSION),
    771       all_transmissions(new SequenceNumberSet),
    772       in_flight(false) {
    773   all_transmissions->insert(sequence_number);
    774 }
    775 
    776 TransmissionInfo::TransmissionInfo(
    777     RetransmittableFrames* retransmittable_frames,
    778     QuicPacketSequenceNumber sequence_number,
    779     QuicSequenceNumberLength sequence_number_length,
    780     TransmissionType transmission_type,
    781     SequenceNumberSet* all_transmissions)
    782     : retransmittable_frames(retransmittable_frames),
    783       sequence_number_length(sequence_number_length),
    784       sent_time(QuicTime::Zero()),
    785       bytes_sent(0),
    786       nack_count(0),
    787       transmission_type(transmission_type),
    788       all_transmissions(all_transmissions),
    789       in_flight(false) {
    790   all_transmissions->insert(sequence_number);
    791 }
    792 
    793 }  // namespace net
    794