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_framer.h"
      6 
      7 #include "base/containers/hash_tables.h"
      8 #include "base/stl_util.h"
      9 #include "net/quic/crypto/crypto_framer.h"
     10 #include "net/quic/crypto/crypto_handshake_message.h"
     11 #include "net/quic/crypto/crypto_protocol.h"
     12 #include "net/quic/crypto/quic_decrypter.h"
     13 #include "net/quic/crypto/quic_encrypter.h"
     14 #include "net/quic/quic_data_reader.h"
     15 #include "net/quic/quic_data_writer.h"
     16 #include "net/quic/quic_flags.h"
     17 #include "net/quic/quic_socket_address_coder.h"
     18 
     19 using base::StringPiece;
     20 using std::make_pair;
     21 using std::map;
     22 using std::max;
     23 using std::min;
     24 using std::numeric_limits;
     25 using std::string;
     26 
     27 namespace net {
     28 
     29 namespace {
     30 
     31 // Mask to select the lowest 48 bits of a sequence number.
     32 const QuicPacketSequenceNumber k6ByteSequenceNumberMask =
     33     GG_UINT64_C(0x0000FFFFFFFFFFFF);
     34 const QuicPacketSequenceNumber k4ByteSequenceNumberMask =
     35     GG_UINT64_C(0x00000000FFFFFFFF);
     36 const QuicPacketSequenceNumber k2ByteSequenceNumberMask =
     37     GG_UINT64_C(0x000000000000FFFF);
     38 const QuicPacketSequenceNumber k1ByteSequenceNumberMask =
     39     GG_UINT64_C(0x00000000000000FF);
     40 
     41 const QuicConnectionId k1ByteConnectionIdMask = GG_UINT64_C(0x00000000000000FF);
     42 const QuicConnectionId k4ByteConnectionIdMask = GG_UINT64_C(0x00000000FFFFFFFF);
     43 
     44 // Number of bits the sequence number length bits are shifted from the right
     45 // edge of the public header.
     46 const uint8 kPublicHeaderSequenceNumberShift = 4;
     47 
     48 // New Frame Types, QUIC v. >= 10:
     49 // There are two interpretations for the Frame Type byte in the QUIC protocol,
     50 // resulting in two Frame Types: Special Frame Types and Regular Frame Types.
     51 //
     52 // Regular Frame Types use the Frame Type byte simply. Currently defined
     53 // Regular Frame Types are:
     54 // Padding            : 0b 00000000 (0x00)
     55 // ResetStream        : 0b 00000001 (0x01)
     56 // ConnectionClose    : 0b 00000010 (0x02)
     57 // GoAway             : 0b 00000011 (0x03)
     58 // WindowUpdate       : 0b 00000100 (0x04)
     59 // Blocked            : 0b 00000101 (0x05)
     60 //
     61 // Special Frame Types encode both a Frame Type and corresponding flags
     62 // all in the Frame Type byte. Currently defined Special Frame Types are:
     63 // Stream             : 0b 1xxxxxxx
     64 // Ack                : 0b 01xxxxxx
     65 // CongestionFeedback : 0b 001xxxxx
     66 //
     67 // Semantics of the flag bits above (the x bits) depends on the frame type.
     68 
     69 // Masks to determine if the frame type is a special use
     70 // and for specific special frame types.
     71 const uint8 kQuicFrameTypeSpecialMask = 0xE0;  // 0b 11100000
     72 const uint8 kQuicFrameTypeStreamMask = 0x80;
     73 const uint8 kQuicFrameTypeAckMask = 0x40;
     74 const uint8 kQuicFrameTypeCongestionFeedbackMask = 0x20;
     75 
     76 // Stream frame relative shifts and masks for interpreting the stream flags.
     77 // StreamID may be 1, 2, 3, or 4 bytes.
     78 const uint8 kQuicStreamIdShift = 2;
     79 const uint8 kQuicStreamIDLengthMask = 0x03;
     80 
     81 // Offset may be 0, 2, 3, 4, 5, 6, 7, 8 bytes.
     82 const uint8 kQuicStreamOffsetShift = 3;
     83 const uint8 kQuicStreamOffsetMask = 0x07;
     84 
     85 // Data length may be 0 or 2 bytes.
     86 const uint8 kQuicStreamDataLengthShift = 1;
     87 const uint8 kQuicStreamDataLengthMask = 0x01;
     88 
     89 // Fin bit may be set or not.
     90 const uint8 kQuicStreamFinShift = 1;
     91 const uint8 kQuicStreamFinMask = 0x01;
     92 
     93 // Sequence number size shift used in AckFrames.
     94 const uint8 kQuicSequenceNumberLengthShift = 2;
     95 
     96 // Acks may be truncated.
     97 const uint8 kQuicAckTruncatedShift = 1;
     98 const uint8 kQuicAckTruncatedMask = 0x01;
     99 
    100 // Acks may not have any nacks.
    101 const uint8 kQuicHasNacksMask = 0x01;
    102 
    103 // Returns the absolute value of the difference between |a| and |b|.
    104 QuicPacketSequenceNumber Delta(QuicPacketSequenceNumber a,
    105                                QuicPacketSequenceNumber b) {
    106   // Since these are unsigned numbers, we can't just return abs(a - b)
    107   if (a < b) {
    108     return b - a;
    109   }
    110   return a - b;
    111 }
    112 
    113 QuicPacketSequenceNumber ClosestTo(QuicPacketSequenceNumber target,
    114                                    QuicPacketSequenceNumber a,
    115                                    QuicPacketSequenceNumber b) {
    116   return (Delta(target, a) < Delta(target, b)) ? a : b;
    117 }
    118 
    119 QuicSequenceNumberLength ReadSequenceNumberLength(uint8 flags) {
    120   switch (flags & PACKET_FLAGS_6BYTE_SEQUENCE) {
    121     case PACKET_FLAGS_6BYTE_SEQUENCE:
    122       return PACKET_6BYTE_SEQUENCE_NUMBER;
    123     case PACKET_FLAGS_4BYTE_SEQUENCE:
    124       return PACKET_4BYTE_SEQUENCE_NUMBER;
    125     case PACKET_FLAGS_2BYTE_SEQUENCE:
    126       return PACKET_2BYTE_SEQUENCE_NUMBER;
    127     case PACKET_FLAGS_1BYTE_SEQUENCE:
    128       return PACKET_1BYTE_SEQUENCE_NUMBER;
    129     default:
    130       LOG(DFATAL) << "Unreachable case statement.";
    131       return PACKET_6BYTE_SEQUENCE_NUMBER;
    132   }
    133 }
    134 
    135 bool CanTruncate(
    136     QuicVersion version, const QuicFrame& frame, size_t free_bytes) {
    137   if ((frame.type == ACK_FRAME || frame.type == CONNECTION_CLOSE_FRAME) &&
    138       free_bytes >=
    139           QuicFramer::GetMinAckFrameSize(version,
    140                                          PACKET_6BYTE_SEQUENCE_NUMBER,
    141                                          PACKET_6BYTE_SEQUENCE_NUMBER)) {
    142     return true;
    143   }
    144   return false;
    145 }
    146 
    147 }  // namespace
    148 
    149 bool QuicFramerVisitorInterface::OnWindowUpdateFrame(
    150     const QuicWindowUpdateFrame& frame) {
    151   return true;
    152 }
    153 
    154 bool QuicFramerVisitorInterface::OnBlockedFrame(const QuicBlockedFrame& frame) {
    155   return true;
    156 }
    157 
    158 QuicFramer::QuicFramer(const QuicVersionVector& supported_versions,
    159                        QuicTime creation_time,
    160                        bool is_server)
    161     : visitor_(NULL),
    162       fec_builder_(NULL),
    163       entropy_calculator_(NULL),
    164       error_(QUIC_NO_ERROR),
    165       last_sequence_number_(0),
    166       last_serialized_connection_id_(0),
    167       supported_versions_(supported_versions),
    168       decrypter_level_(ENCRYPTION_NONE),
    169       alternative_decrypter_level_(ENCRYPTION_NONE),
    170       alternative_decrypter_latch_(false),
    171       is_server_(is_server),
    172       validate_flags_(true),
    173       creation_time_(creation_time) {
    174   DCHECK(!supported_versions.empty());
    175   quic_version_ = supported_versions_[0];
    176   decrypter_.reset(QuicDecrypter::Create(kNULL));
    177   encrypter_[ENCRYPTION_NONE].reset(
    178       QuicEncrypter::Create(kNULL));
    179 }
    180 
    181 QuicFramer::~QuicFramer() {}
    182 
    183 // static
    184 size_t QuicFramer::GetMinStreamFrameSize(QuicVersion version,
    185                                          QuicStreamId stream_id,
    186                                          QuicStreamOffset offset,
    187                                          bool last_frame_in_packet,
    188                                          InFecGroup is_in_fec_group) {
    189   bool no_stream_frame_length = last_frame_in_packet &&
    190                                 is_in_fec_group == NOT_IN_FEC_GROUP;
    191   return kQuicFrameTypeSize + GetStreamIdSize(stream_id) +
    192       GetStreamOffsetSize(offset) +
    193       (no_stream_frame_length ? 0 : kQuicStreamPayloadLengthSize);
    194 }
    195 
    196 // static
    197 size_t QuicFramer::GetMinAckFrameSize(
    198     QuicVersion version,
    199     QuicSequenceNumberLength sequence_number_length,
    200     QuicSequenceNumberLength largest_observed_length) {
    201   size_t len = kQuicFrameTypeSize + kQuicEntropyHashSize +
    202       largest_observed_length + kQuicDeltaTimeLargestObservedSize;
    203   if (version <= QUIC_VERSION_15) {
    204     len += sequence_number_length + kQuicEntropyHashSize;
    205   }
    206   return len;
    207 }
    208 
    209 // static
    210 size_t QuicFramer::GetStopWaitingFrameSize(
    211     QuicSequenceNumberLength sequence_number_length) {
    212   return kQuicFrameTypeSize + kQuicEntropyHashSize +
    213       sequence_number_length;
    214 }
    215 
    216 // static
    217 size_t QuicFramer::GetMinRstStreamFrameSize(QuicVersion quic_version) {
    218   return kQuicFrameTypeSize + kQuicMaxStreamIdSize +
    219       kQuicMaxStreamOffsetSize + kQuicErrorCodeSize +
    220       kQuicErrorDetailsLengthSize;
    221 }
    222 
    223 // static
    224 size_t QuicFramer::GetMinConnectionCloseFrameSize() {
    225   return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize;
    226 }
    227 
    228 // static
    229 size_t QuicFramer::GetMinGoAwayFrameSize() {
    230   return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize +
    231       kQuicMaxStreamIdSize;
    232 }
    233 
    234 // static
    235 size_t QuicFramer::GetWindowUpdateFrameSize() {
    236   return kQuicFrameTypeSize + kQuicMaxStreamIdSize + kQuicMaxStreamOffsetSize;
    237 }
    238 
    239 // static
    240 size_t QuicFramer::GetBlockedFrameSize() {
    241   return kQuicFrameTypeSize + kQuicMaxStreamIdSize;
    242 }
    243 
    244 // static
    245 size_t QuicFramer::GetStreamIdSize(QuicStreamId stream_id) {
    246   // Sizes are 1 through 4 bytes.
    247   for (int i = 1; i <= 4; ++i) {
    248     stream_id >>= 8;
    249     if (stream_id == 0) {
    250       return i;
    251     }
    252   }
    253   LOG(DFATAL) << "Failed to determine StreamIDSize.";
    254   return 4;
    255 }
    256 
    257 // static
    258 size_t QuicFramer::GetStreamOffsetSize(QuicStreamOffset offset) {
    259   // 0 is a special case.
    260   if (offset == 0) {
    261     return 0;
    262   }
    263   // 2 through 8 are the remaining sizes.
    264   offset >>= 8;
    265   for (int i = 2; i <= 8; ++i) {
    266     offset >>= 8;
    267     if (offset == 0) {
    268       return i;
    269     }
    270   }
    271   LOG(DFATAL) << "Failed to determine StreamOffsetSize.";
    272   return 8;
    273 }
    274 
    275 // static
    276 size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) {
    277   return kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID +
    278       number_versions * kQuicVersionSize;
    279 }
    280 
    281 bool QuicFramer::IsSupportedVersion(const QuicVersion version) const {
    282   for (size_t i = 0; i < supported_versions_.size(); ++i) {
    283     if (version == supported_versions_[i]) {
    284       return true;
    285     }
    286   }
    287   return false;
    288 }
    289 
    290 size_t QuicFramer::GetSerializedFrameLength(
    291     const QuicFrame& frame,
    292     size_t free_bytes,
    293     bool first_frame,
    294     bool last_frame,
    295     InFecGroup is_in_fec_group,
    296     QuicSequenceNumberLength sequence_number_length) {
    297   if (frame.type == PADDING_FRAME) {
    298     // PADDING implies end of packet.
    299     return free_bytes;
    300   }
    301   size_t frame_len =
    302       ComputeFrameLength(frame, last_frame, is_in_fec_group,
    303                          sequence_number_length);
    304   if (frame_len <= free_bytes) {
    305     // Frame fits within packet. Note that acks may be truncated.
    306     return frame_len;
    307   }
    308   // Only truncate the first frame in a packet, so if subsequent ones go
    309   // over, stop including more frames.
    310   if (!first_frame) {
    311     return 0;
    312   }
    313   if (CanTruncate(quic_version_, frame, free_bytes)) {
    314     // Truncate the frame so the packet will not exceed kMaxPacketSize.
    315     // Note that we may not use every byte of the writer in this case.
    316     DVLOG(1) << "Truncating large frame, free bytes: " << free_bytes;
    317     return free_bytes;
    318   }
    319   if (!FLAGS_quic_allow_oversized_packets_for_test) {
    320     return 0;
    321   }
    322   LOG(DFATAL) << "Packet size too small to fit frame.";
    323   return frame_len;
    324 }
    325 
    326 QuicFramer::AckFrameInfo::AckFrameInfo() : max_delta(0) {}
    327 
    328 QuicFramer::AckFrameInfo::~AckFrameInfo() {}
    329 
    330 QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash(
    331     const QuicPacketHeader& header) const {
    332   return header.entropy_flag << (header.packet_sequence_number % 8);
    333 }
    334 
    335 SerializedPacket QuicFramer::BuildDataPacket(
    336     const QuicPacketHeader& header,
    337     const QuicFrames& frames,
    338     size_t packet_size) {
    339   QuicDataWriter writer(packet_size);
    340   const SerializedPacket kNoPacket(
    341       0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL);
    342   if (!AppendPacketHeader(header, &writer)) {
    343     LOG(DFATAL) << "AppendPacketHeader failed";
    344     return kNoPacket;
    345   }
    346 
    347   for (size_t i = 0; i < frames.size(); ++i) {
    348     const QuicFrame& frame = frames[i];
    349 
    350     // Determine if we should write stream frame length in header.
    351     const bool no_stream_frame_length =
    352         (header.is_in_fec_group == NOT_IN_FEC_GROUP) &&
    353         (i == frames.size() - 1);
    354     if (!AppendTypeByte(frame, no_stream_frame_length, &writer)) {
    355       LOG(DFATAL) << "AppendTypeByte failed";
    356       return kNoPacket;
    357     }
    358 
    359     switch (frame.type) {
    360       case PADDING_FRAME:
    361         writer.WritePadding();
    362         break;
    363       case STREAM_FRAME:
    364         if (!AppendStreamFrame(
    365             *frame.stream_frame, no_stream_frame_length, &writer)) {
    366           LOG(DFATAL) << "AppendStreamFrame failed";
    367           return kNoPacket;
    368         }
    369         break;
    370       case ACK_FRAME:
    371         if (!AppendAckFrameAndTypeByte(
    372                 header, *frame.ack_frame, &writer)) {
    373           LOG(DFATAL) << "AppendAckFrameAndTypeByte failed";
    374           return kNoPacket;
    375         }
    376         break;
    377       case CONGESTION_FEEDBACK_FRAME:
    378         if (!AppendCongestionFeedbackFrame(
    379                 *frame.congestion_feedback_frame, &writer)) {
    380           LOG(DFATAL) << "AppendCongestionFeedbackFrame failed";
    381           return kNoPacket;
    382         }
    383         break;
    384       case STOP_WAITING_FRAME:
    385         if (quic_version_ <= QUIC_VERSION_15) {
    386           LOG(DFATAL) << "Attempt to add a StopWaitingFrame in "
    387                       << QuicVersionToString(quic_version_);
    388           return kNoPacket;
    389         }
    390         if (!AppendStopWaitingFrame(
    391                 header, *frame.stop_waiting_frame, &writer)) {
    392           LOG(DFATAL) << "AppendStopWaitingFrame failed";
    393           return kNoPacket;
    394         }
    395         break;
    396       case PING_FRAME:
    397         if (quic_version_ <= QUIC_VERSION_17) {
    398           LOG(DFATAL) << "Attempt to add a PingFrame in "
    399                       << QuicVersionToString(quic_version_);
    400           return kNoPacket;
    401         }
    402         // Ping has no payload.
    403         break;
    404       case RST_STREAM_FRAME:
    405         if (!AppendRstStreamFrame(*frame.rst_stream_frame, &writer)) {
    406           LOG(DFATAL) << "AppendRstStreamFrame failed";
    407           return kNoPacket;
    408         }
    409         break;
    410       case CONNECTION_CLOSE_FRAME:
    411         if (!AppendConnectionCloseFrame(
    412                 *frame.connection_close_frame, &writer)) {
    413           LOG(DFATAL) << "AppendConnectionCloseFrame failed";
    414           return kNoPacket;
    415         }
    416         break;
    417       case GOAWAY_FRAME:
    418         if (!AppendGoAwayFrame(*frame.goaway_frame, &writer)) {
    419           LOG(DFATAL) << "AppendGoAwayFrame failed";
    420           return kNoPacket;
    421         }
    422         break;
    423       case WINDOW_UPDATE_FRAME:
    424         if (!AppendWindowUpdateFrame(*frame.window_update_frame, &writer)) {
    425           LOG(DFATAL) << "AppendWindowUpdateFrame failed";
    426           return kNoPacket;
    427         }
    428         break;
    429       case BLOCKED_FRAME:
    430         if (!AppendBlockedFrame(*frame.blocked_frame, &writer)) {
    431           LOG(DFATAL) << "AppendBlockedFrame failed";
    432           return kNoPacket;
    433         }
    434         break;
    435       default:
    436         RaiseError(QUIC_INVALID_FRAME_DATA);
    437         LOG(DFATAL) << "QUIC_INVALID_FRAME_DATA";
    438         return kNoPacket;
    439     }
    440   }
    441 
    442   // Save the length before writing, because take clears it.
    443   const size_t len = writer.length();
    444   // Less than or equal because truncated acks end up with max_plaintex_size
    445   // length, even though they're typically slightly shorter.
    446   DCHECK_LE(len, packet_size);
    447   QuicPacket* packet = QuicPacket::NewDataPacket(
    448       writer.take(), len, true, header.public_header.connection_id_length,
    449       header.public_header.version_flag,
    450       header.public_header.sequence_number_length);
    451 
    452   if (fec_builder_) {
    453     fec_builder_->OnBuiltFecProtectedPayload(header,
    454                                              packet->FecProtectedData());
    455   }
    456 
    457   return SerializedPacket(header.packet_sequence_number,
    458                           header.public_header.sequence_number_length, packet,
    459                           GetPacketEntropyHash(header), NULL);
    460 }
    461 
    462 SerializedPacket QuicFramer::BuildFecPacket(const QuicPacketHeader& header,
    463                                             const QuicFecData& fec) {
    464   DCHECK_EQ(IN_FEC_GROUP, header.is_in_fec_group);
    465   DCHECK_NE(0u, header.fec_group);
    466   size_t len = GetPacketHeaderSize(header);
    467   len += fec.redundancy.length();
    468 
    469   QuicDataWriter writer(len);
    470   const SerializedPacket kNoPacket(
    471       0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL);
    472   if (!AppendPacketHeader(header, &writer)) {
    473     LOG(DFATAL) << "AppendPacketHeader failed";
    474     return kNoPacket;
    475   }
    476 
    477   if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) {
    478     LOG(DFATAL) << "Failed to add FEC";
    479     return kNoPacket;
    480   }
    481 
    482   return SerializedPacket(
    483       header.packet_sequence_number,
    484       header.public_header.sequence_number_length,
    485       QuicPacket::NewFecPacket(writer.take(), len, true,
    486                                header.public_header.connection_id_length,
    487                                header.public_header.version_flag,
    488                                header.public_header.sequence_number_length),
    489       GetPacketEntropyHash(header), NULL);
    490 }
    491 
    492 // static
    493 QuicEncryptedPacket* QuicFramer::BuildPublicResetPacket(
    494     const QuicPublicResetPacket& packet) {
    495   DCHECK(packet.public_header.reset_flag);
    496 
    497   CryptoHandshakeMessage reset;
    498   reset.set_tag(kPRST);
    499   reset.SetValue(kRNON, packet.nonce_proof);
    500   reset.SetValue(kRSEQ, packet.rejected_sequence_number);
    501   if (!packet.client_address.address().empty()) {
    502     // packet.client_address is non-empty.
    503     QuicSocketAddressCoder address_coder(packet.client_address);
    504     string serialized_address = address_coder.Encode();
    505     if (serialized_address.empty()) {
    506       return NULL;
    507     }
    508     reset.SetStringPiece(kCADR, serialized_address);
    509   }
    510   const QuicData& reset_serialized = reset.GetSerialized();
    511 
    512   size_t len =
    513       kPublicFlagsSize + PACKET_8BYTE_CONNECTION_ID + reset_serialized.length();
    514   QuicDataWriter writer(len);
    515 
    516   uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST |
    517                                    PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID);
    518   if (!writer.WriteUInt8(flags)) {
    519     return NULL;
    520   }
    521 
    522   if (!writer.WriteUInt64(packet.public_header.connection_id)) {
    523     return NULL;
    524   }
    525 
    526   if (!writer.WriteBytes(reset_serialized.data(), reset_serialized.length())) {
    527     return NULL;
    528   }
    529 
    530   return new QuicEncryptedPacket(writer.take(), len, true);
    531 }
    532 
    533 QuicEncryptedPacket* QuicFramer::BuildVersionNegotiationPacket(
    534     const QuicPacketPublicHeader& header,
    535     const QuicVersionVector& supported_versions) {
    536   DCHECK(header.version_flag);
    537   size_t len = GetVersionNegotiationPacketSize(supported_versions.size());
    538   QuicDataWriter writer(len);
    539 
    540   uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION |
    541                                    PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID);
    542   if (!writer.WriteUInt8(flags)) {
    543     return NULL;
    544   }
    545 
    546   if (!writer.WriteUInt64(header.connection_id)) {
    547     return NULL;
    548   }
    549 
    550   for (size_t i = 0; i < supported_versions.size(); ++i) {
    551     if (!writer.WriteUInt32(QuicVersionToQuicTag(supported_versions[i]))) {
    552       return NULL;
    553     }
    554   }
    555 
    556   return new QuicEncryptedPacket(writer.take(), len, true);
    557 }
    558 
    559 bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
    560   DCHECK(!reader_.get());
    561   reader_.reset(new QuicDataReader(packet.data(), packet.length()));
    562 
    563   visitor_->OnPacket();
    564 
    565   // First parse the public header.
    566   QuicPacketPublicHeader public_header;
    567   if (!ProcessPublicHeader(&public_header)) {
    568     DLOG(WARNING) << "Unable to process public header.";
    569     DCHECK_NE("", detailed_error_);
    570     return RaiseError(QUIC_INVALID_PACKET_HEADER);
    571   }
    572 
    573   if (!visitor_->OnUnauthenticatedPublicHeader(public_header)) {
    574     // The visitor suppresses further processing of the packet.
    575     reader_.reset(NULL);
    576     return true;
    577   }
    578 
    579   if (is_server_ && public_header.version_flag &&
    580       public_header.versions[0] != quic_version_) {
    581     if (!visitor_->OnProtocolVersionMismatch(public_header.versions[0])) {
    582       reader_.reset(NULL);
    583       return true;
    584     }
    585   }
    586 
    587   bool rv;
    588   if (!is_server_ && public_header.version_flag) {
    589     rv = ProcessVersionNegotiationPacket(&public_header);
    590   } else if (public_header.reset_flag) {
    591     rv = ProcessPublicResetPacket(public_header);
    592   } else {
    593     rv = ProcessDataPacket(public_header, packet);
    594   }
    595 
    596   reader_.reset(NULL);
    597   return rv;
    598 }
    599 
    600 bool QuicFramer::ProcessVersionNegotiationPacket(
    601     QuicPacketPublicHeader* public_header) {
    602   DCHECK(!is_server_);
    603   // Try reading at least once to raise error if the packet is invalid.
    604   do {
    605     QuicTag version;
    606     if (!reader_->ReadBytes(&version, kQuicVersionSize)) {
    607       set_detailed_error("Unable to read supported version in negotiation.");
    608       return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
    609     }
    610     public_header->versions.push_back(QuicTagToQuicVersion(version));
    611   } while (!reader_->IsDoneReading());
    612 
    613   visitor_->OnVersionNegotiationPacket(*public_header);
    614   return true;
    615 }
    616 
    617 bool QuicFramer::ProcessDataPacket(
    618     const QuicPacketPublicHeader& public_header,
    619     const QuicEncryptedPacket& packet) {
    620   QuicPacketHeader header(public_header);
    621   if (!ProcessPacketHeader(&header, packet)) {
    622     DLOG(WARNING) << "Unable to process data packet header.";
    623     return false;
    624   }
    625 
    626   if (!visitor_->OnPacketHeader(header)) {
    627     // The visitor suppresses further processing of the packet.
    628     return true;
    629   }
    630 
    631   if (packet.length() > kMaxPacketSize) {
    632     DLOG(WARNING) << "Packet too large: " << packet.length();
    633     return RaiseError(QUIC_PACKET_TOO_LARGE);
    634   }
    635 
    636   // Handle the payload.
    637   if (!header.fec_flag) {
    638     if (header.is_in_fec_group == IN_FEC_GROUP) {
    639       StringPiece payload = reader_->PeekRemainingPayload();
    640       visitor_->OnFecProtectedPayload(payload);
    641     }
    642     if (!ProcessFrameData(header)) {
    643       DCHECK_NE(QUIC_NO_ERROR, error_);  // ProcessFrameData sets the error.
    644       DLOG(WARNING) << "Unable to process frame data.";
    645       return false;
    646     }
    647   } else {
    648     QuicFecData fec_data;
    649     fec_data.fec_group = header.fec_group;
    650     fec_data.redundancy = reader_->ReadRemainingPayload();
    651     visitor_->OnFecData(fec_data);
    652   }
    653 
    654   visitor_->OnPacketComplete();
    655   return true;
    656 }
    657 
    658 bool QuicFramer::ProcessPublicResetPacket(
    659     const QuicPacketPublicHeader& public_header) {
    660   QuicPublicResetPacket packet(public_header);
    661 
    662   scoped_ptr<CryptoHandshakeMessage> reset(
    663       CryptoFramer::ParseMessage(reader_->ReadRemainingPayload()));
    664   if (!reset.get()) {
    665     set_detailed_error("Unable to read reset message.");
    666     return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET);
    667   }
    668   if (reset->tag() != kPRST) {
    669     set_detailed_error("Incorrect message tag.");
    670     return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET);
    671   }
    672 
    673   if (reset->GetUint64(kRNON, &packet.nonce_proof) != QUIC_NO_ERROR) {
    674     set_detailed_error("Unable to read nonce proof.");
    675     return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET);
    676   }
    677   // TODO(satyamshekhar): validate nonce to protect against DoS.
    678 
    679   if (reset->GetUint64(kRSEQ, &packet.rejected_sequence_number) !=
    680       QUIC_NO_ERROR) {
    681     set_detailed_error("Unable to read rejected sequence number.");
    682     return RaiseError(QUIC_INVALID_PUBLIC_RST_PACKET);
    683   }
    684 
    685   StringPiece address;
    686   if (reset->GetStringPiece(kCADR, &address)) {
    687     QuicSocketAddressCoder address_coder;
    688     if (address_coder.Decode(address.data(), address.length())) {
    689       packet.client_address = IPEndPoint(address_coder.ip(),
    690                                          address_coder.port());
    691     }
    692   }
    693 
    694   visitor_->OnPublicResetPacket(packet);
    695   return true;
    696 }
    697 
    698 bool QuicFramer::ProcessRevivedPacket(QuicPacketHeader* header,
    699                                       StringPiece payload) {
    700   DCHECK(!reader_.get());
    701 
    702   visitor_->OnRevivedPacket();
    703 
    704   header->entropy_hash = GetPacketEntropyHash(*header);
    705 
    706   if (!visitor_->OnPacketHeader(*header)) {
    707     return true;
    708   }
    709 
    710   if (payload.length() > kMaxPacketSize) {
    711     set_detailed_error("Revived packet too large.");
    712     return RaiseError(QUIC_PACKET_TOO_LARGE);
    713   }
    714 
    715   reader_.reset(new QuicDataReader(payload.data(), payload.length()));
    716   if (!ProcessFrameData(*header)) {
    717     DCHECK_NE(QUIC_NO_ERROR, error_);  // ProcessFrameData sets the error.
    718     DLOG(WARNING) << "Unable to process frame data.";
    719     return false;
    720   }
    721 
    722   visitor_->OnPacketComplete();
    723   reader_.reset(NULL);
    724   return true;
    725 }
    726 
    727 bool QuicFramer::AppendPacketHeader(const QuicPacketHeader& header,
    728                                     QuicDataWriter* writer) {
    729   DVLOG(1) << "Appending header: " << header;
    730   DCHECK(header.fec_group > 0 || header.is_in_fec_group == NOT_IN_FEC_GROUP);
    731   uint8 public_flags = 0;
    732   if (header.public_header.reset_flag) {
    733     public_flags |= PACKET_PUBLIC_FLAGS_RST;
    734   }
    735   if (header.public_header.version_flag) {
    736     public_flags |= PACKET_PUBLIC_FLAGS_VERSION;
    737   }
    738 
    739   public_flags |=
    740       GetSequenceNumberFlags(header.public_header.sequence_number_length)
    741           << kPublicHeaderSequenceNumberShift;
    742 
    743   switch (header.public_header.connection_id_length) {
    744     case PACKET_0BYTE_CONNECTION_ID:
    745       if (!writer->WriteUInt8(
    746               public_flags | PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID)) {
    747         return false;
    748       }
    749       break;
    750     case PACKET_1BYTE_CONNECTION_ID:
    751       if (!writer->WriteUInt8(
    752               public_flags | PACKET_PUBLIC_FLAGS_1BYTE_CONNECTION_ID)) {
    753          return false;
    754       }
    755       if (!writer->WriteUInt8(
    756               header.public_header.connection_id & k1ByteConnectionIdMask)) {
    757         return false;
    758       }
    759       break;
    760     case PACKET_4BYTE_CONNECTION_ID:
    761       if (!writer->WriteUInt8(
    762               public_flags | PACKET_PUBLIC_FLAGS_4BYTE_CONNECTION_ID)) {
    763          return false;
    764       }
    765       if (!writer->WriteUInt32(
    766               header.public_header.connection_id & k4ByteConnectionIdMask)) {
    767         return false;
    768       }
    769       break;
    770     case PACKET_8BYTE_CONNECTION_ID:
    771       if (!writer->WriteUInt8(
    772               public_flags | PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID)) {
    773         return false;
    774       }
    775       if (!writer->WriteUInt64(header.public_header.connection_id)) {
    776         return false;
    777       }
    778       break;
    779   }
    780   last_serialized_connection_id_ = header.public_header.connection_id;
    781 
    782   if (header.public_header.version_flag) {
    783     DCHECK(!is_server_);
    784     writer->WriteUInt32(QuicVersionToQuicTag(quic_version_));
    785   }
    786 
    787   if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length,
    788                                   header.packet_sequence_number, writer)) {
    789     return false;
    790   }
    791 
    792   uint8 private_flags = 0;
    793   if (header.entropy_flag) {
    794     private_flags |= PACKET_PRIVATE_FLAGS_ENTROPY;
    795   }
    796   if (header.is_in_fec_group == IN_FEC_GROUP) {
    797     private_flags |= PACKET_PRIVATE_FLAGS_FEC_GROUP;
    798   }
    799   if (header.fec_flag) {
    800     private_flags |= PACKET_PRIVATE_FLAGS_FEC;
    801   }
    802   if (!writer->WriteUInt8(private_flags)) {
    803     return false;
    804   }
    805 
    806   // The FEC group number is the sequence number of the first fec
    807   // protected packet, or 0 if this packet is not protected.
    808   if (header.is_in_fec_group == IN_FEC_GROUP) {
    809     DCHECK_GE(header.packet_sequence_number, header.fec_group);
    810     DCHECK_GT(255u, header.packet_sequence_number - header.fec_group);
    811     // Offset from the current packet sequence number to the first fec
    812     // protected packet.
    813     uint8 first_fec_protected_packet_offset =
    814         header.packet_sequence_number - header.fec_group;
    815     if (!writer->WriteBytes(&first_fec_protected_packet_offset, 1)) {
    816       return false;
    817     }
    818   }
    819 
    820   return true;
    821 }
    822 
    823 QuicPacketSequenceNumber QuicFramer::CalculatePacketSequenceNumberFromWire(
    824     QuicSequenceNumberLength sequence_number_length,
    825     QuicPacketSequenceNumber packet_sequence_number) const {
    826   // The new sequence number might have wrapped to the next epoch, or
    827   // it might have reverse wrapped to the previous epoch, or it might
    828   // remain in the same epoch.  Select the sequence number closest to the
    829   // next expected sequence number, the previous sequence number plus 1.
    830 
    831   // epoch_delta is the delta between epochs the sequence number was serialized
    832   // with, so the correct value is likely the same epoch as the last sequence
    833   // number or an adjacent epoch.
    834   const QuicPacketSequenceNumber epoch_delta =
    835       GG_UINT64_C(1) << (8 * sequence_number_length);
    836   QuicPacketSequenceNumber next_sequence_number = last_sequence_number_ + 1;
    837   QuicPacketSequenceNumber epoch = last_sequence_number_ & ~(epoch_delta - 1);
    838   QuicPacketSequenceNumber prev_epoch = epoch - epoch_delta;
    839   QuicPacketSequenceNumber next_epoch = epoch + epoch_delta;
    840 
    841   return ClosestTo(next_sequence_number,
    842                    epoch + packet_sequence_number,
    843                    ClosestTo(next_sequence_number,
    844                              prev_epoch + packet_sequence_number,
    845                              next_epoch + packet_sequence_number));
    846 }
    847 
    848 bool QuicFramer::ProcessPublicHeader(
    849     QuicPacketPublicHeader* public_header) {
    850   uint8 public_flags;
    851   if (!reader_->ReadBytes(&public_flags, 1)) {
    852     set_detailed_error("Unable to read public flags.");
    853     return false;
    854   }
    855 
    856   public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0;
    857   public_header->version_flag =
    858       (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0;
    859 
    860   if (validate_flags_ &&
    861       !public_header->version_flag && public_flags > PACKET_PUBLIC_FLAGS_MAX) {
    862     set_detailed_error("Illegal public flags value.");
    863     return false;
    864   }
    865 
    866   if (public_header->reset_flag && public_header->version_flag) {
    867     set_detailed_error("Got version flag in reset packet");
    868     return false;
    869   }
    870 
    871   switch (public_flags & PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID) {
    872     case PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID:
    873       if (!reader_->ReadUInt64(&public_header->connection_id)) {
    874         set_detailed_error("Unable to read ConnectionId.");
    875         return false;
    876       }
    877       public_header->connection_id_length = PACKET_8BYTE_CONNECTION_ID;
    878       break;
    879     case PACKET_PUBLIC_FLAGS_4BYTE_CONNECTION_ID:
    880       // If the connection_id is truncated, expect to read the last serialized
    881       // connection_id.
    882       if (!reader_->ReadBytes(&public_header->connection_id,
    883                               PACKET_4BYTE_CONNECTION_ID)) {
    884         set_detailed_error("Unable to read ConnectionId.");
    885         return false;
    886       }
    887       if ((public_header->connection_id & k4ByteConnectionIdMask) !=
    888           (last_serialized_connection_id_ & k4ByteConnectionIdMask)) {
    889         set_detailed_error("Truncated 4 byte ConnectionId does not match "
    890                            "previous connection_id.");
    891         return false;
    892       }
    893       public_header->connection_id_length = PACKET_4BYTE_CONNECTION_ID;
    894       public_header->connection_id = last_serialized_connection_id_;
    895       break;
    896     case PACKET_PUBLIC_FLAGS_1BYTE_CONNECTION_ID:
    897       if (!reader_->ReadBytes(&public_header->connection_id,
    898                               PACKET_1BYTE_CONNECTION_ID)) {
    899         set_detailed_error("Unable to read ConnectionId.");
    900         return false;
    901       }
    902       if ((public_header->connection_id & k1ByteConnectionIdMask) !=
    903           (last_serialized_connection_id_ & k1ByteConnectionIdMask)) {
    904         set_detailed_error("Truncated 1 byte ConnectionId does not match "
    905                            "previous connection_id.");
    906         return false;
    907       }
    908       public_header->connection_id_length = PACKET_1BYTE_CONNECTION_ID;
    909       public_header->connection_id = last_serialized_connection_id_;
    910       break;
    911     case PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID:
    912       public_header->connection_id_length = PACKET_0BYTE_CONNECTION_ID;
    913       public_header->connection_id = last_serialized_connection_id_;
    914       break;
    915   }
    916 
    917   public_header->sequence_number_length =
    918       ReadSequenceNumberLength(
    919           public_flags >> kPublicHeaderSequenceNumberShift);
    920 
    921   // Read the version only if the packet is from the client.
    922   // version flag from the server means version negotiation packet.
    923   if (public_header->version_flag && is_server_) {
    924     QuicTag version_tag;
    925     if (!reader_->ReadUInt32(&version_tag)) {
    926       set_detailed_error("Unable to read protocol version.");
    927       return false;
    928     }
    929 
    930     // If the version from the new packet is the same as the version of this
    931     // framer, then the public flags should be set to something we understand.
    932     // If not, this raises an error.
    933     QuicVersion version = QuicTagToQuicVersion(version_tag);
    934     if (version == quic_version_ && public_flags > PACKET_PUBLIC_FLAGS_MAX) {
    935       set_detailed_error("Illegal public flags value.");
    936       return false;
    937     }
    938     public_header->versions.push_back(version);
    939   }
    940   return true;
    941 }
    942 
    943 // static
    944 QuicSequenceNumberLength QuicFramer::GetMinSequenceNumberLength(
    945     QuicPacketSequenceNumber sequence_number) {
    946   if (sequence_number < 1 << (PACKET_1BYTE_SEQUENCE_NUMBER * 8)) {
    947     return PACKET_1BYTE_SEQUENCE_NUMBER;
    948   } else if (sequence_number < 1 << (PACKET_2BYTE_SEQUENCE_NUMBER * 8)) {
    949     return PACKET_2BYTE_SEQUENCE_NUMBER;
    950   } else if (sequence_number <
    951              GG_UINT64_C(1) << (PACKET_4BYTE_SEQUENCE_NUMBER * 8)) {
    952     return PACKET_4BYTE_SEQUENCE_NUMBER;
    953   } else {
    954     return PACKET_6BYTE_SEQUENCE_NUMBER;
    955   }
    956 }
    957 
    958 // static
    959 uint8 QuicFramer::GetSequenceNumberFlags(
    960     QuicSequenceNumberLength sequence_number_length) {
    961   switch (sequence_number_length) {
    962     case PACKET_1BYTE_SEQUENCE_NUMBER:
    963       return PACKET_FLAGS_1BYTE_SEQUENCE;
    964     case PACKET_2BYTE_SEQUENCE_NUMBER:
    965       return PACKET_FLAGS_2BYTE_SEQUENCE;
    966     case PACKET_4BYTE_SEQUENCE_NUMBER:
    967       return PACKET_FLAGS_4BYTE_SEQUENCE;
    968     case PACKET_6BYTE_SEQUENCE_NUMBER:
    969       return PACKET_FLAGS_6BYTE_SEQUENCE;
    970     default:
    971       LOG(DFATAL) << "Unreachable case statement.";
    972       return PACKET_FLAGS_6BYTE_SEQUENCE;
    973   }
    974 }
    975 
    976 // static
    977 QuicFramer::AckFrameInfo QuicFramer::GetAckFrameInfo(
    978     const QuicAckFrame& frame) {
    979   const ReceivedPacketInfo& received_info = frame.received_info;
    980 
    981   AckFrameInfo ack_info;
    982   if (!received_info.missing_packets.empty()) {
    983     DCHECK_GE(received_info.largest_observed,
    984               *received_info.missing_packets.rbegin());
    985     size_t cur_range_length = 0;
    986     SequenceNumberSet::const_iterator iter =
    987         received_info.missing_packets.begin();
    988     QuicPacketSequenceNumber last_missing = *iter;
    989     ++iter;
    990     for (; iter != received_info.missing_packets.end(); ++iter) {
    991       if (cur_range_length != numeric_limits<uint8>::max() &&
    992           *iter == (last_missing + 1)) {
    993         ++cur_range_length;
    994       } else {
    995         ack_info.nack_ranges[last_missing - cur_range_length]
    996             = cur_range_length;
    997         cur_range_length = 0;
    998       }
    999       ack_info.max_delta = max(ack_info.max_delta, *iter - last_missing);
   1000       last_missing = *iter;
   1001     }
   1002     // Include the last nack range.
   1003     ack_info.nack_ranges[last_missing - cur_range_length] = cur_range_length;
   1004     // Include the range to the largest observed.
   1005     ack_info.max_delta = max(ack_info.max_delta,
   1006                              received_info.largest_observed - last_missing);
   1007   }
   1008   return ack_info;
   1009 }
   1010 
   1011 bool QuicFramer::ProcessPacketHeader(
   1012     QuicPacketHeader* header,
   1013     const QuicEncryptedPacket& packet) {
   1014   if (!ProcessPacketSequenceNumber(header->public_header.sequence_number_length,
   1015                                    &header->packet_sequence_number)) {
   1016     set_detailed_error("Unable to read sequence number.");
   1017     return RaiseError(QUIC_INVALID_PACKET_HEADER);
   1018   }
   1019 
   1020   if (header->packet_sequence_number == 0u) {
   1021     set_detailed_error("Packet sequence numbers cannot be 0.");
   1022     return RaiseError(QUIC_INVALID_PACKET_HEADER);
   1023   }
   1024 
   1025   if (!visitor_->OnUnauthenticatedHeader(*header)) {
   1026     return false;
   1027   }
   1028 
   1029   if (!DecryptPayload(*header, packet)) {
   1030     set_detailed_error("Unable to decrypt payload.");
   1031     return RaiseError(QUIC_DECRYPTION_FAILURE);
   1032   }
   1033 
   1034   uint8 private_flags;
   1035   if (!reader_->ReadBytes(&private_flags, 1)) {
   1036     set_detailed_error("Unable to read private flags.");
   1037     return RaiseError(QUIC_INVALID_PACKET_HEADER);
   1038   }
   1039 
   1040   if (private_flags > PACKET_PRIVATE_FLAGS_MAX) {
   1041     set_detailed_error("Illegal private flags value.");
   1042     return RaiseError(QUIC_INVALID_PACKET_HEADER);
   1043   }
   1044 
   1045   header->entropy_flag = (private_flags & PACKET_PRIVATE_FLAGS_ENTROPY) != 0;
   1046   header->fec_flag = (private_flags & PACKET_PRIVATE_FLAGS_FEC) != 0;
   1047 
   1048   if ((private_flags & PACKET_PRIVATE_FLAGS_FEC_GROUP) != 0) {
   1049     header->is_in_fec_group = IN_FEC_GROUP;
   1050     uint8 first_fec_protected_packet_offset;
   1051     if (!reader_->ReadBytes(&first_fec_protected_packet_offset, 1)) {
   1052       set_detailed_error("Unable to read first fec protected packet offset.");
   1053       return RaiseError(QUIC_INVALID_PACKET_HEADER);
   1054     }
   1055     if (first_fec_protected_packet_offset >= header->packet_sequence_number) {
   1056       set_detailed_error("First fec protected packet offset must be less "
   1057                          "than the sequence number.");
   1058       return RaiseError(QUIC_INVALID_PACKET_HEADER);
   1059     }
   1060     header->fec_group =
   1061         header->packet_sequence_number - first_fec_protected_packet_offset;
   1062   }
   1063 
   1064   header->entropy_hash = GetPacketEntropyHash(*header);
   1065   // Set the last sequence number after we have decrypted the packet
   1066   // so we are confident is not attacker controlled.
   1067   last_sequence_number_ = header->packet_sequence_number;
   1068   return true;
   1069 }
   1070 
   1071 bool QuicFramer::ProcessPacketSequenceNumber(
   1072     QuicSequenceNumberLength sequence_number_length,
   1073     QuicPacketSequenceNumber* sequence_number) {
   1074   QuicPacketSequenceNumber wire_sequence_number = 0u;
   1075   if (!reader_->ReadBytes(&wire_sequence_number, sequence_number_length)) {
   1076     return false;
   1077   }
   1078 
   1079   // TODO(ianswett): Explore the usefulness of trying multiple sequence numbers
   1080   // in case the first guess is incorrect.
   1081   *sequence_number =
   1082       CalculatePacketSequenceNumberFromWire(sequence_number_length,
   1083                                             wire_sequence_number);
   1084   return true;
   1085 }
   1086 
   1087 bool QuicFramer::ProcessFrameData(const QuicPacketHeader& header) {
   1088   if (reader_->IsDoneReading()) {
   1089     set_detailed_error("Packet has no frames.");
   1090     return RaiseError(QUIC_MISSING_PAYLOAD);
   1091   }
   1092   while (!reader_->IsDoneReading()) {
   1093     uint8 frame_type;
   1094     if (!reader_->ReadBytes(&frame_type, 1)) {
   1095       set_detailed_error("Unable to read frame type.");
   1096       return RaiseError(QUIC_INVALID_FRAME_DATA);
   1097     }
   1098 
   1099     if (frame_type & kQuicFrameTypeSpecialMask) {
   1100       // Stream Frame
   1101       if (frame_type & kQuicFrameTypeStreamMask) {
   1102         QuicStreamFrame frame;
   1103         if (!ProcessStreamFrame(frame_type, &frame)) {
   1104           return RaiseError(QUIC_INVALID_STREAM_DATA);
   1105         }
   1106         if (!visitor_->OnStreamFrame(frame)) {
   1107           DVLOG(1) << "Visitor asked to stop further processing.";
   1108           // Returning true since there was no parsing error.
   1109           return true;
   1110         }
   1111         continue;
   1112       }
   1113 
   1114       // Ack Frame
   1115       if (frame_type & kQuicFrameTypeAckMask) {
   1116         QuicAckFrame frame;
   1117         if (!ProcessAckFrame(header, frame_type, &frame)) {
   1118           return RaiseError(QUIC_INVALID_ACK_DATA);
   1119         }
   1120         if (!visitor_->OnAckFrame(frame)) {
   1121           DVLOG(1) << "Visitor asked to stop further processing.";
   1122           // Returning true since there was no parsing error.
   1123           return true;
   1124         }
   1125         continue;
   1126       }
   1127 
   1128       // Congestion Feedback Frame
   1129       if (frame_type & kQuicFrameTypeCongestionFeedbackMask) {
   1130         QuicCongestionFeedbackFrame frame;
   1131         if (!ProcessQuicCongestionFeedbackFrame(&frame)) {
   1132           return RaiseError(QUIC_INVALID_CONGESTION_FEEDBACK_DATA);
   1133         }
   1134         if (!visitor_->OnCongestionFeedbackFrame(frame)) {
   1135           DVLOG(1) << "Visitor asked to stop further processing.";
   1136           // Returning true since there was no parsing error.
   1137           return true;
   1138         }
   1139         continue;
   1140       }
   1141 
   1142       // This was a special frame type that did not match any
   1143       // of the known ones. Error.
   1144       set_detailed_error("Illegal frame type.");
   1145       DLOG(WARNING) << "Illegal frame type: "
   1146                     << static_cast<int>(frame_type);
   1147       return RaiseError(QUIC_INVALID_FRAME_DATA);
   1148     }
   1149 
   1150     switch (frame_type) {
   1151       case PADDING_FRAME:
   1152         // We're done with the packet.
   1153         return true;
   1154 
   1155       case RST_STREAM_FRAME: {
   1156         QuicRstStreamFrame frame;
   1157         if (!ProcessRstStreamFrame(&frame)) {
   1158           return RaiseError(QUIC_INVALID_RST_STREAM_DATA);
   1159         }
   1160         if (!visitor_->OnRstStreamFrame(frame)) {
   1161           DVLOG(1) << "Visitor asked to stop further processing.";
   1162           // Returning true since there was no parsing error.
   1163           return true;
   1164         }
   1165         continue;
   1166       }
   1167 
   1168       case CONNECTION_CLOSE_FRAME: {
   1169         QuicConnectionCloseFrame frame;
   1170         if (!ProcessConnectionCloseFrame(&frame)) {
   1171           return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA);
   1172         }
   1173 
   1174         if (!visitor_->OnConnectionCloseFrame(frame)) {
   1175           DVLOG(1) << "Visitor asked to stop further processing.";
   1176           // Returning true since there was no parsing error.
   1177           return true;
   1178         }
   1179         continue;
   1180       }
   1181 
   1182       case GOAWAY_FRAME: {
   1183         QuicGoAwayFrame goaway_frame;
   1184         if (!ProcessGoAwayFrame(&goaway_frame)) {
   1185           return RaiseError(QUIC_INVALID_GOAWAY_DATA);
   1186         }
   1187         if (!visitor_->OnGoAwayFrame(goaway_frame)) {
   1188           DVLOG(1) << "Visitor asked to stop further processing.";
   1189           // Returning true since there was no parsing error.
   1190           return true;
   1191         }
   1192         continue;
   1193       }
   1194 
   1195       case WINDOW_UPDATE_FRAME: {
   1196         QuicWindowUpdateFrame window_update_frame;
   1197         if (!ProcessWindowUpdateFrame(&window_update_frame)) {
   1198           return RaiseError(QUIC_INVALID_WINDOW_UPDATE_DATA);
   1199         }
   1200         if (!visitor_->OnWindowUpdateFrame(window_update_frame)) {
   1201           DVLOG(1) << "Visitor asked to stop further processing.";
   1202           // Returning true since there was no parsing error.
   1203           return true;
   1204         }
   1205         continue;
   1206       }
   1207 
   1208       case BLOCKED_FRAME: {
   1209         QuicBlockedFrame blocked_frame;
   1210         if (!ProcessBlockedFrame(&blocked_frame)) {
   1211           return RaiseError(QUIC_INVALID_BLOCKED_DATA);
   1212         }
   1213         if (!visitor_->OnBlockedFrame(blocked_frame)) {
   1214           DVLOG(1) << "Visitor asked to stop further processing.";
   1215           // Returning true since there was no parsing error.
   1216           return true;
   1217         }
   1218         continue;
   1219       }
   1220 
   1221       case STOP_WAITING_FRAME: {
   1222         if (quic_version_ <= QUIC_VERSION_15) {
   1223           LOG(DFATAL) << "Trying to read a StopWaiting in "
   1224                       << QuicVersionToString(quic_version_);
   1225           return RaiseError(QUIC_INTERNAL_ERROR);
   1226         }
   1227         QuicStopWaitingFrame stop_waiting_frame;
   1228         if (!ProcessStopWaitingFrame(header, &stop_waiting_frame)) {
   1229           return RaiseError(QUIC_INVALID_STOP_WAITING_DATA);
   1230         }
   1231         if (!visitor_->OnStopWaitingFrame(stop_waiting_frame)) {
   1232           DVLOG(1) << "Visitor asked to stop further processing.";
   1233           // Returning true since there was no parsing error.
   1234           return true;
   1235         }
   1236         continue;
   1237       }
   1238       case PING_FRAME: {
   1239         if (quic_version_ <= QUIC_VERSION_17) {
   1240           LOG(DFATAL) << "Trying to read a Ping in "
   1241                       << QuicVersionToString(quic_version_);
   1242           return RaiseError(QUIC_INTERNAL_ERROR);
   1243         }
   1244         // Ping has no payload.
   1245         QuicPingFrame ping_frame;
   1246         if (!visitor_->OnPingFrame(ping_frame)) {
   1247           DVLOG(1) << "Visitor asked to stop further processing.";
   1248           // Returning true since there was no parsing error.
   1249           return true;
   1250         }
   1251         continue;
   1252       }
   1253 
   1254       default:
   1255         set_detailed_error("Illegal frame type.");
   1256         DLOG(WARNING) << "Illegal frame type: "
   1257                       << static_cast<int>(frame_type);
   1258         return RaiseError(QUIC_INVALID_FRAME_DATA);
   1259     }
   1260   }
   1261 
   1262   return true;
   1263 }
   1264 
   1265 bool QuicFramer::ProcessStreamFrame(uint8 frame_type,
   1266                                     QuicStreamFrame* frame) {
   1267   uint8 stream_flags = frame_type;
   1268 
   1269   stream_flags &= ~kQuicFrameTypeStreamMask;
   1270 
   1271   // Read from right to left: StreamID, Offset, Data Length, Fin.
   1272   const uint8 stream_id_length = (stream_flags & kQuicStreamIDLengthMask) + 1;
   1273   stream_flags >>= kQuicStreamIdShift;
   1274 
   1275   uint8 offset_length = (stream_flags & kQuicStreamOffsetMask);
   1276   // There is no encoding for 1 byte, only 0 and 2 through 8.
   1277   if (offset_length > 0) {
   1278     offset_length += 1;
   1279   }
   1280   stream_flags >>= kQuicStreamOffsetShift;
   1281 
   1282   bool has_data_length =
   1283       (stream_flags & kQuicStreamDataLengthMask) == kQuicStreamDataLengthMask;
   1284   stream_flags >>= kQuicStreamDataLengthShift;
   1285 
   1286   frame->fin = (stream_flags & kQuicStreamFinMask) == kQuicStreamFinShift;
   1287 
   1288   frame->stream_id = 0;
   1289   if (!reader_->ReadBytes(&frame->stream_id, stream_id_length)) {
   1290     set_detailed_error("Unable to read stream_id.");
   1291     return false;
   1292   }
   1293 
   1294   frame->offset = 0;
   1295   if (!reader_->ReadBytes(&frame->offset, offset_length)) {
   1296     set_detailed_error("Unable to read offset.");
   1297     return false;
   1298   }
   1299 
   1300   StringPiece frame_data;
   1301   if (has_data_length) {
   1302     if (!reader_->ReadStringPiece16(&frame_data)) {
   1303       set_detailed_error("Unable to read frame data.");
   1304       return false;
   1305     }
   1306   } else {
   1307     if (!reader_->ReadStringPiece(&frame_data, reader_->BytesRemaining())) {
   1308       set_detailed_error("Unable to read frame data.");
   1309       return false;
   1310     }
   1311   }
   1312   // Point frame to the right data.
   1313   frame->data.Clear();
   1314   if (!frame_data.empty()) {
   1315     frame->data.Append(const_cast<char*>(frame_data.data()), frame_data.size());
   1316   }
   1317 
   1318   return true;
   1319 }
   1320 
   1321 bool QuicFramer::ProcessAckFrame(const QuicPacketHeader& header,
   1322                                  uint8 frame_type,
   1323                                  QuicAckFrame* frame) {
   1324   if (quic_version_ <= QUIC_VERSION_15) {
   1325     if (!ProcessStopWaitingFrame(header, &frame->sent_info)) {
   1326       return false;
   1327     }
   1328   }
   1329   if (!ProcessReceivedInfo(frame_type, &frame->received_info)) {
   1330     return false;
   1331   }
   1332   return true;
   1333 }
   1334 
   1335 bool QuicFramer::ProcessReceivedInfo(uint8 frame_type,
   1336                                      ReceivedPacketInfo* received_info) {
   1337   // Determine the three lengths from the frame type: largest observed length,
   1338   // missing sequence number length, and missing range length.
   1339   const QuicSequenceNumberLength missing_sequence_number_length =
   1340       ReadSequenceNumberLength(frame_type);
   1341   frame_type >>= kQuicSequenceNumberLengthShift;
   1342   const QuicSequenceNumberLength largest_observed_sequence_number_length =
   1343       ReadSequenceNumberLength(frame_type);
   1344   frame_type >>= kQuicSequenceNumberLengthShift;
   1345   received_info->is_truncated = frame_type & kQuicAckTruncatedMask;
   1346   frame_type >>= kQuicAckTruncatedShift;
   1347   bool has_nacks = frame_type & kQuicHasNacksMask;
   1348 
   1349   if (!reader_->ReadBytes(&received_info->entropy_hash, 1)) {
   1350     set_detailed_error("Unable to read entropy hash for received packets.");
   1351     return false;
   1352   }
   1353 
   1354   if (!reader_->ReadBytes(&received_info->largest_observed,
   1355                           largest_observed_sequence_number_length)) {
   1356     set_detailed_error("Unable to read largest observed.");
   1357     return false;
   1358   }
   1359 
   1360   uint64 delta_time_largest_observed_us;
   1361   if (!reader_->ReadUFloat16(&delta_time_largest_observed_us)) {
   1362     set_detailed_error("Unable to read delta time largest observed.");
   1363     return false;
   1364   }
   1365 
   1366   if (delta_time_largest_observed_us == kUFloat16MaxValue) {
   1367     received_info->delta_time_largest_observed = QuicTime::Delta::Infinite();
   1368   } else {
   1369     received_info->delta_time_largest_observed =
   1370         QuicTime::Delta::FromMicroseconds(delta_time_largest_observed_us);
   1371   }
   1372 
   1373   if (!has_nacks) {
   1374     return true;
   1375   }
   1376 
   1377   uint8 num_missing_ranges;
   1378   if (!reader_->ReadBytes(&num_missing_ranges, 1)) {
   1379     set_detailed_error("Unable to read num missing packet ranges.");
   1380     return false;
   1381   }
   1382 
   1383   QuicPacketSequenceNumber last_sequence_number =
   1384       received_info->largest_observed;
   1385   for (size_t i = 0; i < num_missing_ranges; ++i) {
   1386     QuicPacketSequenceNumber missing_delta = 0;
   1387     if (!reader_->ReadBytes(&missing_delta, missing_sequence_number_length)) {
   1388       set_detailed_error("Unable to read missing sequence number delta.");
   1389       return false;
   1390     }
   1391     last_sequence_number -= missing_delta;
   1392     QuicPacketSequenceNumber range_length = 0;
   1393     if (!reader_->ReadBytes(&range_length, PACKET_1BYTE_SEQUENCE_NUMBER)) {
   1394       set_detailed_error("Unable to read missing sequence number range.");
   1395       return false;
   1396     }
   1397     for (size_t i = 0; i <= range_length; ++i) {
   1398       received_info->missing_packets.insert(last_sequence_number - i);
   1399     }
   1400     // Subtract an extra 1 to ensure ranges are represented efficiently and
   1401     // can't overlap by 1 sequence number.  This allows a missing_delta of 0
   1402     // to represent an adjacent nack range.
   1403     last_sequence_number -= (range_length + 1);
   1404   }
   1405 
   1406   // Parse the revived packets list.
   1407   uint8 num_revived_packets;
   1408   if (!reader_->ReadBytes(&num_revived_packets, 1)) {
   1409     set_detailed_error("Unable to read num revived packets.");
   1410     return false;
   1411   }
   1412 
   1413   for (size_t i = 0; i < num_revived_packets; ++i) {
   1414     QuicPacketSequenceNumber revived_packet = 0;
   1415     if (!reader_->ReadBytes(&revived_packet,
   1416                             largest_observed_sequence_number_length)) {
   1417       set_detailed_error("Unable to read revived packet.");
   1418       return false;
   1419     }
   1420 
   1421     received_info->revived_packets.insert(revived_packet);
   1422   }
   1423 
   1424   return true;
   1425 }
   1426 
   1427 bool QuicFramer::ProcessStopWaitingFrame(const QuicPacketHeader& header,
   1428                                          QuicStopWaitingFrame* stop_waiting) {
   1429   if (!reader_->ReadBytes(&stop_waiting->entropy_hash, 1)) {
   1430     set_detailed_error("Unable to read entropy hash for sent packets.");
   1431     return false;
   1432   }
   1433 
   1434   QuicPacketSequenceNumber least_unacked_delta = 0;
   1435   if (!reader_->ReadBytes(&least_unacked_delta,
   1436                           header.public_header.sequence_number_length)) {
   1437     set_detailed_error("Unable to read least unacked delta.");
   1438     return false;
   1439   }
   1440   DCHECK_GE(header.packet_sequence_number, least_unacked_delta);
   1441   stop_waiting->least_unacked =
   1442       header.packet_sequence_number - least_unacked_delta;
   1443 
   1444   return true;
   1445 }
   1446 
   1447 bool QuicFramer::ProcessQuicCongestionFeedbackFrame(
   1448     QuicCongestionFeedbackFrame* frame) {
   1449   uint8 feedback_type;
   1450   if (!reader_->ReadBytes(&feedback_type, 1)) {
   1451     set_detailed_error("Unable to read congestion feedback type.");
   1452     return false;
   1453   }
   1454   frame->type =
   1455       static_cast<CongestionFeedbackType>(feedback_type);
   1456 
   1457   switch (frame->type) {
   1458     case kInterArrival: {
   1459       CongestionFeedbackMessageInterArrival* inter_arrival =
   1460           &frame->inter_arrival;
   1461       uint8 num_received_packets;
   1462       if (!reader_->ReadBytes(&num_received_packets, 1)) {
   1463         set_detailed_error("Unable to read num received packets.");
   1464         return false;
   1465       }
   1466 
   1467       if (num_received_packets > 0u) {
   1468         uint64 smallest_received;
   1469         if (!ProcessPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
   1470                                          &smallest_received)) {
   1471           set_detailed_error("Unable to read smallest received.");
   1472           return false;
   1473         }
   1474 
   1475         uint64 time_received_us;
   1476         if (!reader_->ReadUInt64(&time_received_us)) {
   1477           set_detailed_error("Unable to read time received.");
   1478           return false;
   1479         }
   1480         QuicTime time_received = creation_time_.Add(
   1481             QuicTime::Delta::FromMicroseconds(time_received_us));
   1482 
   1483         inter_arrival->received_packet_times.insert(
   1484             make_pair(smallest_received, time_received));
   1485 
   1486         for (uint8 i = 0; i < num_received_packets - 1; ++i) {
   1487           uint16 sequence_delta;
   1488           if (!reader_->ReadUInt16(&sequence_delta)) {
   1489             set_detailed_error(
   1490                 "Unable to read sequence delta in received packets.");
   1491             return false;
   1492           }
   1493 
   1494           int32 time_delta_us;
   1495           if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) {
   1496             set_detailed_error(
   1497                 "Unable to read time delta in received packets.");
   1498             return false;
   1499           }
   1500           QuicPacketSequenceNumber packet = smallest_received + sequence_delta;
   1501           inter_arrival->received_packet_times.insert(
   1502               make_pair(packet, time_received.Add(
   1503                   QuicTime::Delta::FromMicroseconds(time_delta_us))));
   1504         }
   1505       }
   1506       break;
   1507     }
   1508     case kFixRate: {
   1509       uint32 bitrate = 0;
   1510       if (!reader_->ReadUInt32(&bitrate)) {
   1511         set_detailed_error("Unable to read bitrate.");
   1512         return false;
   1513       }
   1514       frame->fix_rate.bitrate = QuicBandwidth::FromBytesPerSecond(bitrate);
   1515       break;
   1516     }
   1517     case kTCP: {
   1518       CongestionFeedbackMessageTCP* tcp = &frame->tcp;
   1519       // TODO(ianswett): Remove receive window, since it's constant.
   1520       uint16 receive_window = 0;
   1521       if (!reader_->ReadUInt16(&receive_window)) {
   1522         set_detailed_error("Unable to read receive window.");
   1523         return false;
   1524       }
   1525       // Simple bit packing, don't send the 4 least significant bits.
   1526       tcp->receive_window = static_cast<QuicByteCount>(receive_window) << 4;
   1527       break;
   1528     }
   1529     default:
   1530       set_detailed_error("Illegal congestion feedback type.");
   1531       DLOG(WARNING) << "Illegal congestion feedback type: "
   1532                     << frame->type;
   1533       return RaiseError(QUIC_INVALID_FRAME_DATA);
   1534   }
   1535 
   1536   return true;
   1537 }
   1538 
   1539 bool QuicFramer::ProcessRstStreamFrame(QuicRstStreamFrame* frame) {
   1540   if (!reader_->ReadUInt32(&frame->stream_id)) {
   1541     set_detailed_error("Unable to read stream_id.");
   1542     return false;
   1543   }
   1544 
   1545   if (!reader_->ReadUInt64(&frame->byte_offset)) {
   1546     set_detailed_error("Unable to read rst stream sent byte offset.");
   1547     return false;
   1548   }
   1549 
   1550   uint32 error_code;
   1551   if (!reader_->ReadUInt32(&error_code)) {
   1552     set_detailed_error("Unable to read rst stream error code.");
   1553     return false;
   1554   }
   1555 
   1556   if (error_code >= QUIC_STREAM_LAST_ERROR ||
   1557       error_code < QUIC_STREAM_NO_ERROR) {
   1558     set_detailed_error("Invalid rst stream error code.");
   1559     return false;
   1560   }
   1561 
   1562   frame->error_code = static_cast<QuicRstStreamErrorCode>(error_code);
   1563 
   1564   StringPiece error_details;
   1565   if (!reader_->ReadStringPiece16(&error_details)) {
   1566     set_detailed_error("Unable to read rst stream error details.");
   1567     return false;
   1568   }
   1569   frame->error_details = error_details.as_string();
   1570 
   1571   return true;
   1572 }
   1573 
   1574 bool QuicFramer::ProcessConnectionCloseFrame(QuicConnectionCloseFrame* frame) {
   1575   uint32 error_code;
   1576   if (!reader_->ReadUInt32(&error_code)) {
   1577     set_detailed_error("Unable to read connection close error code.");
   1578     return false;
   1579   }
   1580 
   1581   if (error_code >= QUIC_LAST_ERROR ||
   1582          error_code < QUIC_NO_ERROR) {
   1583     set_detailed_error("Invalid error code.");
   1584     return false;
   1585   }
   1586 
   1587   frame->error_code = static_cast<QuicErrorCode>(error_code);
   1588 
   1589   StringPiece error_details;
   1590   if (!reader_->ReadStringPiece16(&error_details)) {
   1591     set_detailed_error("Unable to read connection close error details.");
   1592     return false;
   1593   }
   1594   frame->error_details = error_details.as_string();
   1595 
   1596   return true;
   1597 }
   1598 
   1599 bool QuicFramer::ProcessGoAwayFrame(QuicGoAwayFrame* frame) {
   1600   uint32 error_code;
   1601   if (!reader_->ReadUInt32(&error_code)) {
   1602     set_detailed_error("Unable to read go away error code.");
   1603     return false;
   1604   }
   1605   frame->error_code = static_cast<QuicErrorCode>(error_code);
   1606 
   1607   if (error_code >= QUIC_LAST_ERROR ||
   1608       error_code < QUIC_NO_ERROR) {
   1609     set_detailed_error("Invalid error code.");
   1610     return false;
   1611   }
   1612 
   1613   uint32 stream_id;
   1614   if (!reader_->ReadUInt32(&stream_id)) {
   1615     set_detailed_error("Unable to read last good stream id.");
   1616     return false;
   1617   }
   1618   frame->last_good_stream_id = static_cast<QuicStreamId>(stream_id);
   1619 
   1620   StringPiece reason_phrase;
   1621   if (!reader_->ReadStringPiece16(&reason_phrase)) {
   1622     set_detailed_error("Unable to read goaway reason.");
   1623     return false;
   1624   }
   1625   frame->reason_phrase = reason_phrase.as_string();
   1626 
   1627   return true;
   1628 }
   1629 
   1630 bool QuicFramer::ProcessWindowUpdateFrame(QuicWindowUpdateFrame* frame) {
   1631   if (!reader_->ReadUInt32(&frame->stream_id)) {
   1632     set_detailed_error("Unable to read stream_id.");
   1633     return false;
   1634   }
   1635 
   1636   if (!reader_->ReadUInt64(&frame->byte_offset)) {
   1637     set_detailed_error("Unable to read window byte_offset.");
   1638     return false;
   1639   }
   1640 
   1641   return true;
   1642 }
   1643 
   1644 bool QuicFramer::ProcessBlockedFrame(QuicBlockedFrame* frame) {
   1645   if (!reader_->ReadUInt32(&frame->stream_id)) {
   1646     set_detailed_error("Unable to read stream_id.");
   1647     return false;
   1648   }
   1649 
   1650   return true;
   1651 }
   1652 
   1653 // static
   1654 StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket(
   1655     const QuicEncryptedPacket& encrypted,
   1656     QuicConnectionIdLength connection_id_length,
   1657     bool includes_version,
   1658     QuicSequenceNumberLength sequence_number_length) {
   1659   return StringPiece(
   1660       encrypted.data() + kStartOfHashData, GetStartOfEncryptedData(
   1661           connection_id_length, includes_version, sequence_number_length)
   1662       - kStartOfHashData);
   1663 }
   1664 
   1665 void QuicFramer::SetDecrypter(QuicDecrypter* decrypter,
   1666                               EncryptionLevel level) {
   1667   DCHECK(alternative_decrypter_.get() == NULL);
   1668   DCHECK_GE(level, decrypter_level_);
   1669   decrypter_.reset(decrypter);
   1670   decrypter_level_ = level;
   1671 }
   1672 
   1673 void QuicFramer::SetAlternativeDecrypter(QuicDecrypter* decrypter,
   1674                                          EncryptionLevel level,
   1675                                          bool latch_once_used) {
   1676   alternative_decrypter_.reset(decrypter);
   1677   alternative_decrypter_level_ = level;
   1678   alternative_decrypter_latch_ = latch_once_used;
   1679 }
   1680 
   1681 const QuicDecrypter* QuicFramer::decrypter() const {
   1682   return decrypter_.get();
   1683 }
   1684 
   1685 const QuicDecrypter* QuicFramer::alternative_decrypter() const {
   1686   return alternative_decrypter_.get();
   1687 }
   1688 
   1689 void QuicFramer::SetEncrypter(EncryptionLevel level,
   1690                               QuicEncrypter* encrypter) {
   1691   DCHECK_GE(level, 0);
   1692   DCHECK_LT(level, NUM_ENCRYPTION_LEVELS);
   1693   encrypter_[level].reset(encrypter);
   1694 }
   1695 
   1696 const QuicEncrypter* QuicFramer::encrypter(EncryptionLevel level) const {
   1697   DCHECK_GE(level, 0);
   1698   DCHECK_LT(level, NUM_ENCRYPTION_LEVELS);
   1699   DCHECK(encrypter_[level].get() != NULL);
   1700   return encrypter_[level].get();
   1701 }
   1702 
   1703 QuicEncryptedPacket* QuicFramer::EncryptPacket(
   1704     EncryptionLevel level,
   1705     QuicPacketSequenceNumber packet_sequence_number,
   1706     const QuicPacket& packet) {
   1707   DCHECK(encrypter_[level].get() != NULL);
   1708 
   1709   scoped_ptr<QuicData> out(encrypter_[level]->EncryptPacket(
   1710       packet_sequence_number, packet.AssociatedData(), packet.Plaintext()));
   1711   if (out.get() == NULL) {
   1712     RaiseError(QUIC_ENCRYPTION_FAILURE);
   1713     return NULL;
   1714   }
   1715   StringPiece header_data = packet.BeforePlaintext();
   1716   size_t len =  header_data.length() + out->length();
   1717   char* buffer = new char[len];
   1718   // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt().
   1719   memcpy(buffer, header_data.data(), header_data.length());
   1720   memcpy(buffer + header_data.length(), out->data(), out->length());
   1721   return new QuicEncryptedPacket(buffer, len, true);
   1722 }
   1723 
   1724 size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) {
   1725   // In order to keep the code simple, we don't have the current encryption
   1726   // level to hand. Both the NullEncrypter and AES-GCM have a tag length of 12.
   1727   size_t min_plaintext_size = ciphertext_size;
   1728 
   1729   for (int i = ENCRYPTION_NONE; i < NUM_ENCRYPTION_LEVELS; i++) {
   1730     if (encrypter_[i].get() != NULL) {
   1731       size_t size = encrypter_[i]->GetMaxPlaintextSize(ciphertext_size);
   1732       if (size < min_plaintext_size) {
   1733         min_plaintext_size = size;
   1734       }
   1735     }
   1736   }
   1737 
   1738   return min_plaintext_size;
   1739 }
   1740 
   1741 bool QuicFramer::DecryptPayload(const QuicPacketHeader& header,
   1742                                 const QuicEncryptedPacket& packet) {
   1743   StringPiece encrypted;
   1744   if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) {
   1745     return false;
   1746   }
   1747   DCHECK(decrypter_.get() != NULL);
   1748   decrypted_.reset(decrypter_->DecryptPacket(
   1749       header.packet_sequence_number,
   1750       GetAssociatedDataFromEncryptedPacket(
   1751           packet,
   1752           header.public_header.connection_id_length,
   1753           header.public_header.version_flag,
   1754           header.public_header.sequence_number_length),
   1755       encrypted));
   1756   if  (decrypted_.get() != NULL) {
   1757     visitor_->OnDecryptedPacket(decrypter_level_);
   1758   } else if  (alternative_decrypter_.get() != NULL) {
   1759     decrypted_.reset(alternative_decrypter_->DecryptPacket(
   1760         header.packet_sequence_number,
   1761         GetAssociatedDataFromEncryptedPacket(
   1762             packet,
   1763             header.public_header.connection_id_length,
   1764             header.public_header.version_flag,
   1765             header.public_header.sequence_number_length),
   1766         encrypted));
   1767     if (decrypted_.get() != NULL) {
   1768       visitor_->OnDecryptedPacket(alternative_decrypter_level_);
   1769       if (alternative_decrypter_latch_) {
   1770         // Switch to the alternative decrypter and latch so that we cannot
   1771         // switch back.
   1772         decrypter_.reset(alternative_decrypter_.release());
   1773         decrypter_level_ = alternative_decrypter_level_;
   1774         alternative_decrypter_level_ = ENCRYPTION_NONE;
   1775       } else {
   1776         // Switch the alternative decrypter so that we use it first next time.
   1777         decrypter_.swap(alternative_decrypter_);
   1778         EncryptionLevel level = alternative_decrypter_level_;
   1779         alternative_decrypter_level_ = decrypter_level_;
   1780         decrypter_level_ = level;
   1781       }
   1782     }
   1783   }
   1784 
   1785   if  (decrypted_.get() == NULL) {
   1786     DLOG(WARNING) << "DecryptPacket failed for sequence_number:"
   1787                   << header.packet_sequence_number;
   1788     return false;
   1789   }
   1790 
   1791   reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length()));
   1792   return true;
   1793 }
   1794 
   1795 size_t QuicFramer::GetAckFrameSize(
   1796     const QuicAckFrame& ack,
   1797     QuicSequenceNumberLength sequence_number_length) {
   1798   AckFrameInfo ack_info = GetAckFrameInfo(ack);
   1799   QuicSequenceNumberLength largest_observed_length =
   1800       GetMinSequenceNumberLength(ack.received_info.largest_observed);
   1801   QuicSequenceNumberLength missing_sequence_number_length =
   1802       GetMinSequenceNumberLength(ack_info.max_delta);
   1803 
   1804   size_t ack_size = GetMinAckFrameSize(quic_version_,
   1805                                        sequence_number_length,
   1806                                        largest_observed_length);
   1807   if (!ack_info.nack_ranges.empty()) {
   1808     ack_size += kNumberOfNackRangesSize  + kNumberOfRevivedPacketsSize;
   1809     ack_size += min(ack_info.nack_ranges.size(), kMaxNackRanges) *
   1810       (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER);
   1811     ack_size += min(ack.received_info.revived_packets.size(),
   1812                     kMaxRevivedPackets) * largest_observed_length;
   1813   }
   1814   return ack_size;
   1815 }
   1816 
   1817 size_t QuicFramer::ComputeFrameLength(
   1818     const QuicFrame& frame,
   1819     bool last_frame_in_packet,
   1820     InFecGroup is_in_fec_group,
   1821     QuicSequenceNumberLength sequence_number_length) {
   1822   switch (frame.type) {
   1823     case STREAM_FRAME:
   1824       return GetMinStreamFrameSize(quic_version_,
   1825                                    frame.stream_frame->stream_id,
   1826                                    frame.stream_frame->offset,
   1827                                    last_frame_in_packet,
   1828                                    is_in_fec_group) +
   1829           frame.stream_frame->data.TotalBufferSize();
   1830     case ACK_FRAME: {
   1831       return GetAckFrameSize(*frame.ack_frame, sequence_number_length);
   1832     }
   1833     case CONGESTION_FEEDBACK_FRAME: {
   1834       size_t len = kQuicFrameTypeSize;
   1835       const QuicCongestionFeedbackFrame& congestion_feedback =
   1836           *frame.congestion_feedback_frame;
   1837       len += 1;  // Congestion feedback type.
   1838 
   1839       switch (congestion_feedback.type) {
   1840         case kInterArrival: {
   1841           const CongestionFeedbackMessageInterArrival& inter_arrival =
   1842               congestion_feedback.inter_arrival;
   1843           len += 1;  // Number received packets.
   1844           if (inter_arrival.received_packet_times.size() > 0) {
   1845             len += PACKET_6BYTE_SEQUENCE_NUMBER;  // Smallest received.
   1846             len += 8;  // Time.
   1847             // 2 bytes per sequence number delta plus 4 bytes per delta time.
   1848             len += PACKET_6BYTE_SEQUENCE_NUMBER *
   1849                 (inter_arrival.received_packet_times.size() - 1);
   1850           }
   1851           break;
   1852         }
   1853         case kFixRate:
   1854           len += 4;  // Bitrate.
   1855           break;
   1856         case kTCP:
   1857           len += 2;  // Receive window.
   1858           break;
   1859         default:
   1860           set_detailed_error("Illegal feedback type.");
   1861           DVLOG(1) << "Illegal feedback type: " << congestion_feedback.type;
   1862           break;
   1863       }
   1864       return len;
   1865     }
   1866     case STOP_WAITING_FRAME:
   1867       return GetStopWaitingFrameSize(sequence_number_length);
   1868     case PING_FRAME:
   1869       // Ping has no payload.
   1870       return kQuicFrameTypeSize;
   1871     case RST_STREAM_FRAME:
   1872       return GetMinRstStreamFrameSize(quic_version_) +
   1873           frame.rst_stream_frame->error_details.size();
   1874     case CONNECTION_CLOSE_FRAME:
   1875       return GetMinConnectionCloseFrameSize() +
   1876           frame.connection_close_frame->error_details.size();
   1877     case GOAWAY_FRAME:
   1878       return GetMinGoAwayFrameSize() + frame.goaway_frame->reason_phrase.size();
   1879     case WINDOW_UPDATE_FRAME:
   1880       return GetWindowUpdateFrameSize();
   1881     case BLOCKED_FRAME:
   1882       return GetBlockedFrameSize();
   1883     case PADDING_FRAME:
   1884       DCHECK(false);
   1885       return 0;
   1886     case NUM_FRAME_TYPES:
   1887       DCHECK(false);
   1888       return 0;
   1889   }
   1890 
   1891   // Not reachable, but some Chrome compilers can't figure that out.  *sigh*
   1892   DCHECK(false);
   1893   return 0;
   1894 }
   1895 
   1896 bool QuicFramer::AppendTypeByte(const QuicFrame& frame,
   1897                                 bool no_stream_frame_length,
   1898                                 QuicDataWriter* writer) {
   1899   uint8 type_byte = 0;
   1900   switch (frame.type) {
   1901     case STREAM_FRAME: {
   1902       if (frame.stream_frame == NULL) {
   1903         LOG(DFATAL) << "Failed to append STREAM frame with no stream_frame.";
   1904       }
   1905       // Fin bit.
   1906       type_byte |= frame.stream_frame->fin ? kQuicStreamFinMask : 0;
   1907 
   1908       // Data Length bit.
   1909       type_byte <<= kQuicStreamDataLengthShift;
   1910       type_byte |= no_stream_frame_length ? 0: kQuicStreamDataLengthMask;
   1911 
   1912       // Offset 3 bits.
   1913       type_byte <<= kQuicStreamOffsetShift;
   1914       const size_t offset_len = GetStreamOffsetSize(frame.stream_frame->offset);
   1915       if (offset_len > 0) {
   1916         type_byte |= offset_len - 1;
   1917       }
   1918 
   1919       // stream id 2 bits.
   1920       type_byte <<= kQuicStreamIdShift;
   1921       type_byte |= GetStreamIdSize(frame.stream_frame->stream_id) - 1;
   1922       type_byte |= kQuicFrameTypeStreamMask;  // Set Stream Frame Type to 1.
   1923       break;
   1924     }
   1925     case ACK_FRAME:
   1926       return true;
   1927     case CONGESTION_FEEDBACK_FRAME: {
   1928       // TODO(ianswett): Use extra 5 bits in the congestion feedback framing.
   1929       type_byte = kQuicFrameTypeCongestionFeedbackMask;
   1930       break;
   1931     }
   1932     default:
   1933       type_byte = frame.type;
   1934       break;
   1935   }
   1936 
   1937   return writer->WriteUInt8(type_byte);
   1938 }
   1939 
   1940 // static
   1941 bool QuicFramer::AppendPacketSequenceNumber(
   1942     QuicSequenceNumberLength sequence_number_length,
   1943     QuicPacketSequenceNumber packet_sequence_number,
   1944     QuicDataWriter* writer) {
   1945   // Ensure the entire sequence number can be written.
   1946   if (writer->capacity() - writer->length() <
   1947       static_cast<size_t>(sequence_number_length)) {
   1948     return false;
   1949   }
   1950   switch (sequence_number_length) {
   1951     case PACKET_1BYTE_SEQUENCE_NUMBER:
   1952       return writer->WriteUInt8(
   1953           packet_sequence_number & k1ByteSequenceNumberMask);
   1954       break;
   1955     case PACKET_2BYTE_SEQUENCE_NUMBER:
   1956       return writer->WriteUInt16(
   1957           packet_sequence_number & k2ByteSequenceNumberMask);
   1958       break;
   1959     case PACKET_4BYTE_SEQUENCE_NUMBER:
   1960       return writer->WriteUInt32(
   1961           packet_sequence_number & k4ByteSequenceNumberMask);
   1962       break;
   1963     case PACKET_6BYTE_SEQUENCE_NUMBER:
   1964       return writer->WriteUInt48(
   1965           packet_sequence_number & k6ByteSequenceNumberMask);
   1966       break;
   1967     default:
   1968       DCHECK(false) << "sequence_number_length: " << sequence_number_length;
   1969       return false;
   1970   }
   1971 }
   1972 
   1973 bool QuicFramer::AppendStreamFrame(
   1974     const QuicStreamFrame& frame,
   1975     bool no_stream_frame_length,
   1976     QuicDataWriter* writer) {
   1977   if (!writer->WriteBytes(&frame.stream_id, GetStreamIdSize(frame.stream_id))) {
   1978     LOG(DFATAL) << "Writing stream id size failed.";
   1979     return false;
   1980   }
   1981   if (!writer->WriteBytes(&frame.offset, GetStreamOffsetSize(frame.offset))) {
   1982     LOG(DFATAL) << "Writing offset size failed.";
   1983     return false;
   1984   }
   1985   if (!no_stream_frame_length) {
   1986     if (!writer->WriteUInt16(frame.data.TotalBufferSize())) {
   1987       LOG(DFATAL) << "Writing stream frame length failed";
   1988       return false;
   1989     }
   1990   }
   1991 
   1992   if (!writer->WriteIOVector(frame.data)) {
   1993     LOG(DFATAL) << "Writing frame data failed.";
   1994     return false;
   1995   }
   1996   return true;
   1997 }
   1998 
   1999 // static
   2000 void QuicFramer::set_version(const QuicVersion version) {
   2001   DCHECK(IsSupportedVersion(version)) << QuicVersionToString(version);
   2002   quic_version_ = version;
   2003 }
   2004 
   2005 bool QuicFramer::AppendAckFrameAndTypeByte(
   2006     const QuicPacketHeader& header,
   2007     const QuicAckFrame& frame,
   2008     QuicDataWriter* writer) {
   2009   AckFrameInfo ack_info = GetAckFrameInfo(frame);
   2010   QuicPacketSequenceNumber ack_largest_observed =
   2011       frame.received_info.largest_observed;
   2012   QuicSequenceNumberLength largest_observed_length =
   2013       GetMinSequenceNumberLength(ack_largest_observed);
   2014   QuicSequenceNumberLength missing_sequence_number_length =
   2015       GetMinSequenceNumberLength(ack_info.max_delta);
   2016   // Determine whether we need to truncate ranges.
   2017   size_t available_range_bytes = writer->capacity() - writer->length() -
   2018       kNumberOfRevivedPacketsSize - kNumberOfNackRangesSize -
   2019       GetMinAckFrameSize(quic_version_,
   2020                          header.public_header.sequence_number_length,
   2021                          largest_observed_length);
   2022   size_t max_num_ranges = available_range_bytes /
   2023       (missing_sequence_number_length + PACKET_1BYTE_SEQUENCE_NUMBER);
   2024   max_num_ranges = min(kMaxNackRanges, max_num_ranges);
   2025   bool truncated = ack_info.nack_ranges.size() > max_num_ranges;
   2026   DVLOG_IF(1, truncated) << "Truncating ack from "
   2027                          << ack_info.nack_ranges.size() << " ranges to "
   2028                          << max_num_ranges;
   2029   // Write out the type byte by setting the low order bits and doing shifts
   2030   // to make room for the next bit flags to be set.
   2031   // Whether there are any nacks.
   2032   uint8 type_byte = ack_info.nack_ranges.empty() ? 0 : kQuicHasNacksMask;
   2033 
   2034   // truncating bit.
   2035   type_byte <<= kQuicAckTruncatedShift;
   2036   type_byte |= truncated ? kQuicAckTruncatedMask : 0;
   2037 
   2038   // Largest observed sequence number length.
   2039   type_byte <<= kQuicSequenceNumberLengthShift;
   2040   type_byte |= GetSequenceNumberFlags(largest_observed_length);
   2041 
   2042   // Missing sequence number length.
   2043   type_byte <<= kQuicSequenceNumberLengthShift;
   2044   type_byte |= GetSequenceNumberFlags(missing_sequence_number_length);
   2045 
   2046   type_byte |= kQuicFrameTypeAckMask;
   2047 
   2048   if (!writer->WriteUInt8(type_byte)) {
   2049     return false;
   2050   }
   2051 
   2052   if (quic_version_ <= QUIC_VERSION_15) {
   2053     if (!AppendStopWaitingFrame(header, frame.sent_info, writer)) {
   2054       return false;
   2055     }
   2056   }
   2057 
   2058   const ReceivedPacketInfo& received_info = frame.received_info;
   2059   QuicPacketEntropyHash ack_entropy_hash = received_info.entropy_hash;
   2060   NackRangeMap::reverse_iterator ack_iter = ack_info.nack_ranges.rbegin();
   2061   if (truncated) {
   2062     // Skip the nack ranges which the truncated ack won't include and set
   2063     // a correct largest observed for the truncated ack.
   2064     for (size_t i = 1; i < (ack_info.nack_ranges.size() - max_num_ranges);
   2065          ++i) {
   2066       ++ack_iter;
   2067     }
   2068     // If the last range is followed by acks, include them.
   2069     // If the last range is followed by another range, specify the end of the
   2070     // range as the largest_observed.
   2071     ack_largest_observed = ack_iter->first - 1;
   2072     // Also update the entropy so it matches the largest observed.
   2073     ack_entropy_hash = entropy_calculator_->EntropyHash(ack_largest_observed);
   2074     ++ack_iter;
   2075   }
   2076 
   2077   if (!writer->WriteUInt8(ack_entropy_hash)) {
   2078     return false;
   2079   }
   2080 
   2081   if (!AppendPacketSequenceNumber(largest_observed_length,
   2082                                   ack_largest_observed, writer)) {
   2083     return false;
   2084   }
   2085 
   2086   uint64 delta_time_largest_observed_us = kUFloat16MaxValue;
   2087   if (!received_info.delta_time_largest_observed.IsInfinite()) {
   2088     DCHECK_LE(0u,
   2089               frame.received_info.delta_time_largest_observed.ToMicroseconds());
   2090     delta_time_largest_observed_us =
   2091         received_info.delta_time_largest_observed.ToMicroseconds();
   2092   }
   2093 
   2094   if (!writer->WriteUFloat16(delta_time_largest_observed_us)) {
   2095     return false;
   2096   }
   2097 
   2098   if (ack_info.nack_ranges.empty()) {
   2099     return true;
   2100   }
   2101 
   2102   const uint8 num_missing_ranges =
   2103       min(ack_info.nack_ranges.size(), max_num_ranges);
   2104   if (!writer->WriteBytes(&num_missing_ranges, 1)) {
   2105     return false;
   2106   }
   2107 
   2108   int num_ranges_written = 0;
   2109   QuicPacketSequenceNumber last_sequence_written = ack_largest_observed;
   2110   for (; ack_iter != ack_info.nack_ranges.rend(); ++ack_iter) {
   2111     // Calculate the delta to the last number in the range.
   2112     QuicPacketSequenceNumber missing_delta =
   2113         last_sequence_written - (ack_iter->first + ack_iter->second);
   2114     if (!AppendPacketSequenceNumber(missing_sequence_number_length,
   2115                                     missing_delta, writer)) {
   2116       return false;
   2117     }
   2118     if (!AppendPacketSequenceNumber(PACKET_1BYTE_SEQUENCE_NUMBER,
   2119                                     ack_iter->second, writer)) {
   2120       return false;
   2121     }
   2122     // Subtract 1 so a missing_delta of 0 means an adjacent range.
   2123     last_sequence_written = ack_iter->first - 1;
   2124     ++num_ranges_written;
   2125   }
   2126   DCHECK_EQ(num_missing_ranges, num_ranges_written);
   2127 
   2128   // Append revived packets.
   2129   // If not all the revived packets fit, only mention the ones that do.
   2130   uint8 num_revived_packets = min(received_info.revived_packets.size(),
   2131                                   kMaxRevivedPackets);
   2132   num_revived_packets = min(
   2133       static_cast<size_t>(num_revived_packets),
   2134       (writer->capacity() - writer->length()) / largest_observed_length);
   2135   if (!writer->WriteBytes(&num_revived_packets, 1)) {
   2136     return false;
   2137   }
   2138 
   2139   SequenceNumberSet::const_iterator iter =
   2140       received_info.revived_packets.begin();
   2141   for (int i = 0; i < num_revived_packets; ++i, ++iter) {
   2142     LOG_IF(DFATAL, !ContainsKey(received_info.missing_packets, *iter));
   2143     if (!AppendPacketSequenceNumber(largest_observed_length,
   2144                                     *iter, writer)) {
   2145       return false;
   2146     }
   2147   }
   2148 
   2149   return true;
   2150 }
   2151 
   2152 bool QuicFramer::AppendCongestionFeedbackFrame(
   2153     const QuicCongestionFeedbackFrame& frame,
   2154     QuicDataWriter* writer) {
   2155   if (!writer->WriteBytes(&frame.type, 1)) {
   2156     return false;
   2157   }
   2158 
   2159   switch (frame.type) {
   2160     case kInterArrival: {
   2161       const CongestionFeedbackMessageInterArrival& inter_arrival =
   2162           frame.inter_arrival;
   2163       DCHECK_GE(numeric_limits<uint8>::max(),
   2164                 inter_arrival.received_packet_times.size());
   2165       if (inter_arrival.received_packet_times.size() >
   2166           numeric_limits<uint8>::max()) {
   2167         return false;
   2168       }
   2169       // TODO(ianswett): Make num_received_packets a varint.
   2170       uint8 num_received_packets =
   2171           inter_arrival.received_packet_times.size();
   2172       if (!writer->WriteBytes(&num_received_packets, 1)) {
   2173         return false;
   2174       }
   2175       if (num_received_packets > 0) {
   2176         TimeMap::const_iterator it =
   2177             inter_arrival.received_packet_times.begin();
   2178 
   2179         QuicPacketSequenceNumber lowest_sequence = it->first;
   2180         if (!AppendPacketSequenceNumber(PACKET_6BYTE_SEQUENCE_NUMBER,
   2181                                         lowest_sequence, writer)) {
   2182           return false;
   2183         }
   2184 
   2185         QuicTime lowest_time = it->second;
   2186         if (!writer->WriteUInt64(
   2187                 lowest_time.Subtract(creation_time_).ToMicroseconds())) {
   2188           return false;
   2189         }
   2190 
   2191         for (++it; it != inter_arrival.received_packet_times.end(); ++it) {
   2192           QuicPacketSequenceNumber sequence_delta = it->first - lowest_sequence;
   2193           DCHECK_GE(numeric_limits<uint16>::max(), sequence_delta);
   2194           if (sequence_delta > numeric_limits<uint16>::max()) {
   2195             return false;
   2196           }
   2197           if (!writer->WriteUInt16(static_cast<uint16>(sequence_delta))) {
   2198             return false;
   2199           }
   2200 
   2201           int32 time_delta_us =
   2202               it->second.Subtract(lowest_time).ToMicroseconds();
   2203           if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) {
   2204             return false;
   2205           }
   2206         }
   2207       }
   2208       break;
   2209     }
   2210     case kFixRate: {
   2211       const CongestionFeedbackMessageFixRate& fix_rate =
   2212           frame.fix_rate;
   2213       if (!writer->WriteUInt32(fix_rate.bitrate.ToBytesPerSecond())) {
   2214         return false;
   2215       }
   2216       break;
   2217     }
   2218     case kTCP: {
   2219       const CongestionFeedbackMessageTCP& tcp = frame.tcp;
   2220       DCHECK_LE(tcp.receive_window, 1u << 20);
   2221       // Simple bit packing, don't send the 4 least significant bits.
   2222       uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4);
   2223       if (!writer->WriteUInt16(receive_window)) {
   2224         return false;
   2225       }
   2226       break;
   2227     }
   2228     default:
   2229       return false;
   2230   }
   2231 
   2232   return true;
   2233 }
   2234 
   2235 bool QuicFramer::AppendStopWaitingFrame(
   2236     const QuicPacketHeader& header,
   2237     const QuicStopWaitingFrame& frame,
   2238     QuicDataWriter* writer) {
   2239   DCHECK_GE(header.packet_sequence_number, frame.least_unacked);
   2240   const QuicPacketSequenceNumber least_unacked_delta =
   2241       header.packet_sequence_number - frame.least_unacked;
   2242   const QuicPacketSequenceNumber length_shift =
   2243       header.public_header.sequence_number_length * 8;
   2244   if (!writer->WriteUInt8(frame.entropy_hash)) {
   2245     LOG(DFATAL) << " hash failed";
   2246     return false;
   2247   }
   2248 
   2249   if (least_unacked_delta >> length_shift > 0) {
   2250     LOG(DFATAL) << "sequence_number_length "
   2251                 << header.public_header.sequence_number_length
   2252                 << " is too small for least_unacked_delta: "
   2253                 << least_unacked_delta;
   2254     return false;
   2255   }
   2256   if (!AppendPacketSequenceNumber(header.public_header.sequence_number_length,
   2257                                   least_unacked_delta, writer)) {
   2258     LOG(DFATAL) << " seq failed: "
   2259                 << header.public_header.sequence_number_length;
   2260     return false;
   2261   }
   2262 
   2263   return true;
   2264 }
   2265 
   2266 bool QuicFramer::AppendRstStreamFrame(
   2267         const QuicRstStreamFrame& frame,
   2268         QuicDataWriter* writer) {
   2269   if (!writer->WriteUInt32(frame.stream_id)) {
   2270     return false;
   2271   }
   2272 
   2273   if (!writer->WriteUInt64(frame.byte_offset)) {
   2274     return false;
   2275   }
   2276 
   2277   uint32 error_code = static_cast<uint32>(frame.error_code);
   2278   if (!writer->WriteUInt32(error_code)) {
   2279     return false;
   2280   }
   2281 
   2282   if (!writer->WriteStringPiece16(frame.error_details)) {
   2283     return false;
   2284   }
   2285   return true;
   2286 }
   2287 
   2288 bool QuicFramer::AppendConnectionCloseFrame(
   2289     const QuicConnectionCloseFrame& frame,
   2290     QuicDataWriter* writer) {
   2291   uint32 error_code = static_cast<uint32>(frame.error_code);
   2292   if (!writer->WriteUInt32(error_code)) {
   2293     return false;
   2294   }
   2295   if (!writer->WriteStringPiece16(frame.error_details)) {
   2296     return false;
   2297   }
   2298   return true;
   2299 }
   2300 
   2301 bool QuicFramer::AppendGoAwayFrame(const QuicGoAwayFrame& frame,
   2302                                    QuicDataWriter* writer) {
   2303   uint32 error_code = static_cast<uint32>(frame.error_code);
   2304   if (!writer->WriteUInt32(error_code)) {
   2305     return false;
   2306   }
   2307   uint32 stream_id = static_cast<uint32>(frame.last_good_stream_id);
   2308   if (!writer->WriteUInt32(stream_id)) {
   2309     return false;
   2310   }
   2311   if (!writer->WriteStringPiece16(frame.reason_phrase)) {
   2312     return false;
   2313   }
   2314   return true;
   2315 }
   2316 
   2317 bool QuicFramer::AppendWindowUpdateFrame(const QuicWindowUpdateFrame& frame,
   2318                                          QuicDataWriter* writer) {
   2319   uint32 stream_id = static_cast<uint32>(frame.stream_id);
   2320   if (!writer->WriteUInt32(stream_id)) {
   2321     return false;
   2322   }
   2323   if (!writer->WriteUInt64(frame.byte_offset)) {
   2324     return false;
   2325   }
   2326   return true;
   2327 }
   2328 
   2329 bool QuicFramer::AppendBlockedFrame(const QuicBlockedFrame& frame,
   2330                                     QuicDataWriter* writer) {
   2331   uint32 stream_id = static_cast<uint32>(frame.stream_id);
   2332   if (!writer->WriteUInt32(stream_id)) {
   2333     return false;
   2334   }
   2335   return true;
   2336 }
   2337 
   2338 bool QuicFramer::RaiseError(QuicErrorCode error) {
   2339   DVLOG(1) << "Error detail: " << detailed_error_;
   2340   set_error(error);
   2341   visitor_->OnError(this);
   2342   reader_.reset(NULL);
   2343   return false;
   2344 }
   2345 
   2346 }  // namespace net
   2347