quic_framer.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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/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#include "net/quic/quic_utils.h"
13
14using base::StringPiece;
15using std::make_pair;
16using std::map;
17using std::numeric_limits;
18using std::string;
19
20namespace net {
21
22namespace {
23
24// Mask to select the lowest 48 bits of a sequence number.
25const QuicPacketSequenceNumber kSequenceNumberMask =
26    GG_UINT64_C(0x0000FFFFFFFFFFFF);
27
28const uint32 kInvalidDeltaTime = 0xffffffff;
29
30// Returns the absolute value of the difference between |a| and |b|.
31QuicPacketSequenceNumber Delta(QuicPacketSequenceNumber a,
32                               QuicPacketSequenceNumber b) {
33  // Since these are unsigned numbers, we can't just return abs(a - b)
34  if (a < b) {
35    return b - a;
36  }
37  return a - b;
38}
39
40QuicPacketSequenceNumber ClosestTo(QuicPacketSequenceNumber target,
41                                   QuicPacketSequenceNumber a,
42                                   QuicPacketSequenceNumber b) {
43  return (Delta(target, a) < Delta(target, b)) ? a : b;
44}
45
46}  // namespace
47
48QuicFramer::QuicFramer(QuicVersionTag version,
49                       QuicTime creation_time,
50                       bool is_server)
51    : visitor_(NULL),
52      fec_builder_(NULL),
53      error_(QUIC_NO_ERROR),
54      last_sequence_number_(0),
55      quic_version_(version),
56      decrypter_(QuicDecrypter::Create(kNULL)),
57      is_server_(is_server),
58      creation_time_(creation_time) {
59  DCHECK(IsSupportedVersion(version));
60  encrypter_[ENCRYPTION_NONE].reset(QuicEncrypter::Create(kNULL));
61}
62
63QuicFramer::~QuicFramer() {}
64
65bool CanTruncate(const QuicFrame& frame) {
66  if (frame.type == ACK_FRAME ||
67      frame.type == CONNECTION_CLOSE_FRAME) {
68    return true;
69  }
70  return false;
71}
72
73// static
74size_t QuicFramer::GetMinStreamFrameSize() {
75  return kQuicFrameTypeSize + kQuicStreamIdSize +
76      kQuicStreamFinSize + kQuicStreamOffsetSize + kQuicStreamPayloadLengthSize;
77}
78
79// static
80size_t QuicFramer::GetMinAckFrameSize() {
81  return kQuicFrameTypeSize + kQuicEntropyHashSize + kSequenceNumberSize +
82      kQuicEntropyHashSize + kSequenceNumberSize +
83      kQuicDeltaTimeLargestObservedSize + kNumberOfMissingPacketsSize;
84}
85
86// static
87size_t QuicFramer::GetMinRstStreamFrameSize() {
88  return kQuicFrameTypeSize + kQuicStreamIdSize + kQuicErrorCodeSize +
89      kQuicErrorDetailsLengthSize;
90}
91
92// static
93size_t QuicFramer::GetMinConnectionCloseFrameSize() {
94  return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize +
95      GetMinAckFrameSize();
96}
97
98// static
99size_t QuicFramer::GetMinGoAwayFrameSize() {
100  return kQuicFrameTypeSize + kQuicErrorCodeSize + kQuicErrorDetailsLengthSize +
101      kQuicStreamIdSize;
102}
103
104bool QuicFramer::IsSupportedVersion(QuicVersionTag version) {
105  return version == kQuicVersion1;
106}
107
108size_t QuicFramer::GetVersionNegotiationPacketSize(size_t number_versions) {
109  return kQuicGuidSize + kPublicFlagsSize +
110      number_versions * kQuicVersionSize;
111}
112
113size_t QuicFramer::GetSerializedFrameLength(
114    const QuicFrame& frame, size_t free_bytes, bool first_frame) {
115  if (frame.type == PADDING_FRAME) {
116    // PADDING implies end of packet.
117    return free_bytes;
118  }
119  size_t frame_len = ComputeFrameLength(frame);
120  if (frame_len > free_bytes) {
121    // Only truncate the first frame in a packet, so if subsequent ones go
122    // over, stop including more frames.
123    if (!first_frame) {
124      return 0;
125    }
126    if (CanTruncate(frame)) {
127      // Truncate the frame so the packet will not exceed kMaxPacketSize.
128      // Note that we may not use every byte of the writer in this case.
129      if (free_bytes >= GetMinAckFrameSize()) {
130        DLOG(INFO) << "Truncating large frame";
131        return free_bytes;
132      }
133      return 0;
134    }
135  }
136  return frame_len;
137}
138
139QuicPacketEntropyHash QuicFramer::GetPacketEntropyHash(
140    const QuicPacketHeader& header) const {
141  if (!header.entropy_flag) {
142    // TODO(satyamshekhar): Return some more better value here (something that
143    // is not a constant).
144    return 0;
145  }
146  return 1 << (header.packet_sequence_number % 8);
147}
148
149SerializedPacket QuicFramer::ConstructFrameDataPacket(
150    const QuicPacketHeader& header,
151    const QuicFrames& frames) {
152  const size_t max_plaintext_size = GetMaxPlaintextSize(kMaxPacketSize);
153  size_t packet_size = GetPacketHeaderSize(header.public_header.version_flag);
154  for (size_t i = 0; i < frames.size(); ++i) {
155    DCHECK_LE(packet_size, max_plaintext_size);
156    const size_t frame_size = GetSerializedFrameLength(
157        frames[i], max_plaintext_size - packet_size, i == 0);
158    DCHECK(frame_size);
159    packet_size += frame_size;
160  }
161  return ConstructFrameDataPacket(header, frames, packet_size);
162}
163
164SerializedPacket QuicFramer::ConstructFrameDataPacket(
165    const QuicPacketHeader& header,
166    const QuicFrames& frames,
167    size_t packet_size) {
168  QuicDataWriter writer(packet_size);
169  SerializedPacket kNoPacket = SerializedPacket(0, NULL, 0, NULL);
170  if (!WritePacketHeader(header, &writer)) {
171    return kNoPacket;
172  }
173
174  for (size_t i = 0; i < frames.size(); ++i) {
175    const QuicFrame& frame = frames[i];
176    if (!writer.WriteUInt8(frame.type)) {
177      return kNoPacket;
178    }
179
180    switch (frame.type) {
181      case PADDING_FRAME:
182        writer.WritePadding();
183        break;
184      case STREAM_FRAME:
185        if (!AppendStreamFramePayload(*frame.stream_frame, &writer)) {
186          return kNoPacket;
187        }
188        break;
189      case ACK_FRAME:
190        if (!AppendAckFramePayload(*frame.ack_frame, &writer)) {
191          return kNoPacket;
192        }
193        break;
194      case CONGESTION_FEEDBACK_FRAME:
195        if (!AppendQuicCongestionFeedbackFramePayload(
196                *frame.congestion_feedback_frame, &writer)) {
197          return kNoPacket;
198        }
199        break;
200      case RST_STREAM_FRAME:
201        if (!AppendRstStreamFramePayload(*frame.rst_stream_frame, &writer)) {
202          return kNoPacket;
203        }
204        break;
205      case CONNECTION_CLOSE_FRAME:
206        if (!AppendConnectionCloseFramePayload(
207                *frame.connection_close_frame, &writer)) {
208          return kNoPacket;
209        }
210        break;
211      case GOAWAY_FRAME:
212        if (!AppendGoAwayFramePayload(*frame.goaway_frame, &writer)) {
213          return kNoPacket;
214        }
215        break;
216      default:
217        RaiseError(QUIC_INVALID_FRAME_DATA);
218        return kNoPacket;
219    }
220  }
221
222  // Save the length before writing, because take clears it.
223  const size_t len = writer.length();
224  // Less than or equal because truncated acks end up with max_plaintex_size
225  // length, even though they're typically slightly shorter.
226  DCHECK_LE(len, packet_size);
227  QuicPacket* packet = QuicPacket::NewDataPacket(
228      writer.take(), len, true, header.public_header.version_flag);
229
230  if (fec_builder_) {
231    fec_builder_->OnBuiltFecProtectedPayload(header,
232                                             packet->FecProtectedData());
233  }
234
235  return SerializedPacket(header.packet_sequence_number, packet,
236                          GetPacketEntropyHash(header), NULL);
237}
238
239SerializedPacket QuicFramer::ConstructFecPacket(const QuicPacketHeader& header,
240                                                const QuicFecData& fec) {
241  size_t len = GetPacketHeaderSize(header.public_header.version_flag);
242  len += fec.redundancy.length();
243
244  QuicDataWriter writer(len);
245  SerializedPacket kNoPacket = SerializedPacket(0, NULL, 0, NULL);
246  if (!WritePacketHeader(header, &writer)) {
247    return kNoPacket;
248  }
249
250  if (!writer.WriteBytes(fec.redundancy.data(), fec.redundancy.length())) {
251    return kNoPacket;
252  }
253
254  return SerializedPacket(header.packet_sequence_number,
255                          QuicPacket::NewFecPacket(
256                              writer.take(), len, true,
257                              header.public_header.version_flag),
258                          GetPacketEntropyHash(header), NULL);
259}
260
261// static
262QuicEncryptedPacket* QuicFramer::ConstructPublicResetPacket(
263    const QuicPublicResetPacket& packet) {
264  DCHECK(packet.public_header.reset_flag);
265  size_t len = GetPublicResetPacketSize();
266  QuicDataWriter writer(len);
267
268  if (!writer.WriteUInt64(packet.public_header.guid)) {
269    return NULL;
270  }
271
272  uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_RST);
273  if (!writer.WriteUInt8(flags)) {
274    return NULL;
275  }
276
277  if (!writer.WriteUInt64(packet.nonce_proof)) {
278    return NULL;
279  }
280
281  if (!AppendPacketSequenceNumber(packet.rejected_sequence_number,
282                                  &writer)) {
283    return NULL;
284  }
285
286  return new QuicEncryptedPacket(writer.take(), len, true);
287}
288
289QuicEncryptedPacket* QuicFramer::ConstructVersionNegotiationPacket(
290    const QuicPacketPublicHeader& header,
291    const QuicVersionTagList& supported_versions) {
292  DCHECK(header.version_flag);
293  size_t len = GetVersionNegotiationPacketSize(supported_versions.size());
294  QuicDataWriter writer(len);
295
296  if (!writer.WriteUInt64(header.guid)) {
297    return NULL;
298  }
299
300  uint8 flags = static_cast<uint8>(PACKET_PUBLIC_FLAGS_VERSION);
301  if (!writer.WriteUInt8(flags)) {
302    return NULL;
303  }
304
305  for (size_t i = 0; i < supported_versions.size(); ++i) {
306    if (!writer.WriteUInt32(supported_versions[i])) {
307      return NULL;
308    }
309  }
310
311  return new QuicEncryptedPacket(writer.take(), len, true);
312}
313
314bool QuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
315  DCHECK(!reader_.get());
316  reader_.reset(new QuicDataReader(packet.data(), packet.length()));
317
318  visitor_->OnPacket();
319
320  // First parse the public header.
321  QuicPacketPublicHeader public_header;
322  if (!ProcessPublicHeader(&public_header)) {
323    DLOG(WARNING) << "Unable to process public header.";
324    return RaiseError(QUIC_INVALID_PACKET_HEADER);
325  }
326
327  if (is_server_ && public_header.version_flag &&
328      public_header.versions[0] != quic_version_) {
329    if (!visitor_->OnProtocolVersionMismatch(public_header.versions[0])) {
330      reader_.reset(NULL);
331      return true;
332    }
333  }
334
335  bool rv;
336  if (!is_server_ && public_header.version_flag) {
337    rv = ProcessVersionNegotiationPacket(&public_header);
338  } else if (public_header.reset_flag) {
339    rv = ProcessPublicResetPacket(public_header);
340  } else {
341    rv = ProcessDataPacket(public_header, packet);
342  }
343
344  reader_.reset(NULL);
345  return rv;
346}
347
348bool QuicFramer::ProcessVersionNegotiationPacket(
349    QuicPacketPublicHeader* public_header) {
350  DCHECK(!is_server_);
351  // Try reading at least once to raise error if the packet is invalid.
352  do {
353    QuicVersionTag version;
354    if (!reader_->ReadBytes(&version, kQuicVersionSize)) {
355      set_detailed_error("Unable to read supported version in negotiation.");
356      return RaiseError(QUIC_INVALID_VERSION_NEGOTIATION_PACKET);
357    }
358    public_header->versions.push_back(version);
359  } while (!reader_->IsDoneReading());
360
361  visitor_->OnVersionNegotiationPacket(*public_header);
362  return true;
363}
364
365bool QuicFramer::ProcessDataPacket(
366    const QuicPacketPublicHeader& public_header,
367    const QuicEncryptedPacket& packet) {
368  QuicPacketHeader header(public_header);
369  if (!ProcessPacketHeader(&header, packet)) {
370    DCHECK_NE(QUIC_NO_ERROR, error_);  // ProcessPacketHeader sets the error.
371    DLOG(WARNING) << "Unable to process data packet header.";
372    return false;
373  }
374
375  if (!visitor_->OnPacketHeader(header)) {
376    // The visitor suppresses further processing of the packet.
377    return true;
378  }
379
380  if (packet.length() > kMaxPacketSize) {
381    DLOG(WARNING) << "Packet too large: " << packet.length();
382    return RaiseError(QUIC_PACKET_TOO_LARGE);
383  }
384
385  // Handle the payload.
386  if (!header.fec_flag) {
387    if (header.fec_group != 0) {
388      StringPiece payload = reader_->PeekRemainingPayload();
389      visitor_->OnFecProtectedPayload(payload);
390    }
391    if (!ProcessFrameData()) {
392      DCHECK_NE(QUIC_NO_ERROR, error_);  // ProcessFrameData sets the error.
393      DLOG(WARNING) << "Unable to process frame data.";
394      return false;
395    }
396  } else {
397    QuicFecData fec_data;
398    fec_data.fec_group = header.fec_group;
399    fec_data.redundancy = reader_->ReadRemainingPayload();
400    visitor_->OnFecData(fec_data);
401  }
402
403  visitor_->OnPacketComplete();
404  return true;
405}
406
407bool QuicFramer::ProcessPublicResetPacket(
408    const QuicPacketPublicHeader& public_header) {
409  QuicPublicResetPacket packet(public_header);
410  if (!reader_->ReadUInt64(&packet.nonce_proof)) {
411    // TODO(satyamshekhar): Raise error.
412    set_detailed_error("Unable to read nonce proof.");
413    return false;
414  }
415  // TODO(satyamshekhar): validate nonce to protect against DoS.
416
417  if (!reader_->ReadUInt48(&packet.rejected_sequence_number)) {
418    set_detailed_error("Unable to read rejected sequence number.");
419    return false;
420  }
421  visitor_->OnPublicResetPacket(packet);
422  return true;
423}
424
425bool QuicFramer::ProcessRevivedPacket(QuicPacketHeader* header,
426                                      StringPiece payload) {
427  DCHECK(!reader_.get());
428
429  visitor_->OnRevivedPacket();
430
431  header->entropy_hash = GetPacketEntropyHash(*header);
432
433  // TODO(satyamshekhar): Don't process if the visitor refuses the header.
434  visitor_->OnPacketHeader(*header);
435
436  if (payload.length() > kMaxPacketSize) {
437    set_detailed_error("Revived packet too large.");
438    return RaiseError(QUIC_PACKET_TOO_LARGE);
439  }
440
441  reader_.reset(new QuicDataReader(payload.data(), payload.length()));
442  if (!ProcessFrameData()) {
443    DCHECK_NE(QUIC_NO_ERROR, error_);  // ProcessFrameData sets the error.
444    DLOG(WARNING) << "Unable to process frame data.";
445    return false;
446  }
447
448  visitor_->OnPacketComplete();
449  reader_.reset(NULL);
450  return true;
451}
452
453bool QuicFramer::WritePacketHeader(const QuicPacketHeader& header,
454                                   QuicDataWriter* writer) {
455  if (!writer->WriteUInt64(header.public_header.guid)) {
456    return false;
457  }
458
459  uint8 flags = 0;
460  if (header.public_header.reset_flag) {
461    flags |= PACKET_PUBLIC_FLAGS_RST;
462  }
463  if (header.public_header.version_flag) {
464    flags |= PACKET_PUBLIC_FLAGS_VERSION;
465  }
466  if (!writer->WriteUInt8(flags)) {
467    return false;
468  }
469
470  if (header.public_header.version_flag) {
471    DCHECK(!is_server_);
472    writer->WriteUInt32(quic_version_);
473  }
474
475  if (!AppendPacketSequenceNumber(header.packet_sequence_number, writer)) {
476    return false;
477  }
478
479  flags = 0;
480  if (header.fec_flag) {
481    flags |= PACKET_PRIVATE_FLAGS_FEC;
482  }
483  if (header.entropy_flag) {
484    flags |= PACKET_PRIVATE_FLAGS_ENTROPY;
485  }
486  if (header.fec_entropy_flag) {
487    flags |= PACKET_PRIVATE_FLAGS_FEC_ENTROPY;
488  }
489  if (!writer->WriteUInt8(flags)) {
490    return false;
491  }
492
493  // Offset from the current packet sequence number to the first fec
494  // protected packet, or kNoFecOffset to signal no FEC protection.
495  uint8 first_fec_protected_packet_offset = kNoFecOffset;
496
497  // The FEC group number is the sequence number of the first fec
498  // protected packet, or 0 if this packet is not protected.
499  if (header.fec_group != 0) {
500    DCHECK_GE(header.packet_sequence_number, header.fec_group);
501    DCHECK_GT(255u, header.packet_sequence_number - header.fec_group);
502    first_fec_protected_packet_offset =
503        header.packet_sequence_number - header.fec_group;
504  }
505  if (!writer->WriteBytes(&first_fec_protected_packet_offset, 1)) {
506    return false;
507  }
508
509  return true;
510}
511
512QuicPacketSequenceNumber QuicFramer::CalculatePacketSequenceNumberFromWire(
513    QuicPacketSequenceNumber packet_sequence_number) const {
514  // The new sequence number might have wrapped to the next epoch, or
515  // it might have reverse wrapped to the previous epoch, or it might
516  // remain in the same epoch.  Select the sequence number closest to the
517  // previous sequence number.
518  QuicPacketSequenceNumber epoch = last_sequence_number_ & ~kSequenceNumberMask;
519  QuicPacketSequenceNumber prev_epoch = epoch - (GG_UINT64_C(1) << 48);
520  QuicPacketSequenceNumber next_epoch = epoch + (GG_UINT64_C(1) << 48);
521
522  return ClosestTo(last_sequence_number_,
523                   epoch + packet_sequence_number,
524                   ClosestTo(last_sequence_number_,
525                             prev_epoch + packet_sequence_number,
526                             next_epoch + packet_sequence_number));
527}
528
529bool QuicFramer::ProcessPublicHeader(QuicPacketPublicHeader* public_header) {
530  if (!reader_->ReadUInt64(&public_header->guid)) {
531    set_detailed_error("Unable to read GUID.");
532    return false;
533  }
534
535  uint8 public_flags;
536  if (!reader_->ReadBytes(&public_flags, 1)) {
537    set_detailed_error("Unable to read public flags.");
538    return false;
539  }
540
541  if (public_flags > PACKET_PUBLIC_FLAGS_MAX) {
542    set_detailed_error("Illegal public flags value.");
543    return false;
544  }
545
546  public_header->reset_flag = (public_flags & PACKET_PUBLIC_FLAGS_RST) != 0;
547  public_header->version_flag =
548      (public_flags & PACKET_PUBLIC_FLAGS_VERSION) != 0;
549
550  if (public_header->reset_flag && public_header->version_flag) {
551    set_detailed_error("Got version flag in reset packet");
552    return false;
553  }
554
555  if (public_header->version_flag && is_server_) {
556    QuicVersionTag version;
557    if (!reader_->ReadUInt32(&version)) {
558      // Read the version only if the packet is from the client.
559      // version flag from the server means version negotiation packet.
560      set_detailed_error("Unable to read protocol version.");
561      return false;
562    }
563    public_header->versions.push_back(version);
564  }
565  return true;
566}
567
568// static
569bool QuicFramer::ReadGuidFromPacket(const QuicEncryptedPacket& packet,
570                                    QuicGuid* guid) {
571  QuicDataReader reader(packet.data(), packet.length());
572  return reader.ReadUInt64(guid);
573}
574
575bool QuicFramer::ProcessPacketHeader(
576    QuicPacketHeader* header,
577    const QuicEncryptedPacket& packet) {
578  if (!ProcessPacketSequenceNumber(&header->packet_sequence_number)) {
579    set_detailed_error("Unable to read sequence number.");
580    return RaiseError(QUIC_INVALID_PACKET_HEADER);
581  }
582
583  if (header->packet_sequence_number == 0u) {
584    set_detailed_error("Packet sequence numbers cannot be 0.");
585    return RaiseError(QUIC_INVALID_PACKET_HEADER);
586  }
587
588  if (!DecryptPayload(header->packet_sequence_number,
589                      header->public_header.version_flag,
590                      packet)) {
591    set_detailed_error("Unable to decrypt payload.");
592    return RaiseError(QUIC_DECRYPTION_FAILURE);
593  }
594
595  uint8 private_flags;
596  if (!reader_->ReadBytes(&private_flags, 1)) {
597    set_detailed_error("Unable to read private flags.");
598    return RaiseError(QUIC_INVALID_PACKET_HEADER);
599  }
600
601  if (private_flags > PACKET_PRIVATE_FLAGS_MAX) {
602    set_detailed_error("Illegal private flags value.");
603    return RaiseError(QUIC_INVALID_PACKET_HEADER);
604  }
605
606  header->fec_flag = (private_flags & PACKET_PRIVATE_FLAGS_FEC) != 0;
607  header->entropy_flag = (private_flags & PACKET_PRIVATE_FLAGS_ENTROPY) != 0;
608  header->fec_entropy_flag =
609      (private_flags & PACKET_PRIVATE_FLAGS_FEC_ENTROPY) != 0;
610
611  uint8 first_fec_protected_packet_offset;
612  if (!reader_->ReadBytes(&first_fec_protected_packet_offset, 1)) {
613    set_detailed_error("Unable to read first fec protected packet offset.");
614    return RaiseError(QUIC_INVALID_PACKET_HEADER);
615  }
616  header->fec_group = first_fec_protected_packet_offset == kNoFecOffset ? 0 :
617      header->packet_sequence_number - first_fec_protected_packet_offset;
618
619  header->entropy_hash = GetPacketEntropyHash(*header);
620  // Set the last sequence number after we have decrypted the packet
621  // so we are confident is not attacker controlled.
622  last_sequence_number_ = header->packet_sequence_number;
623  return true;
624}
625
626bool QuicFramer::ProcessPacketSequenceNumber(
627    QuicPacketSequenceNumber* sequence_number) {
628  QuicPacketSequenceNumber wire_sequence_number;
629  if (!reader_->ReadUInt48(&wire_sequence_number)) {
630    return false;
631  }
632
633  *sequence_number =
634      CalculatePacketSequenceNumberFromWire(wire_sequence_number);
635  return true;
636}
637
638bool QuicFramer::ProcessFrameData() {
639  if (reader_->IsDoneReading()) {
640    set_detailed_error("Unable to read frame type.");
641    return RaiseError(QUIC_INVALID_FRAME_DATA);
642  }
643  while (!reader_->IsDoneReading()) {
644    uint8 frame_type;
645    if (!reader_->ReadBytes(&frame_type, 1)) {
646      set_detailed_error("Unable to read frame type.");
647      return RaiseError(QUIC_INVALID_FRAME_DATA);
648    }
649    switch (frame_type) {
650      case PADDING_FRAME:
651        // We're done with the packet
652        return true;
653      case STREAM_FRAME: {
654        QuicStreamFrame frame;
655        if (!ProcessStreamFrame(&frame)) {
656          return RaiseError(QUIC_INVALID_FRAME_DATA);
657        }
658        if (!visitor_->OnStreamFrame(frame)) {
659          DLOG(INFO) << "Visitor asked to stopped further processing.";
660          // Returning true since there was no parsing error.
661          return true;
662        }
663        break;
664      }
665      case ACK_FRAME: {
666        QuicAckFrame frame;
667        if (!ProcessAckFrame(&frame)) {
668          return RaiseError(QUIC_INVALID_FRAME_DATA);
669        }
670        if (!visitor_->OnAckFrame(frame)) {
671          DLOG(INFO) << "Visitor asked to stopped further processing.";
672          // Returning true since there was no parsing error.
673          return true;
674        }
675        break;
676      }
677      case CONGESTION_FEEDBACK_FRAME: {
678        QuicCongestionFeedbackFrame frame;
679        if (!ProcessQuicCongestionFeedbackFrame(&frame)) {
680          return RaiseError(QUIC_INVALID_FRAME_DATA);
681        }
682        if (!visitor_->OnCongestionFeedbackFrame(frame)) {
683          DLOG(INFO) << "Visitor asked to stopped further processing.";
684          // Returning true since there was no parsing error.
685          return true;
686        }
687        break;
688      }
689      case RST_STREAM_FRAME: {
690        QuicRstStreamFrame frame;
691        if (!ProcessRstStreamFrame(&frame)) {
692          return RaiseError(QUIC_INVALID_RST_STREAM_DATA);
693        }
694        if (!visitor_->OnRstStreamFrame(frame)) {
695          DLOG(INFO) << "Visitor asked to stopped further processing.";
696          // Returning true since there was no parsing error.
697          return true;
698        }
699        break;
700      }
701      case CONNECTION_CLOSE_FRAME: {
702        QuicConnectionCloseFrame frame;
703        if (!ProcessConnectionCloseFrame(&frame)) {
704          return RaiseError(QUIC_INVALID_CONNECTION_CLOSE_DATA);
705        }
706        if (!visitor_->OnConnectionCloseFrame(frame)) {
707          DLOG(INFO) << "Visitor asked to stopped further processing.";
708          // Returning true since there was no parsing error.
709          return true;
710        }
711        break;
712      }
713      case GOAWAY_FRAME: {
714        QuicGoAwayFrame goaway_frame;
715        if (!ProcessGoAwayFrame(&goaway_frame)) {
716          return RaiseError(QUIC_INVALID_GOAWAY_DATA);
717        }
718        if (!visitor_->OnGoAwayFrame(goaway_frame)) {
719          DLOG(INFO) << "Visitor asked to stopped further processing.";
720          // Returning true since there was no parsing error.
721          return true;
722        }
723        break;
724      }
725      default:
726        set_detailed_error("Illegal frame type.");
727        DLOG(WARNING) << "Illegal frame type: "
728                      << static_cast<int>(frame_type);
729        return RaiseError(QUIC_INVALID_FRAME_DATA);
730    }
731  }
732
733  return true;
734}
735
736bool QuicFramer::ProcessStreamFrame(QuicStreamFrame* frame) {
737  if (!reader_->ReadUInt32(&frame->stream_id)) {
738    set_detailed_error("Unable to read stream_id.");
739    return false;
740  }
741
742  uint8 fin;
743  if (!reader_->ReadBytes(&fin, 1)) {
744    set_detailed_error("Unable to read fin.");
745    return false;
746  }
747  if (fin > 1) {
748    set_detailed_error("Invalid fin value.");
749    return false;
750  }
751  frame->fin = (fin == 1);
752
753  if (!reader_->ReadUInt64(&frame->offset)) {
754    set_detailed_error("Unable to read offset.");
755    return false;
756  }
757
758  if (!reader_->ReadStringPiece16(&frame->data)) {
759    set_detailed_error("Unable to read frame data.");
760    return false;
761  }
762
763  return true;
764}
765
766bool QuicFramer::ProcessAckFrame(QuicAckFrame* frame) {
767  if (!ProcessSentInfo(&frame->sent_info)) {
768    return false;
769  }
770  if (!ProcessReceivedInfo(&frame->received_info)) {
771    return false;
772  }
773  return true;
774}
775
776bool QuicFramer::ProcessReceivedInfo(ReceivedPacketInfo* received_info) {
777  if (!reader_->ReadBytes(&received_info->entropy_hash, 1)) {
778    set_detailed_error("Unable to read entropy hash for received packets.");
779    return false;
780  }
781
782  if (!ProcessPacketSequenceNumber(&received_info->largest_observed)) {
783     set_detailed_error("Unable to read largest observed.");
784     return false;
785  }
786
787  uint32 delta_time_largest_observed_us;
788  if (!reader_->ReadUInt32(&delta_time_largest_observed_us)) {
789    set_detailed_error("Unable to read delta time largest observed.");
790    return false;
791  }
792
793  if (delta_time_largest_observed_us == kInvalidDeltaTime) {
794    received_info->delta_time_largest_observed = QuicTime::Delta::Infinite();
795  } else {
796    received_info->delta_time_largest_observed =
797        QuicTime::Delta::FromMicroseconds(delta_time_largest_observed_us);
798  }
799
800  uint8 num_missing_packets;
801  if (!reader_->ReadBytes(&num_missing_packets, 1)) {
802    set_detailed_error("Unable to read num missing packets.");
803    return false;
804  }
805
806  for (int i = 0; i < num_missing_packets; ++i) {
807    QuicPacketSequenceNumber sequence_number;
808    if (!ProcessPacketSequenceNumber(&sequence_number)) {
809      set_detailed_error("Unable to read sequence number in missing packets.");
810      return false;
811    }
812    received_info->missing_packets.insert(sequence_number);
813  }
814
815  return true;
816}
817
818bool QuicFramer::ProcessSentInfo(SentPacketInfo* sent_info) {
819  if (!reader_->ReadBytes(&sent_info->entropy_hash, 1)) {
820    set_detailed_error("Unable to read entropy hash for sent packets.");
821    return false;
822  }
823
824  if (!ProcessPacketSequenceNumber(&sent_info->least_unacked)) {
825    set_detailed_error("Unable to read least unacked.");
826    return false;
827  }
828
829  return true;
830}
831
832bool QuicFramer::ProcessQuicCongestionFeedbackFrame(
833    QuicCongestionFeedbackFrame* frame) {
834  uint8 feedback_type;
835  if (!reader_->ReadBytes(&feedback_type, 1)) {
836    set_detailed_error("Unable to read congestion feedback type.");
837    return false;
838  }
839  frame->type =
840      static_cast<CongestionFeedbackType>(feedback_type);
841
842  switch (frame->type) {
843    case kInterArrival: {
844      CongestionFeedbackMessageInterArrival* inter_arrival =
845          &frame->inter_arrival;
846      if (!reader_->ReadUInt16(
847              &inter_arrival->accumulated_number_of_lost_packets)) {
848        set_detailed_error(
849            "Unable to read accumulated number of lost packets.");
850        return false;
851      }
852      uint8 num_received_packets;
853      if (!reader_->ReadBytes(&num_received_packets, 1)) {
854        set_detailed_error("Unable to read num received packets.");
855        return false;
856      }
857
858      if (num_received_packets > 0u) {
859        uint64 smallest_received;
860        if (!ProcessPacketSequenceNumber(&smallest_received)) {
861          set_detailed_error("Unable to read smallest received.");
862          return false;
863        }
864
865        uint64 time_received_us;
866        if (!reader_->ReadUInt64(&time_received_us)) {
867          set_detailed_error("Unable to read time received.");
868          return false;
869        }
870        QuicTime time_received = creation_time_.Add(
871            QuicTime::Delta::FromMicroseconds(time_received_us));
872
873        inter_arrival->received_packet_times.insert(
874            make_pair(smallest_received, time_received));
875
876        for (int i = 0; i < num_received_packets - 1; ++i) {
877          uint16 sequence_delta;
878          if (!reader_->ReadUInt16(&sequence_delta)) {
879            set_detailed_error(
880                "Unable to read sequence delta in received packets.");
881            return false;
882          }
883
884          int32 time_delta_us;
885          if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) {
886            set_detailed_error(
887                "Unable to read time delta in received packets.");
888            return false;
889          }
890          QuicPacketSequenceNumber packet = smallest_received + sequence_delta;
891          inter_arrival->received_packet_times.insert(
892              make_pair(packet, time_received.Add(
893                  QuicTime::Delta::FromMicroseconds(time_delta_us))));
894        }
895      }
896      break;
897    }
898    case kFixRate: {
899      uint32 bitrate = 0;
900      if (!reader_->ReadUInt32(&bitrate)) {
901        set_detailed_error("Unable to read bitrate.");
902        return false;
903      }
904      frame->fix_rate.bitrate = QuicBandwidth::FromBytesPerSecond(bitrate);
905      break;
906    }
907    case kTCP: {
908      CongestionFeedbackMessageTCP* tcp = &frame->tcp;
909      if (!reader_->ReadUInt16(&tcp->accumulated_number_of_lost_packets)) {
910        set_detailed_error(
911            "Unable to read accumulated number of lost packets.");
912        return false;
913      }
914      uint16 receive_window = 0;
915      if (!reader_->ReadUInt16(&receive_window)) {
916        set_detailed_error("Unable to read receive window.");
917        return false;
918      }
919      // Simple bit packing, don't send the 4 least significant bits.
920      tcp->receive_window = static_cast<QuicByteCount>(receive_window) << 4;
921      break;
922    }
923    default:
924      set_detailed_error("Illegal congestion feedback type.");
925      DLOG(WARNING) << "Illegal congestion feedback type: "
926                    << frame->type;
927      return RaiseError(QUIC_INVALID_FRAME_DATA);
928  }
929
930  return true;
931}
932
933bool QuicFramer::ProcessRstStreamFrame(QuicRstStreamFrame* frame) {
934  if (!reader_->ReadUInt32(&frame->stream_id)) {
935    set_detailed_error("Unable to read stream_id.");
936    return false;
937  }
938
939  uint32 error_code;
940  if (!reader_->ReadUInt32(&error_code)) {
941    set_detailed_error("Unable to read rst stream error code.");
942    return false;
943  }
944
945  if (error_code >= QUIC_STREAM_LAST_ERROR ||
946      error_code < QUIC_STREAM_NO_ERROR) {
947    set_detailed_error("Invalid rst stream error code.");
948    return false;
949  }
950
951  frame->error_code = static_cast<QuicRstStreamErrorCode>(error_code);
952
953  StringPiece error_details;
954  if (!reader_->ReadStringPiece16(&error_details)) {
955    set_detailed_error("Unable to read rst stream error details.");
956    return false;
957  }
958  frame->error_details = error_details.as_string();
959
960  return true;
961}
962
963bool QuicFramer::ProcessConnectionCloseFrame(QuicConnectionCloseFrame* frame) {
964  uint32 error_code;
965  if (!reader_->ReadUInt32(&error_code)) {
966    set_detailed_error("Unable to read connection close error code.");
967    return false;
968  }
969
970  if (error_code >= QUIC_LAST_ERROR ||
971         error_code < QUIC_NO_ERROR) {
972    set_detailed_error("Invalid error code.");
973    return false;
974  }
975
976  frame->error_code = static_cast<QuicErrorCode>(error_code);
977
978  StringPiece error_details;
979  if (!reader_->ReadStringPiece16(&error_details)) {
980    set_detailed_error("Unable to read connection close error details.");
981    return false;
982  }
983  frame->error_details = error_details.as_string();
984
985  if (!ProcessAckFrame(&frame->ack_frame)) {
986    DLOG(WARNING) << "Unable to process ack frame.";
987    return false;
988  }
989
990  if (!visitor_->OnAckFrame(frame->ack_frame)) {
991    DLOG(INFO) << "Visitor asked to stopped further processing.";
992    // Returning true since there was no parsing error.
993    return true;
994  }
995
996  return true;
997}
998
999bool QuicFramer::ProcessGoAwayFrame(QuicGoAwayFrame* frame) {
1000  uint32 error_code;
1001  if (!reader_->ReadUInt32(&error_code)) {
1002    set_detailed_error("Unable to read go away error code.");
1003    return false;
1004  }
1005  frame->error_code = static_cast<QuicErrorCode>(error_code);
1006
1007  if (error_code >= QUIC_LAST_ERROR ||
1008      error_code < QUIC_NO_ERROR) {
1009    set_detailed_error("Invalid error code.");
1010    return false;
1011  }
1012
1013  uint32 stream_id;
1014  if (!reader_->ReadUInt32(&stream_id)) {
1015    set_detailed_error("Unable to read last good stream id.");
1016    return false;
1017  }
1018  frame->last_good_stream_id = static_cast<QuicStreamId>(stream_id);
1019
1020  StringPiece reason_phrase;
1021  if (!reader_->ReadStringPiece16(&reason_phrase)) {
1022    set_detailed_error("Unable to read goaway reason.");
1023    return false;
1024  }
1025  frame->reason_phrase = reason_phrase.as_string();
1026
1027  return true;
1028}
1029
1030// static
1031StringPiece QuicFramer::GetAssociatedDataFromEncryptedPacket(
1032    const QuicEncryptedPacket& encrypted, bool includes_version) {
1033  return StringPiece(encrypted.data() + kStartOfHashData,
1034                     GetStartOfEncryptedData(includes_version) -
1035                         kStartOfHashData);
1036}
1037
1038void QuicFramer::SetDecrypter(QuicDecrypter* decrypter) {
1039  DCHECK(alternative_decrypter_.get() == NULL);
1040  decrypter_.reset(decrypter);
1041}
1042
1043void QuicFramer::SetAlternativeDecrypter(QuicDecrypter* decrypter,
1044                                         bool latch_once_used) {
1045  alternative_decrypter_.reset(decrypter);
1046  alternative_decrypter_latch_ = latch_once_used;
1047}
1048
1049const QuicDecrypter* QuicFramer::decrypter() const {
1050  return decrypter_.get();
1051}
1052
1053const QuicDecrypter* QuicFramer::alternative_decrypter() const {
1054  return alternative_decrypter_.get();
1055}
1056
1057void QuicFramer::SetEncrypter(EncryptionLevel level,
1058                              QuicEncrypter* encrypter) {
1059  DCHECK_GE(level, 0);
1060  DCHECK_LT(level, NUM_ENCRYPTION_LEVELS);
1061  encrypter_[level].reset(encrypter);
1062}
1063
1064const QuicEncrypter* QuicFramer::encrypter(EncryptionLevel level) const {
1065  DCHECK_GE(level, 0);
1066  DCHECK_LT(level, NUM_ENCRYPTION_LEVELS);
1067  DCHECK(encrypter_[level].get() != NULL);
1068  return encrypter_[level].get();
1069}
1070
1071QuicEncryptedPacket* QuicFramer::EncryptPacket(
1072    EncryptionLevel level,
1073    QuicPacketSequenceNumber packet_sequence_number,
1074    const QuicPacket& packet) {
1075  DCHECK(encrypter_[level].get() != NULL);
1076
1077  scoped_ptr<QuicData> out(encrypter_[level]->EncryptPacket(
1078      packet_sequence_number, packet.AssociatedData(), packet.Plaintext()));
1079  if (out.get() == NULL) {
1080    RaiseError(QUIC_ENCRYPTION_FAILURE);
1081    return NULL;
1082  }
1083  StringPiece header_data = packet.BeforePlaintext();
1084  size_t len =  header_data.length() + out->length();
1085  char* buffer = new char[len];
1086  // TODO(rch): eliminate this buffer copy by passing in a buffer to Encrypt().
1087  memcpy(buffer, header_data.data(), header_data.length());
1088  memcpy(buffer + header_data.length(), out->data(), out->length());
1089  return new QuicEncryptedPacket(buffer, len, true);
1090}
1091
1092size_t QuicFramer::GetMaxPlaintextSize(size_t ciphertext_size) {
1093  // In order to keep the code simple, we don't have the current encryption
1094  // level to hand. At the moment, all AEADs have a tag-length of 16 bytes so
1095  // that doesn't matter but we take the minimum plaintext length just to be
1096  // safe.
1097  size_t min_plaintext_size = ciphertext_size;
1098
1099  for (int i = ENCRYPTION_NONE; i <= ENCRYPTION_FORWARD_SECURE; i++) {
1100    if (encrypter_[i].get() != NULL) {
1101      size_t size = encrypter_[i]->GetMaxPlaintextSize(ciphertext_size);
1102      if (size < min_plaintext_size) {
1103        min_plaintext_size = size;
1104      }
1105    }
1106  }
1107
1108  return min_plaintext_size;
1109}
1110
1111bool QuicFramer::DecryptPayload(QuicPacketSequenceNumber sequence_number,
1112                                bool version_flag,
1113                                const QuicEncryptedPacket& packet) {
1114  StringPiece encrypted;
1115  if (!reader_->ReadStringPiece(&encrypted, reader_->BytesRemaining())) {
1116    return false;
1117  }
1118  DCHECK(decrypter_.get() != NULL);
1119  LOG(INFO) << "Decrypting packet";
1120  decrypted_.reset(decrypter_->DecryptPacket(
1121      sequence_number,
1122      GetAssociatedDataFromEncryptedPacket(packet, version_flag),
1123      encrypted));
1124  if  (decrypted_.get() == NULL && alternative_decrypter_.get() != NULL) {
1125    LOG(INFO) << "Trying alternative";
1126    decrypted_.reset(alternative_decrypter_->DecryptPacket(
1127        sequence_number,
1128        GetAssociatedDataFromEncryptedPacket(packet, version_flag),
1129        encrypted));
1130    if (decrypted_.get() != NULL) {
1131      LOG(INFO) << "alternative ok";
1132      if (alternative_decrypter_latch_) {
1133        LOG(INFO) << "  latching";
1134        // Switch to the alternative decrypter and latch so that we cannot
1135        // switch back.
1136        decrypter_.reset(alternative_decrypter_.release());
1137      } else {
1138        LOG(INFO) << "  swapping";
1139        // Switch the alternative decrypter so that we use it first next time.
1140        decrypter_.swap(alternative_decrypter_);
1141      }
1142    }
1143  }
1144
1145  if  (decrypted_.get() == NULL) {
1146    return false;
1147  }
1148
1149  reader_.reset(new QuicDataReader(decrypted_->data(), decrypted_->length()));
1150  return true;
1151}
1152
1153size_t QuicFramer::ComputeFrameLength(const QuicFrame& frame) {
1154  switch (frame.type) {
1155    case STREAM_FRAME:
1156      return GetMinStreamFrameSize() + frame.stream_frame->data.size();
1157    case ACK_FRAME: {
1158      const QuicAckFrame& ack = *frame.ack_frame;
1159      return GetMinAckFrameSize() +
1160          kSequenceNumberSize * ack.received_info.missing_packets.size();
1161    }
1162    case CONGESTION_FEEDBACK_FRAME: {
1163      size_t len = kQuicFrameTypeSize;
1164      const QuicCongestionFeedbackFrame& congestion_feedback =
1165          *frame.congestion_feedback_frame;
1166      len += 1;  // Congestion feedback type.
1167
1168      switch (congestion_feedback.type) {
1169        case kInterArrival: {
1170          const CongestionFeedbackMessageInterArrival& inter_arrival =
1171              congestion_feedback.inter_arrival;
1172          len += 2;
1173          len += 1;  // Number received packets.
1174          if (inter_arrival.received_packet_times.size() > 0) {
1175            len += kSequenceNumberSize;  // Smallest received.
1176            len += 8;  // Time.
1177            // 2 bytes per sequence number delta plus 4 bytes per delta time.
1178            len += kSequenceNumberSize *
1179                (inter_arrival.received_packet_times.size() - 1);
1180          }
1181          break;
1182        }
1183        case kFixRate:
1184          len += 4;
1185          break;
1186        case kTCP:
1187          len += 4;
1188          break;
1189        default:
1190          set_detailed_error("Illegal feedback type.");
1191          DLOG(INFO) << "Illegal feedback type: " << congestion_feedback.type;
1192          break;
1193      }
1194      return len;
1195    }
1196    case RST_STREAM_FRAME:
1197      return GetMinRstStreamFrameSize() +
1198          frame.rst_stream_frame->error_details.size();
1199    case CONNECTION_CLOSE_FRAME: {
1200      const QuicAckFrame& ack = frame.connection_close_frame->ack_frame;
1201      return GetMinConnectionCloseFrameSize() +
1202          frame.connection_close_frame->error_details.size() +
1203          kSequenceNumberSize * ack.received_info.missing_packets.size();
1204    }
1205    case GOAWAY_FRAME:
1206      return GetMinGoAwayFrameSize() + frame.goaway_frame->reason_phrase.size();
1207    case PADDING_FRAME:
1208      DCHECK(false);
1209      return 0;
1210    case NUM_FRAME_TYPES:
1211      DCHECK(false);
1212      return 0;
1213  }
1214
1215  // Not reachable, but some Chrome compilers can't figure that out.  *sigh*
1216  DCHECK(false);
1217  return 0;
1218}
1219
1220// static
1221bool QuicFramer::AppendPacketSequenceNumber(
1222    QuicPacketSequenceNumber packet_sequence_number,
1223    QuicDataWriter* writer) {
1224  // Ensure the entire sequence number can be written.
1225  if (writer->capacity() - writer->length() < kSequenceNumberSize) {
1226    return false;
1227  }
1228  return writer->WriteUInt48(packet_sequence_number & kSequenceNumberMask);
1229}
1230
1231bool QuicFramer::AppendStreamFramePayload(
1232    const QuicStreamFrame& frame,
1233    QuicDataWriter* writer) {
1234  if (!writer->WriteUInt32(frame.stream_id)) {
1235    return false;
1236  }
1237  if (!writer->WriteUInt8(frame.fin)) {
1238    return false;
1239  }
1240  if (!writer->WriteUInt64(frame.offset)) {
1241    return false;
1242  }
1243  if (!writer->WriteUInt16(frame.data.size())) {
1244    return false;
1245  }
1246  if (!writer->WriteBytes(frame.data.data(),
1247                           frame.data.size())) {
1248    return false;
1249  }
1250  return true;
1251}
1252
1253QuicPacketSequenceNumber QuicFramer::CalculateLargestObserved(
1254    const SequenceNumberSet& missing_packets,
1255    SequenceNumberSet::const_iterator largest_written) {
1256  SequenceNumberSet::const_iterator it = largest_written;
1257  QuicPacketSequenceNumber previous_missing = *it;
1258  ++it;
1259
1260  // See if the next thing is a gap in the missing packets: if it's a
1261  // non-missing packet we can return it.
1262  if (it != missing_packets.end() && previous_missing + 1 != *it) {
1263    return *it - 1;
1264  }
1265
1266  // Otherwise return the largest missing packet, as indirectly observed.
1267  return *largest_written;
1268}
1269
1270// TODO(ianswett): Use varints or another more compact approach for all deltas.
1271bool QuicFramer::AppendAckFramePayload(
1272    const QuicAckFrame& frame,
1273    QuicDataWriter* writer) {
1274  // TODO(satyamshekhar): Decide how often we really should send this
1275  // entropy_hash update.
1276  if (!writer->WriteUInt8(frame.sent_info.entropy_hash)) {
1277    return false;
1278  }
1279
1280  if (!AppendPacketSequenceNumber(frame.sent_info.least_unacked, writer)) {
1281    return false;
1282  }
1283
1284  size_t received_entropy_offset = writer->length();
1285  if (!writer->WriteUInt8(frame.received_info.entropy_hash)) {
1286    return false;
1287  }
1288
1289  size_t largest_observed_offset = writer->length();
1290  if (!AppendPacketSequenceNumber(frame.received_info.largest_observed,
1291                                  writer)) {
1292    return false;
1293  }
1294  uint32 delta_time_largest_observed_us = kInvalidDeltaTime;
1295  if (!frame.received_info.delta_time_largest_observed.IsInfinite()) {
1296    delta_time_largest_observed_us =
1297        frame.received_info.delta_time_largest_observed.ToMicroseconds();
1298  }
1299
1300  size_t delta_time_largest_observed_offset = writer->length();
1301  if (!writer->WriteUInt32(delta_time_largest_observed_us)) {
1302    return false;
1303  }
1304
1305  // We don't check for overflowing uint8 here, because we only can fit 192 acks
1306  // per packet, so if we overflow we will be truncated.
1307  uint8 num_missing_packets = frame.received_info.missing_packets.size();
1308  size_t num_missing_packets_offset = writer->length();
1309  if (!writer->WriteBytes(&num_missing_packets, 1)) {
1310    return false;
1311  }
1312
1313  SequenceNumberSet::const_iterator it =
1314      frame.received_info.missing_packets.begin();
1315  int num_missing_packets_written = 0;
1316  for (; it != frame.received_info.missing_packets.end(); ++it) {
1317    if (!AppendPacketSequenceNumber(*it, writer)) {
1318      // We are truncating.
1319      QuicPacketSequenceNumber largest_observed =
1320          CalculateLargestObserved(frame.received_info.missing_packets, --it);
1321      // Overwrite entropy hash for received packets.
1322      writer->WriteUInt8ToOffset(
1323          entropy_calculator_->ReceivedEntropyHash(largest_observed),
1324          received_entropy_offset);
1325      // Overwrite largest_observed.
1326      writer->WriteUInt48ToOffset(largest_observed & kSequenceNumberMask,
1327                                  largest_observed_offset);
1328      writer->WriteUInt32ToOffset(kInvalidDeltaTime,
1329                                  delta_time_largest_observed_offset);
1330      writer->WriteUInt8ToOffset(num_missing_packets_written,
1331                                 num_missing_packets_offset);
1332      return true;
1333    }
1334    ++num_missing_packets_written;
1335    DCHECK_GE(numeric_limits<uint8>::max(), num_missing_packets_written);
1336  }
1337
1338  return true;
1339}
1340
1341bool QuicFramer::AppendQuicCongestionFeedbackFramePayload(
1342    const QuicCongestionFeedbackFrame& frame,
1343    QuicDataWriter* writer) {
1344  if (!writer->WriteBytes(&frame.type, 1)) {
1345    return false;
1346  }
1347
1348  switch (frame.type) {
1349    case kInterArrival: {
1350      const CongestionFeedbackMessageInterArrival& inter_arrival =
1351          frame.inter_arrival;
1352      if (!writer->WriteUInt16(
1353              inter_arrival.accumulated_number_of_lost_packets)) {
1354        return false;
1355      }
1356      DCHECK_GE(numeric_limits<uint8>::max(),
1357                inter_arrival.received_packet_times.size());
1358      if (inter_arrival.received_packet_times.size() >
1359          numeric_limits<uint8>::max()) {
1360        return false;
1361      }
1362      // TODO(ianswett): Make num_received_packets a varint.
1363      uint8 num_received_packets =
1364          inter_arrival.received_packet_times.size();
1365      if (!writer->WriteBytes(&num_received_packets, 1)) {
1366        return false;
1367      }
1368      if (num_received_packets > 0) {
1369        TimeMap::const_iterator it =
1370            inter_arrival.received_packet_times.begin();
1371
1372        QuicPacketSequenceNumber lowest_sequence = it->first;
1373        if (!AppendPacketSequenceNumber(lowest_sequence, writer)) {
1374          return false;
1375        }
1376
1377        QuicTime lowest_time = it->second;
1378        if (!writer->WriteUInt64(
1379                lowest_time.Subtract(creation_time_).ToMicroseconds())) {
1380          return false;
1381        }
1382
1383        for (++it; it != inter_arrival.received_packet_times.end(); ++it) {
1384          QuicPacketSequenceNumber sequence_delta = it->first - lowest_sequence;
1385          DCHECK_GE(numeric_limits<uint16>::max(), sequence_delta);
1386          if (sequence_delta > numeric_limits<uint16>::max()) {
1387            return false;
1388          }
1389          if (!writer->WriteUInt16(static_cast<uint16>(sequence_delta))) {
1390            return false;
1391          }
1392
1393          int32 time_delta_us =
1394              it->second.Subtract(lowest_time).ToMicroseconds();
1395          if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) {
1396            return false;
1397          }
1398        }
1399      }
1400      break;
1401    }
1402    case kFixRate: {
1403      const CongestionFeedbackMessageFixRate& fix_rate =
1404          frame.fix_rate;
1405      if (!writer->WriteUInt32(fix_rate.bitrate.ToBytesPerSecond())) {
1406        return false;
1407      }
1408      break;
1409    }
1410    case kTCP: {
1411      const CongestionFeedbackMessageTCP& tcp = frame.tcp;
1412      DCHECK_LE(tcp.receive_window, 1u << 20);
1413      // Simple bit packing, don't send the 4 least significant bits.
1414      uint16 receive_window = static_cast<uint16>(tcp.receive_window >> 4);
1415      if (!writer->WriteUInt16(tcp.accumulated_number_of_lost_packets)) {
1416        return false;
1417      }
1418      if (!writer->WriteUInt16(receive_window)) {
1419        return false;
1420      }
1421      break;
1422    }
1423    default:
1424      return false;
1425  }
1426
1427  return true;
1428}
1429
1430bool QuicFramer::AppendRstStreamFramePayload(
1431        const QuicRstStreamFrame& frame,
1432        QuicDataWriter* writer) {
1433  if (!writer->WriteUInt32(frame.stream_id)) {
1434    return false;
1435  }
1436
1437  uint32 error_code = static_cast<uint32>(frame.error_code);
1438  if (!writer->WriteUInt32(error_code)) {
1439    return false;
1440  }
1441
1442  if (!writer->WriteStringPiece16(frame.error_details)) {
1443    return false;
1444  }
1445  return true;
1446}
1447
1448bool QuicFramer::AppendConnectionCloseFramePayload(
1449    const QuicConnectionCloseFrame& frame,
1450    QuicDataWriter* writer) {
1451  uint32 error_code = static_cast<uint32>(frame.error_code);
1452  if (!writer->WriteUInt32(error_code)) {
1453    return false;
1454  }
1455  if (!writer->WriteStringPiece16(frame.error_details)) {
1456    return false;
1457  }
1458  AppendAckFramePayload(frame.ack_frame, writer);
1459  return true;
1460}
1461
1462bool QuicFramer::AppendGoAwayFramePayload(const QuicGoAwayFrame& frame,
1463                                          QuicDataWriter* writer) {
1464  uint32 error_code = static_cast<uint32>(frame.error_code);
1465  if (!writer->WriteUInt32(error_code)) {
1466    return false;
1467  }
1468  uint32 stream_id = static_cast<uint32>(frame.last_good_stream_id);
1469  if (!writer->WriteUInt32(stream_id)) {
1470    return false;
1471  }
1472  if (!writer->WriteStringPiece16(frame.reason_phrase)) {
1473    return false;
1474  }
1475  return true;
1476}
1477
1478bool QuicFramer::RaiseError(QuicErrorCode error) {
1479  DLOG(INFO) << detailed_error_;
1480  set_error(error);
1481  visitor_->OnError(this);
1482  reader_.reset(NULL);
1483  return false;
1484}
1485
1486}  // namespace net
1487