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