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_connection.h"
      6 
      7 #include <algorithm>
      8 
      9 #include "base/logging.h"
     10 #include "base/stl_util.h"
     11 #include "net/quic/crypto/quic_decrypter.h"
     12 #include "net/quic/crypto/quic_encrypter.h"
     13 #include "net/quic/quic_utils.h"
     14 
     15 using base::hash_map;
     16 using base::hash_set;
     17 using base::StringPiece;
     18 using std::list;
     19 using std::make_pair;
     20 using std::min;
     21 using std::max;
     22 using std::vector;
     23 using std::set;
     24 using std::string;
     25 
     26 namespace net {
     27 namespace {
     28 
     29 // The largest gap in packets we'll accept without closing the connection.
     30 // This will likely have to be tuned.
     31 const QuicPacketSequenceNumber kMaxPacketGap = 5000;
     32 
     33 // We want to make sure if we get a large nack packet, we don't queue up too
     34 // many packets at once.  10 is arbitrary.
     35 const int kMaxRetransmissionsPerAck = 10;
     36 
     37 // TCP retransmits after 2 nacks.  We allow for a third in case of out-of-order
     38 // delivery.
     39 // TODO(ianswett): Change to match TCP's rule of retransmitting once an ack
     40 // at least 3 sequence numbers larger arrives.
     41 const size_t kNumberOfNacksBeforeRetransmission = 3;
     42 
     43 // The maxiumum number of packets we'd like to queue.  We may end up queueing
     44 // more in the case of many control frames.
     45 // 6 is arbitrary.
     46 const int kMaxPacketsToSerializeAtOnce = 6;
     47 
     48 // Limit the number of packets we send per retransmission-alarm so we
     49 // eventually cede.  10 is arbitrary.
     50 const size_t kMaxPacketsPerRetransmissionAlarm = 10;
     51 
     52 // Limit the number of FEC groups to two.  If we get enough out of order packets
     53 // that this becomes limiting, we can revisit.
     54 const size_t kMaxFecGroups = 2;
     55 
     56 // Limit the number of undecryptable packets we buffer in
     57 // expectation of the CHLO/SHLO arriving.
     58 const size_t kMaxUndecryptablePackets = 10;
     59 
     60 bool Near(QuicPacketSequenceNumber a, QuicPacketSequenceNumber b) {
     61   QuicPacketSequenceNumber delta = (a > b) ? a - b : b - a;
     62   return delta <= kMaxPacketGap;
     63 }
     64 
     65 
     66 // An alarm that is scheduled to send an ack if a timeout occurs.
     67 class AckAlarm : public QuicAlarm::Delegate {
     68  public:
     69   explicit AckAlarm(QuicConnection* connection)
     70       : connection_(connection) {
     71   }
     72 
     73   virtual QuicTime OnAlarm() OVERRIDE {
     74     connection_->SendAck();
     75     return QuicTime::Zero();
     76   }
     77 
     78  private:
     79   QuicConnection* connection_;
     80 };
     81 
     82 // This alarm will be scheduled any time a data-bearing packet is sent out.
     83 // When the alarm goes off, the connection checks to see if the oldest packets
     84 // have been acked, and retransmit them if they have not.
     85 class RetransmissionAlarm : public QuicAlarm::Delegate {
     86  public:
     87   explicit RetransmissionAlarm(QuicConnection* connection)
     88       : connection_(connection) {
     89   }
     90 
     91   virtual QuicTime OnAlarm() OVERRIDE {
     92     return connection_->OnRetransmissionTimeout();
     93   }
     94 
     95  private:
     96   QuicConnection* connection_;
     97 };
     98 
     99 // An alarm that is scheduled when the sent scheduler requires a
    100 // a delay before sending packets and fires when the packet may be sent.
    101 class SendAlarm : public QuicAlarm::Delegate {
    102  public:
    103   explicit SendAlarm(QuicConnection* connection)
    104       : connection_(connection) {
    105   }
    106 
    107   virtual QuicTime OnAlarm() OVERRIDE {
    108     connection_->OnCanWrite();
    109     // Never reschedule the alarm, since OnCanWrite does that.
    110     return QuicTime::Zero();
    111   }
    112 
    113  private:
    114   QuicConnection* connection_;
    115 };
    116 
    117 class TimeoutAlarm : public QuicAlarm::Delegate {
    118  public:
    119   explicit TimeoutAlarm(QuicConnection* connection)
    120       : connection_(connection) {
    121   }
    122 
    123   virtual QuicTime OnAlarm() OVERRIDE {
    124     connection_->CheckForTimeout();
    125     // Never reschedule the alarm, since CheckForTimeout does that.
    126     return QuicTime::Zero();
    127   }
    128 
    129  private:
    130   QuicConnection* connection_;
    131 };
    132 
    133 }  // namespace
    134 
    135 #define ENDPOINT (is_server_ ? "Server: " : " Client: ")
    136 
    137 QuicConnection::QuicConnection(QuicGuid guid,
    138                                IPEndPoint address,
    139                                QuicConnectionHelperInterface* helper,
    140                                bool is_server,
    141                                QuicVersion version)
    142     : framer_(version,
    143               helper->GetClock()->ApproximateNow(),
    144               is_server),
    145       helper_(helper),
    146       encryption_level_(ENCRYPTION_NONE),
    147       clock_(helper->GetClock()),
    148       random_generator_(helper->GetRandomGenerator()),
    149       guid_(guid),
    150       peer_address_(address),
    151       largest_seen_packet_with_ack_(0),
    152       handling_retransmission_timeout_(false),
    153       write_blocked_(false),
    154       ack_alarm_(helper->CreateAlarm(new AckAlarm(this))),
    155       retransmission_alarm_(helper->CreateAlarm(new RetransmissionAlarm(this))),
    156       send_alarm_(helper->CreateAlarm(new SendAlarm(this))),
    157       timeout_alarm_(helper->CreateAlarm(new TimeoutAlarm(this))),
    158       debug_visitor_(NULL),
    159       packet_creator_(guid_, &framer_, random_generator_, is_server),
    160       packet_generator_(this, NULL, &packet_creator_),
    161       idle_network_timeout_(
    162           QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs)),
    163       overall_connection_timeout_(QuicTime::Delta::Infinite()),
    164       creation_time_(clock_->ApproximateNow()),
    165       time_of_last_received_packet_(clock_->ApproximateNow()),
    166       time_of_last_sent_packet_(clock_->ApproximateNow()),
    167       congestion_manager_(clock_, kTCP),
    168       version_negotiation_state_(START_NEGOTIATION),
    169       max_packets_per_retransmission_alarm_(kMaxPacketsPerRetransmissionAlarm),
    170       is_server_(is_server),
    171       connected_(true),
    172       received_truncated_ack_(false),
    173       send_ack_in_response_to_packet_(false),
    174       address_migrating_(false) {
    175   helper_->SetConnection(this);
    176   timeout_alarm_->Set(clock_->ApproximateNow().Add(idle_network_timeout_));
    177   framer_.set_visitor(this);
    178   framer_.set_received_entropy_calculator(&received_packet_manager_);
    179 
    180   /*
    181   if (FLAGS_fake_packet_loss_percentage > 0) {
    182     int32 seed = RandomBase::WeakSeed32();
    183     LOG(INFO) << ENDPOINT << "Seeding packet loss with " << seed;
    184     random_.reset(new MTRandom(seed));
    185   }
    186   */
    187 }
    188 
    189 QuicConnection::~QuicConnection() {
    190   STLDeleteElements(&undecryptable_packets_);
    191   STLDeleteValues(&unacked_packets_);
    192   STLDeleteValues(&group_map_);
    193   for (QueuedPacketList::iterator it = queued_packets_.begin();
    194        it != queued_packets_.end(); ++it) {
    195     delete it->packet;
    196   }
    197 }
    198 
    199 bool QuicConnection::SelectMutualVersion(
    200     const QuicVersionVector& available_versions) {
    201   // Try to find the highest mutual version by iterating over supported
    202   // versions, starting with the highest, and breaking out of the loop once we
    203   // find a matching version in the provided available_versions vector.
    204   for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
    205     const QuicVersion& version = kSupportedQuicVersions[i];
    206     if (std::find(available_versions.begin(), available_versions.end(),
    207                   version) != available_versions.end()) {
    208       framer_.set_version(version);
    209       return true;
    210     }
    211   }
    212 
    213   return false;
    214 }
    215 
    216 void QuicConnection::OnError(QuicFramer* framer) {
    217   // Packets that we cannot decrypt are dropped.
    218   // TODO(rch): add stats to measure this.
    219   if (!connected_ || framer->error() == QUIC_DECRYPTION_FAILURE) {
    220     return;
    221   }
    222   SendConnectionClose(framer->error());
    223 }
    224 
    225 void QuicConnection::OnPacket() {
    226   DCHECK(last_stream_frames_.empty() &&
    227          last_goaway_frames_.empty() &&
    228          last_rst_frames_.empty() &&
    229          last_ack_frames_.empty() &&
    230          last_congestion_frames_.empty());
    231 }
    232 
    233 void QuicConnection::OnPublicResetPacket(
    234     const QuicPublicResetPacket& packet) {
    235   if (debug_visitor_) {
    236     debug_visitor_->OnPublicResetPacket(packet);
    237   }
    238   CloseConnection(QUIC_PUBLIC_RESET, true);
    239 }
    240 
    241 bool QuicConnection::OnProtocolVersionMismatch(QuicVersion received_version) {
    242   // TODO(satyamshekhar): Implement no server state in this mode.
    243   if (!is_server_) {
    244     LOG(DFATAL) << ENDPOINT << "Framer called OnProtocolVersionMismatch. "
    245                 << "Closing connection.";
    246     CloseConnection(QUIC_INTERNAL_ERROR, false);
    247     return false;
    248   }
    249   DCHECK_NE(version(), received_version);
    250 
    251   if (debug_visitor_) {
    252     debug_visitor_->OnProtocolVersionMismatch(received_version);
    253   }
    254 
    255   switch (version_negotiation_state_) {
    256     case START_NEGOTIATION:
    257       if (!framer_.IsSupportedVersion(received_version)) {
    258         SendVersionNegotiationPacket();
    259         version_negotiation_state_ = NEGOTIATION_IN_PROGRESS;
    260         return false;
    261       }
    262       break;
    263 
    264     case NEGOTIATION_IN_PROGRESS:
    265       if (!framer_.IsSupportedVersion(received_version)) {
    266         // Drop packets which can't be parsed due to version mismatch.
    267         return false;
    268       }
    269       break;
    270 
    271     case NEGOTIATED_VERSION:
    272       // Might be old packets that were sent by the client before the version
    273       // was negotiated. Drop these.
    274       return false;
    275 
    276     default:
    277       DCHECK(false);
    278   }
    279 
    280   version_negotiation_state_ = NEGOTIATED_VERSION;
    281 
    282   // Store the new version.
    283   framer_.set_version(received_version);
    284 
    285   // TODO(satyamshekhar): Store the sequence number of this packet and close the
    286   // connection if we ever received a packet with incorrect version and whose
    287   // sequence number is greater.
    288   return true;
    289 }
    290 
    291 // Handles version negotiation for client connection.
    292 void QuicConnection::OnVersionNegotiationPacket(
    293     const QuicVersionNegotiationPacket& packet) {
    294   if (is_server_) {
    295     LOG(DFATAL) << ENDPOINT << "Framer parsed VersionNegotiationPacket."
    296                 << " Closing connection.";
    297     CloseConnection(QUIC_INTERNAL_ERROR, false);
    298     return;
    299   }
    300   if (debug_visitor_) {
    301     debug_visitor_->OnVersionNegotiationPacket(packet);
    302   }
    303 
    304   if (version_negotiation_state_ != START_NEGOTIATION) {
    305     // Possibly a duplicate version negotiation packet.
    306     return;
    307   }
    308 
    309   if (std::find(packet.versions.begin(),
    310                 packet.versions.end(), version()) !=
    311       packet.versions.end()) {
    312     DLOG(WARNING) << ENDPOINT << "The server already supports our version. "
    313                   << "It should have accepted our connection.";
    314     // Just drop the connection.
    315     CloseConnection(QUIC_INVALID_VERSION_NEGOTIATION_PACKET, false);
    316     return;
    317   }
    318 
    319   if (!SelectMutualVersion(packet.versions)) {
    320     SendConnectionCloseWithDetails(QUIC_INVALID_VERSION,
    321                                    "no common version found");
    322     return;
    323   }
    324 
    325   version_negotiation_state_ = NEGOTIATION_IN_PROGRESS;
    326   RetransmitUnackedPackets(ALL_PACKETS);
    327 }
    328 
    329 void QuicConnection::OnRevivedPacket() {
    330 }
    331 
    332 bool QuicConnection::OnPacketHeader(const QuicPacketHeader& header) {
    333   if (debug_visitor_) {
    334     debug_visitor_->OnPacketHeader(header);
    335   }
    336 
    337   if (!ProcessValidatedPacket()) {
    338     return false;
    339   }
    340 
    341   // Will be decrement below if we fall through to return true;
    342   ++stats_.packets_dropped;
    343 
    344   if (header.public_header.guid != guid_) {
    345     DLOG(INFO) << ENDPOINT << "Ignoring packet from unexpected GUID: "
    346                << header.public_header.guid << " instead of " << guid_;
    347     return false;
    348   }
    349 
    350   if (!Near(header.packet_sequence_number,
    351             last_header_.packet_sequence_number)) {
    352     DLOG(INFO) << ENDPOINT << "Packet " << header.packet_sequence_number
    353                << " out of bounds.  Discarding";
    354     SendConnectionCloseWithDetails(QUIC_INVALID_PACKET_HEADER,
    355                                    "Packet sequence number out of bounds");
    356     return false;
    357   }
    358 
    359   // If this packet has already been seen, or that the sender
    360   // has told us will not be retransmitted, then stop processing the packet.
    361   if (!received_packet_manager_.IsAwaitingPacket(
    362           header.packet_sequence_number)) {
    363     return false;
    364   }
    365 
    366   if (version_negotiation_state_ != NEGOTIATED_VERSION) {
    367     if (is_server_) {
    368       if (!header.public_header.version_flag) {
    369         DLOG(WARNING) << ENDPOINT << "Got packet without version flag before "
    370                       << "version negotiated.";
    371         // Packets should have the version flag till version negotiation is
    372         // done.
    373         CloseConnection(QUIC_INVALID_VERSION, false);
    374         return false;
    375       } else {
    376         DCHECK_EQ(1u, header.public_header.versions.size());
    377         DCHECK_EQ(header.public_header.versions[0], version());
    378         version_negotiation_state_ = NEGOTIATED_VERSION;
    379       }
    380     } else {
    381       DCHECK(!header.public_header.version_flag);
    382       // If the client gets a packet without the version flag from the server
    383       // it should stop sending version since the version negotiation is done.
    384       packet_creator_.StopSendingVersion();
    385       version_negotiation_state_ = NEGOTIATED_VERSION;
    386     }
    387   }
    388 
    389   DCHECK_EQ(NEGOTIATED_VERSION, version_negotiation_state_);
    390 
    391   --stats_.packets_dropped;
    392   DVLOG(1) << ENDPOINT << "Received packet header: " << header;
    393   last_header_ = header;
    394   DCHECK(connected_);
    395   return true;
    396 }
    397 
    398 void QuicConnection::OnFecProtectedPayload(StringPiece payload) {
    399   DCHECK_EQ(IN_FEC_GROUP, last_header_.is_in_fec_group);
    400   DCHECK_NE(0u, last_header_.fec_group);
    401   QuicFecGroup* group = GetFecGroup();
    402   if (group != NULL) {
    403     group->Update(last_header_, payload);
    404   }
    405 }
    406 
    407 bool QuicConnection::OnStreamFrame(const QuicStreamFrame& frame) {
    408   DCHECK(connected_);
    409   if (debug_visitor_) {
    410     debug_visitor_->OnStreamFrame(frame);
    411   }
    412   last_stream_frames_.push_back(frame);
    413   return true;
    414 }
    415 
    416 bool QuicConnection::OnAckFrame(const QuicAckFrame& incoming_ack) {
    417   DCHECK(connected_);
    418   if (debug_visitor_) {
    419     debug_visitor_->OnAckFrame(incoming_ack);
    420   }
    421   DVLOG(1) << ENDPOINT << "OnAckFrame: " << incoming_ack;
    422 
    423   if (last_header_.packet_sequence_number <= largest_seen_packet_with_ack_) {
    424     DLOG(INFO) << ENDPOINT << "Received an old ack frame: ignoring";
    425     return true;
    426   }
    427 
    428   if (!ValidateAckFrame(incoming_ack)) {
    429     SendConnectionClose(QUIC_INVALID_ACK_DATA);
    430     return false;
    431   }
    432   last_ack_frames_.push_back(incoming_ack);
    433   return connected_;
    434 }
    435 
    436 void QuicConnection::ProcessAckFrame(const QuicAckFrame& incoming_ack) {
    437   largest_seen_packet_with_ack_ = last_header_.packet_sequence_number;
    438 
    439   received_truncated_ack_ =
    440       incoming_ack.received_info.missing_packets.size() >=
    441       QuicFramer::GetMaxUnackedPackets(last_header_);
    442 
    443   received_packet_manager_.UpdatePacketInformationReceivedByPeer(incoming_ack);
    444   received_packet_manager_.UpdatePacketInformationSentByPeer(incoming_ack);
    445   // Possibly close any FecGroups which are now irrelevant.
    446   CloseFecGroupsBefore(incoming_ack.sent_info.least_unacked + 1);
    447 
    448   sent_entropy_manager_.ClearEntropyBefore(
    449       received_packet_manager_.least_packet_awaited_by_peer() - 1);
    450 
    451   SequenceNumberSet acked_packets;
    452   HandleAckForSentPackets(incoming_ack, &acked_packets);
    453   HandleAckForSentFecPackets(incoming_ack, &acked_packets);
    454   if (acked_packets.size() > 0) {
    455     visitor_->OnAck(acked_packets);
    456   }
    457   congestion_manager_.OnIncomingAckFrame(incoming_ack,
    458                                          time_of_last_received_packet_);
    459 }
    460 
    461 bool QuicConnection::OnCongestionFeedbackFrame(
    462     const QuicCongestionFeedbackFrame& feedback) {
    463   DCHECK(connected_);
    464   if (debug_visitor_) {
    465     debug_visitor_->OnCongestionFeedbackFrame(feedback);
    466   }
    467   last_congestion_frames_.push_back(feedback);
    468   return connected_;
    469 }
    470 
    471 bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) {
    472   if (incoming_ack.received_info.largest_observed >
    473       packet_creator_.sequence_number()) {
    474     DLOG(ERROR) << ENDPOINT << "Peer's observed unsent packet:"
    475                 << incoming_ack.received_info.largest_observed << " vs "
    476                 << packet_creator_.sequence_number();
    477     // We got an error for data we have not sent.  Error out.
    478     return false;
    479   }
    480 
    481   if (incoming_ack.received_info.largest_observed <
    482           received_packet_manager_.peer_largest_observed_packet()) {
    483     DLOG(ERROR) << ENDPOINT << "Peer's largest_observed packet decreased:"
    484                 << incoming_ack.received_info.largest_observed << " vs "
    485                 << received_packet_manager_.peer_largest_observed_packet();
    486     // A new ack has a diminished largest_observed value.  Error out.
    487     // If this was an old packet, we wouldn't even have checked.
    488     return false;
    489   }
    490 
    491   // We can't have too many unacked packets, or our ack frames go over
    492   // kMaxPacketSize.
    493   DCHECK_LE(incoming_ack.received_info.missing_packets.size(),
    494             QuicFramer::GetMaxUnackedPackets(last_header_));
    495 
    496   if (incoming_ack.sent_info.least_unacked <
    497       received_packet_manager_.peer_least_packet_awaiting_ack()) {
    498     DLOG(ERROR) << ENDPOINT << "Peer's sent low least_unacked: "
    499                 << incoming_ack.sent_info.least_unacked << " vs "
    500                 << received_packet_manager_.peer_least_packet_awaiting_ack();
    501     // We never process old ack frames, so this number should only increase.
    502     return false;
    503   }
    504 
    505   if (incoming_ack.sent_info.least_unacked >
    506       last_header_.packet_sequence_number) {
    507     DLOG(ERROR) << ENDPOINT << "Peer sent least_unacked:"
    508                 << incoming_ack.sent_info.least_unacked
    509                 << " greater than the enclosing packet sequence number:"
    510                 << last_header_.packet_sequence_number;
    511     return false;
    512   }
    513 
    514   if (!incoming_ack.received_info.missing_packets.empty() &&
    515       *incoming_ack.received_info.missing_packets.rbegin() >
    516       incoming_ack.received_info.largest_observed) {
    517     DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: "
    518                 << *incoming_ack.received_info.missing_packets.rbegin()
    519                 << " greater than largest observed: "
    520                 << incoming_ack.received_info.largest_observed;
    521     return false;
    522   }
    523 
    524   if (!incoming_ack.received_info.missing_packets.empty() &&
    525       *incoming_ack.received_info.missing_packets.begin() <
    526       received_packet_manager_.least_packet_awaited_by_peer()) {
    527     DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: "
    528                 << *incoming_ack.received_info.missing_packets.begin()
    529                 << "smaller than least_packet_awaited_by_peer_: "
    530                 << received_packet_manager_.least_packet_awaited_by_peer();
    531     return false;
    532   }
    533 
    534   if (!sent_entropy_manager_.IsValidEntropy(
    535           incoming_ack.received_info.largest_observed,
    536           incoming_ack.received_info.missing_packets,
    537           incoming_ack.received_info.entropy_hash)) {
    538     DLOG(ERROR) << ENDPOINT << "Peer sent invalid entropy.";
    539     return false;
    540   }
    541 
    542   return true;
    543 }
    544 
    545 void QuicConnection::HandleAckForSentPackets(const QuicAckFrame& incoming_ack,
    546                                              SequenceNumberSet* acked_packets) {
    547   int retransmitted_packets = 0;
    548   // Go through the packets we have not received an ack for and see if this
    549   // incoming_ack shows they've been seen by the peer.
    550   UnackedPacketMap::iterator it = unacked_packets_.begin();
    551   while (it != unacked_packets_.end()) {
    552     QuicPacketSequenceNumber sequence_number = it->first;
    553     if (sequence_number >
    554         received_packet_manager_.peer_largest_observed_packet()) {
    555       // These are very new sequence_numbers.
    556       break;
    557     }
    558     RetransmittableFrames* unacked = it->second;
    559     if (!IsAwaitingPacket(incoming_ack.received_info, sequence_number)) {
    560       // Packet was acked, so remove it from our unacked packet list.
    561       DVLOG(1) << ENDPOINT <<"Got an ack for packet " << sequence_number;
    562       acked_packets->insert(sequence_number);
    563       delete unacked;
    564       unacked_packets_.erase(it++);
    565       retransmission_map_.erase(sequence_number);
    566     } else {
    567       // This is a packet which we planned on retransmitting and has not been
    568       // seen at the time of this ack being sent out.  See if it's our new
    569       // lowest unacked packet.
    570       DVLOG(1) << ENDPOINT << "still missing packet " << sequence_number;
    571       ++it;
    572       // The peer got packets after this sequence number.  This is an explicit
    573       // nack.
    574       RetransmissionMap::iterator retransmission_it =
    575           retransmission_map_.find(sequence_number);
    576       ++(retransmission_it->second.number_nacks);
    577       if (retransmission_it->second.number_nacks >=
    578              kNumberOfNacksBeforeRetransmission &&
    579           retransmitted_packets < kMaxRetransmissionsPerAck) {
    580         ++retransmitted_packets;
    581         DVLOG(1) << ENDPOINT << "Trying to retransmit packet "
    582                  << sequence_number
    583                  << " as it has been nacked 3 or more times.";
    584         // RetransmitPacket will retransmit with a new sequence_number.
    585         RetransmitPacket(sequence_number);
    586       }
    587     }
    588   }
    589 }
    590 
    591 void QuicConnection::HandleAckForSentFecPackets(
    592     const QuicAckFrame& incoming_ack, SequenceNumberSet* acked_packets) {
    593   UnackedPacketMap::iterator it = unacked_fec_packets_.begin();
    594   while (it != unacked_fec_packets_.end()) {
    595     QuicPacketSequenceNumber sequence_number = it->first;
    596     if (sequence_number >
    597         received_packet_manager_.peer_largest_observed_packet()) {
    598       break;
    599     }
    600     if (!IsAwaitingPacket(incoming_ack.received_info, sequence_number)) {
    601       DVLOG(1) << ENDPOINT << "Got an ack for fec packet: " << sequence_number;
    602       acked_packets->insert(sequence_number);
    603       unacked_fec_packets_.erase(it++);
    604     } else {
    605       DVLOG(1) << ENDPOINT << "Still missing ack for fec packet: "
    606                << sequence_number;
    607       ++it;
    608     }
    609   }
    610 }
    611 
    612 void QuicConnection::OnFecData(const QuicFecData& fec) {
    613   DCHECK_EQ(IN_FEC_GROUP, last_header_.is_in_fec_group);
    614   DCHECK_NE(0u, last_header_.fec_group);
    615   QuicFecGroup* group = GetFecGroup();
    616   if (group != NULL) {
    617     group->UpdateFec(last_header_.packet_sequence_number,
    618                      last_header_.entropy_flag, fec);
    619   }
    620 }
    621 
    622 bool QuicConnection::OnRstStreamFrame(const QuicRstStreamFrame& frame) {
    623   DCHECK(connected_);
    624   if (debug_visitor_) {
    625     debug_visitor_->OnRstStreamFrame(frame);
    626   }
    627   DLOG(INFO) << ENDPOINT << "Stream reset with error "
    628              << QuicUtils::StreamErrorToString(frame.error_code);
    629   last_rst_frames_.push_back(frame);
    630   return connected_;
    631 }
    632 
    633 bool QuicConnection::OnConnectionCloseFrame(
    634     const QuicConnectionCloseFrame& frame) {
    635   DCHECK(connected_);
    636   if (debug_visitor_) {
    637     debug_visitor_->OnConnectionCloseFrame(frame);
    638   }
    639   DLOG(INFO) << ENDPOINT << "Connection closed with error "
    640              << QuicUtils::ErrorToString(frame.error_code)
    641              << " " << frame.error_details;
    642   CloseConnection(frame.error_code, true);
    643   DCHECK(!connected_);
    644   return false;
    645 }
    646 
    647 bool QuicConnection::OnGoAwayFrame(const QuicGoAwayFrame& frame) {
    648   DCHECK(connected_);
    649   DLOG(INFO) << ENDPOINT << "Go away received with error "
    650              << QuicUtils::ErrorToString(frame.error_code)
    651              << " and reason:" << frame.reason_phrase;
    652   last_goaway_frames_.push_back(frame);
    653   return connected_;
    654 }
    655 
    656 void QuicConnection::OnPacketComplete() {
    657   // Don't do anything if this packet closed the connection.
    658   if (!connected_) {
    659     ClearLastFrames();
    660     return;
    661   }
    662 
    663   DLOG(INFO) << ENDPOINT << (last_packet_revived_ ? "Revived" : "Got")
    664              << " packet " << last_header_.packet_sequence_number
    665              << " with " << last_ack_frames_.size() << " acks, "
    666              << last_congestion_frames_.size() << " congestions, "
    667              << last_goaway_frames_.size() << " goaways, "
    668              << last_rst_frames_.size() << " rsts, "
    669              << last_stream_frames_.size()
    670              << " stream frames for " << last_header_.public_header.guid;
    671   if (!last_packet_revived_) {
    672     congestion_manager_.RecordIncomingPacket(
    673         last_size_, last_header_.packet_sequence_number,
    674         time_of_last_received_packet_, last_packet_revived_);
    675   }
    676 
    677   // Must called before ack processing, because processing acks removes entries
    678   // from unacket_packets_, increasing the least_unacked.
    679   const bool last_packet_should_instigate_ack = ShouldLastPacketInstigateAck();
    680 
    681   if ((last_stream_frames_.empty() ||
    682        visitor_->OnPacket(self_address_, peer_address_,
    683                           last_header_, last_stream_frames_))) {
    684     received_packet_manager_.RecordPacketReceived(
    685         last_header_, time_of_last_received_packet_);
    686   }
    687 
    688   // Process stream resets, then acks, then congestion feedback.
    689   for (size_t i = 0; i < last_goaway_frames_.size(); ++i) {
    690     visitor_->OnGoAway(last_goaway_frames_[i]);
    691   }
    692   for (size_t i = 0; i < last_rst_frames_.size(); ++i) {
    693     visitor_->OnRstStream(last_rst_frames_[i]);
    694   }
    695   for (size_t i = 0; i < last_ack_frames_.size(); ++i) {
    696     ProcessAckFrame(last_ack_frames_[i]);
    697   }
    698   for (size_t i = 0; i < last_congestion_frames_.size(); ++i) {
    699     congestion_manager_.OnIncomingQuicCongestionFeedbackFrame(
    700         last_congestion_frames_[i], time_of_last_received_packet_);
    701   }
    702 
    703   MaybeSendInResponseToPacket(last_packet_should_instigate_ack);
    704 
    705   ClearLastFrames();
    706 }
    707 
    708 void QuicConnection::ClearLastFrames() {
    709   last_stream_frames_.clear();
    710   last_goaway_frames_.clear();
    711   last_rst_frames_.clear();
    712   last_ack_frames_.clear();
    713   last_congestion_frames_.clear();
    714 }
    715 
    716 QuicAckFrame* QuicConnection::CreateAckFrame() {
    717   QuicAckFrame* outgoing_ack = new QuicAckFrame();
    718   received_packet_manager_.UpdateReceivedPacketInfo(
    719       &(outgoing_ack->received_info), clock_->ApproximateNow());
    720   UpdateSentPacketInfo(&(outgoing_ack->sent_info));
    721   DVLOG(1) << ENDPOINT << "Creating ack frame: " << *outgoing_ack;
    722   return outgoing_ack;
    723 }
    724 
    725 QuicCongestionFeedbackFrame* QuicConnection::CreateFeedbackFrame() {
    726   return new QuicCongestionFeedbackFrame(outgoing_congestion_feedback_);
    727 }
    728 
    729 bool QuicConnection::ShouldLastPacketInstigateAck() {
    730   if (!last_stream_frames_.empty() ||
    731       !last_goaway_frames_.empty() ||
    732       !last_rst_frames_.empty()) {
    733     return true;
    734   }
    735 
    736   // If the peer is still waiting for a packet that we are no
    737   // longer planning to send, we should send an ack to raise
    738   // the high water mark.
    739   if (!last_ack_frames_.empty() &&
    740       !last_ack_frames_.back().received_info.missing_packets.empty() &&
    741       !unacked_packets_.empty()) {
    742     if (unacked_packets_.begin()->first >
    743         *last_ack_frames_.back().received_info.missing_packets.begin()) {
    744       return true;
    745     }
    746   }
    747 
    748   return false;
    749 }
    750 
    751 void QuicConnection::MaybeSendInResponseToPacket(
    752     bool last_packet_should_instigate_ack) {
    753   // TODO(ianswett): Better merge these two blocks to queue up an ack if
    754   // necessary, then either only send the ack or bundle it with other data.
    755   if (!last_ack_frames_.empty()) {
    756     // Now the we have received an ack, we might be able to send packets which
    757     // are queued locally, or drain streams which are blocked.
    758     QuicTime::Delta delay = congestion_manager_.TimeUntilSend(
    759         time_of_last_received_packet_, NOT_RETRANSMISSION,
    760         HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE);
    761     if (delay.IsZero()) {
    762       send_alarm_->Cancel();
    763       WriteIfNotBlocked();
    764     } else if (!delay.IsInfinite()) {
    765       send_alarm_->Cancel();
    766       send_alarm_->Set(time_of_last_received_packet_.Add(delay));
    767     }
    768   }
    769 
    770   if (!last_packet_should_instigate_ack) {
    771     return;
    772   }
    773 
    774   if (send_ack_in_response_to_packet_) {
    775     SendAck();
    776   } else if (!last_stream_frames_.empty()) {
    777     // TODO(alyssar) this case should really be "if the packet contained any
    778     // non-ack frame", rather than "if the packet contained a stream frame"
    779     if (!ack_alarm_->IsSet()) {
    780       ack_alarm_->Set(clock_->ApproximateNow().Add(
    781           congestion_manager_.DefaultRetransmissionTime()));
    782     }
    783   }
    784   send_ack_in_response_to_packet_ = !send_ack_in_response_to_packet_;
    785 }
    786 
    787 void QuicConnection::SendVersionNegotiationPacket() {
    788   QuicVersionVector supported_versions;
    789   for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) {
    790     supported_versions.push_back(kSupportedQuicVersions[i]);
    791   }
    792   QuicEncryptedPacket* encrypted =
    793       packet_creator_.SerializeVersionNegotiationPacket(supported_versions);
    794   // TODO(satyamshekhar): implement zero server state negotiation.
    795   int error;
    796   helper_->WritePacketToWire(*encrypted, &error);
    797   delete encrypted;
    798 }
    799 
    800 QuicConsumedData QuicConnection::SendStreamData(QuicStreamId id,
    801                                                 StringPiece data,
    802                                                 QuicStreamOffset offset,
    803                                                 bool fin) {
    804   return packet_generator_.ConsumeData(id, data, offset, fin);
    805 }
    806 
    807 void QuicConnection::SendRstStream(QuicStreamId id,
    808                                    QuicRstStreamErrorCode error) {
    809   packet_generator_.AddControlFrame(
    810       QuicFrame(new QuicRstStreamFrame(id, error)));
    811 }
    812 
    813 const QuicConnectionStats& QuicConnection::GetStats() {
    814   // Update rtt and estimated bandwidth.
    815   stats_.rtt = congestion_manager_.SmoothedRtt().ToMicroseconds();
    816   stats_.estimated_bandwidth =
    817       congestion_manager_.BandwidthEstimate().ToBytesPerSecond();
    818   return stats_;
    819 }
    820 
    821 void QuicConnection::ProcessUdpPacket(const IPEndPoint& self_address,
    822                                       const IPEndPoint& peer_address,
    823                                       const QuicEncryptedPacket& packet) {
    824   if (!connected_) {
    825     return;
    826   }
    827   if (debug_visitor_) {
    828     debug_visitor_->OnPacketReceived(self_address, peer_address, packet);
    829   }
    830   last_packet_revived_ = false;
    831   last_size_ = packet.length();
    832 
    833   address_migrating_ = false;
    834 
    835   if (peer_address_.address().empty()) {
    836     peer_address_ = peer_address;
    837   }
    838   if (self_address_.address().empty()) {
    839     self_address_ = self_address;
    840   }
    841 
    842   if (!(peer_address == peer_address_ && self_address == self_address_)) {
    843     address_migrating_ = true;
    844   }
    845 
    846   stats_.bytes_received += packet.length();
    847   ++stats_.packets_received;
    848 
    849   if (!framer_.ProcessPacket(packet)) {
    850     // If we are unable to decrypt this packet, it might be
    851     // because the CHLO or SHLO packet was lost.
    852     if (encryption_level_ != ENCRYPTION_FORWARD_SECURE &&
    853         framer_.error() == QUIC_DECRYPTION_FAILURE &&
    854         undecryptable_packets_.size() < kMaxUndecryptablePackets) {
    855       QueueUndecryptablePacket(packet);
    856     }
    857     DVLOG(1) << ENDPOINT << "Unable to process packet.  Last packet processed: "
    858              << last_header_.packet_sequence_number;
    859     return;
    860   }
    861   MaybeProcessUndecryptablePackets();
    862   MaybeProcessRevivedPacket();
    863 }
    864 
    865 bool QuicConnection::OnCanWrite() {
    866   write_blocked_ = false;
    867   return DoWrite();
    868 }
    869 
    870 bool QuicConnection::WriteIfNotBlocked() {
    871   if (write_blocked_) {
    872     return false;
    873   }
    874   return DoWrite();
    875 }
    876 
    877 bool QuicConnection::DoWrite() {
    878   DCHECK(!write_blocked_);
    879   WriteQueuedPackets();
    880 
    881   // Sending queued packets may have caused the socket to become write blocked,
    882   // or the congestion manager to prohibit sending.  If we've sent everything
    883   // we had queued and we're still not blocked, let the visitor know it can
    884   // write more.
    885   if (CanWrite(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA,
    886                NOT_HANDSHAKE)) {
    887     packet_generator_.StartBatchOperations();
    888     bool all_bytes_written = visitor_->OnCanWrite();
    889     packet_generator_.FinishBatchOperations();
    890 
    891     // After the visitor writes, it may have caused the socket to become write
    892     // blocked or the congestion manager to prohibit sending, so check again.
    893     if (!write_blocked_ && !all_bytes_written &&
    894         CanWrite(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA,
    895                  NOT_HANDSHAKE)) {
    896       // We're not write blocked, but some stream didn't write out all of its
    897       // bytes.  Register for 'immediate' resumption so we'll keep writing after
    898       // other quic connections have had a chance to use the socket.
    899       send_alarm_->Cancel();
    900       send_alarm_->Set(clock_->ApproximateNow());
    901     }
    902   }
    903 
    904   return !write_blocked_;
    905 }
    906 
    907 bool QuicConnection::ProcessValidatedPacket() {
    908   if (address_migrating_) {
    909     SendConnectionCloseWithDetails(
    910         QUIC_ERROR_MIGRATING_ADDRESS,
    911         "Address migration is not yet a supported feature");
    912     return false;
    913   }
    914   time_of_last_received_packet_ = clock_->Now();
    915   DVLOG(1) << ENDPOINT << "time of last received packet: "
    916            << time_of_last_received_packet_.ToDebuggingValue();
    917   return true;
    918 }
    919 
    920 bool QuicConnection::WriteQueuedPackets() {
    921   DCHECK(!write_blocked_);
    922 
    923   size_t num_queued_packets = queued_packets_.size() + 1;
    924   QueuedPacketList::iterator packet_iterator = queued_packets_.begin();
    925   while (!write_blocked_ && packet_iterator != queued_packets_.end()) {
    926     // Ensure that from one iteration of this loop to the next we
    927     // succeeded in sending a packet so we don't infinitely loop.
    928     // TODO(rch): clean up and close the connection if we really hit this.
    929     DCHECK_LT(queued_packets_.size(), num_queued_packets);
    930     num_queued_packets = queued_packets_.size();
    931     if (WritePacket(packet_iterator->encryption_level,
    932                     packet_iterator->sequence_number,
    933                     packet_iterator->packet,
    934                     packet_iterator->retransmittable,
    935                     NO_FORCE)) {
    936       packet_iterator = queued_packets_.erase(packet_iterator);
    937     } else {
    938       // Continue, because some queued packets may still be writable.
    939       // This can happen if a retransmit send fail.
    940       ++packet_iterator;
    941     }
    942   }
    943 
    944   return !write_blocked_;
    945 }
    946 
    947 bool QuicConnection::MaybeRetransmitPacketForRTO(
    948     QuicPacketSequenceNumber sequence_number) {
    949   DCHECK_EQ(ContainsKey(unacked_packets_, sequence_number),
    950             ContainsKey(retransmission_map_, sequence_number));
    951 
    952   if (!ContainsKey(unacked_packets_, sequence_number)) {
    953     DVLOG(2) << ENDPOINT << "alarm fired for " << sequence_number
    954              << " but it has been acked or already retransmitted with"
    955              << " different sequence number.";
    956     // So no extra delay is added for this packet.
    957     return true;
    958   }
    959 
    960   RetransmissionMap::iterator retransmission_it =
    961       retransmission_map_.find(sequence_number);
    962   // If the packet hasn't been acked and we're getting truncated acks, ignore
    963   // any RTO for packets larger than the peer's largest observed packet; it may
    964   // have been received by the peer and just wasn't acked due to the ack frame
    965   // running out of space.
    966   if (received_truncated_ack_ && sequence_number >
    967       received_packet_manager_.peer_largest_observed_packet() &&
    968       // We allow retransmission of already retransmitted packets so that we
    969       // retransmit packets that were retransmissions of the packet with
    970       // sequence number < the largest observed field of the truncated ack.
    971       retransmission_it->second.number_retransmissions == 0) {
    972     return false;
    973   } else {
    974     ++stats_.rto_count;
    975     RetransmitPacket(sequence_number);
    976     return true;
    977   }
    978 }
    979 
    980 void QuicConnection::RetransmitUnackedPackets(
    981     RetransmissionType retransmission_type) {
    982   if (unacked_packets_.empty()) {
    983     return;
    984   }
    985   UnackedPacketMap::iterator next_it = unacked_packets_.begin();
    986   QuicPacketSequenceNumber end_sequence_number =
    987       unacked_packets_.rbegin()->first;
    988   do {
    989     UnackedPacketMap::iterator current_it = next_it;
    990     ++next_it;
    991 
    992     if (retransmission_type == ALL_PACKETS ||
    993         current_it->second->encryption_level() == ENCRYPTION_INITIAL) {
    994       // TODO(satyamshekhar): Think about congestion control here.
    995       // Specifically, about the retransmission count of packets being sent
    996       // proactively to achieve 0 (minimal) RTT.
    997       RetransmitPacket(current_it->first);
    998     }
    999   } while (next_it != unacked_packets_.end() &&
   1000            next_it->first <= end_sequence_number);
   1001 }
   1002 
   1003 void QuicConnection::RetransmitPacket(
   1004     QuicPacketSequenceNumber sequence_number) {
   1005   UnackedPacketMap::iterator unacked_it =
   1006       unacked_packets_.find(sequence_number);
   1007   RetransmissionMap::iterator retransmission_it =
   1008       retransmission_map_.find(sequence_number);
   1009   // There should always be an entry corresponding to |sequence_number| in
   1010   // both |retransmission_map_| and |unacked_packets_|. Retransmissions due to
   1011   // RTO for sequence numbers that are already acked or retransmitted are
   1012   // ignored by MaybeRetransmitPacketForRTO.
   1013   DCHECK(unacked_it != unacked_packets_.end());
   1014   DCHECK(retransmission_it != retransmission_map_.end());
   1015   RetransmittableFrames* unacked = unacked_it->second;
   1016   // TODO(pwestin): Need to fix potential issue with FEC and a 1 packet
   1017   // congestion window see b/8331807 for details.
   1018   congestion_manager_.AbandoningPacket(sequence_number);
   1019 
   1020   // Re-packetize the frames with a new sequence number for retransmission.
   1021   // Retransmitted data packets do not use FEC, even when it's enabled.
   1022   SerializedPacket serialized_packet =
   1023       packet_creator_.SerializeAllFrames(unacked->frames());
   1024   RetransmissionInfo retransmission_info(serialized_packet.sequence_number);
   1025   retransmission_info.number_retransmissions =
   1026       retransmission_it->second.number_retransmissions + 1;
   1027   // Remove info with old sequence number.
   1028   unacked_packets_.erase(unacked_it);
   1029   retransmission_map_.erase(retransmission_it);
   1030   DVLOG(1) << ENDPOINT << "Retransmitting unacked packet " << sequence_number
   1031            << " as " << serialized_packet.sequence_number;
   1032   DCHECK(unacked_packets_.empty() ||
   1033          unacked_packets_.rbegin()->first < serialized_packet.sequence_number);
   1034   unacked_packets_.insert(make_pair(serialized_packet.sequence_number,
   1035                                     unacked));
   1036   retransmission_map_.insert(make_pair(serialized_packet.sequence_number,
   1037                                        retransmission_info));
   1038   SendOrQueuePacket(unacked->encryption_level(),
   1039                     serialized_packet.sequence_number,
   1040                     serialized_packet.packet,
   1041                     serialized_packet.entropy_hash,
   1042                     HAS_RETRANSMITTABLE_DATA);
   1043 }
   1044 
   1045 bool QuicConnection::CanWrite(Retransmission retransmission,
   1046                               HasRetransmittableData retransmittable,
   1047                               IsHandshake handshake) {
   1048   // TODO(ianswett): If the packet is a retransmit, the current send alarm may
   1049   // be too long.
   1050   if (write_blocked_ || send_alarm_->IsSet()) {
   1051     return false;
   1052   }
   1053 
   1054   QuicTime now = clock_->Now();
   1055   QuicTime::Delta delay = congestion_manager_.TimeUntilSend(
   1056       now, retransmission, retransmittable, handshake);
   1057   if (delay.IsInfinite()) {
   1058     return false;
   1059   }
   1060 
   1061   // If the scheduler requires a delay, then we can not send this packet now.
   1062   if (!delay.IsZero()) {
   1063     send_alarm_->Cancel();
   1064     send_alarm_->Set(now.Add(delay));
   1065     return false;
   1066   }
   1067   return true;
   1068 }
   1069 
   1070 bool QuicConnection::IsRetransmission(
   1071     QuicPacketSequenceNumber sequence_number) {
   1072   RetransmissionMap::iterator it = retransmission_map_.find(sequence_number);
   1073   return it != retransmission_map_.end() &&
   1074       it->second.number_retransmissions > 0;
   1075 }
   1076 
   1077 void QuicConnection::SetupRetransmission(
   1078     QuicPacketSequenceNumber sequence_number,
   1079     EncryptionLevel level) {
   1080   RetransmissionMap::iterator it = retransmission_map_.find(sequence_number);
   1081   if (it == retransmission_map_.end()) {
   1082     DVLOG(1) << ENDPOINT << "Will not retransmit packet " << sequence_number;
   1083     return;
   1084   }
   1085 
   1086   RetransmissionInfo retransmission_info = it->second;
   1087   // TODO(rch): consider using a much smaller retransmisison_delay
   1088   // for the ENCRYPTION_NONE packets.
   1089   size_t effective_retransmission_count =
   1090       level == ENCRYPTION_NONE ? 0 : retransmission_info.number_retransmissions;
   1091   QuicTime::Delta retransmission_delay =
   1092       congestion_manager_.GetRetransmissionDelay(
   1093           unacked_packets_.size(),
   1094           effective_retransmission_count);
   1095 
   1096   retransmission_timeouts_.push(RetransmissionTime(
   1097       sequence_number,
   1098       clock_->ApproximateNow().Add(retransmission_delay),
   1099       false));
   1100 
   1101   // Do not set the retransmisson alarm if we're already handling the
   1102   // retransmission alarm because the retransmission alarm will be reset when
   1103   // OnRetransmissionTimeout completes.
   1104   if (!handling_retransmission_timeout_ && !retransmission_alarm_->IsSet()) {
   1105     retransmission_alarm_->Set(
   1106         clock_->ApproximateNow().Add(retransmission_delay));
   1107   }
   1108   // TODO(satyamshekhar): restore packet reordering with Ian's TODO in
   1109   // SendStreamData().
   1110 }
   1111 
   1112 void QuicConnection::SetupAbandonFecTimer(
   1113     QuicPacketSequenceNumber sequence_number) {
   1114   DCHECK(ContainsKey(unacked_fec_packets_, sequence_number));
   1115   QuicTime::Delta retransmission_delay =
   1116       QuicTime::Delta::FromMilliseconds(
   1117           congestion_manager_.DefaultRetransmissionTime().ToMilliseconds() * 3);
   1118   retransmission_timeouts_.push(RetransmissionTime(
   1119       sequence_number,
   1120       clock_->ApproximateNow().Add(retransmission_delay),
   1121       true));
   1122 }
   1123 
   1124 void QuicConnection::DropPacket(QuicPacketSequenceNumber sequence_number) {
   1125   UnackedPacketMap::iterator unacked_it =
   1126       unacked_packets_.find(sequence_number);
   1127   // Packet was not meant to be retransmitted.
   1128   if (unacked_it == unacked_packets_.end()) {
   1129     DCHECK(!ContainsKey(retransmission_map_, sequence_number));
   1130     return;
   1131   }
   1132   // Delete the unacked packet.
   1133   delete unacked_it->second;
   1134   unacked_packets_.erase(unacked_it);
   1135   retransmission_map_.erase(sequence_number);
   1136   return;
   1137 }
   1138 
   1139 bool QuicConnection::WritePacket(EncryptionLevel level,
   1140                                  QuicPacketSequenceNumber sequence_number,
   1141                                  QuicPacket* packet,
   1142                                  HasRetransmittableData retransmittable,
   1143                                  Force forced) {
   1144   if (!connected_) {
   1145     DLOG(INFO) << ENDPOINT
   1146                << "Not sending packet as connection is disconnected.";
   1147     delete packet;
   1148     // Returning true because we deleted the packet and the caller shouldn't
   1149     // delete it again.
   1150     return true;
   1151   }
   1152 
   1153   if (encryption_level_ == ENCRYPTION_FORWARD_SECURE &&
   1154       level == ENCRYPTION_NONE) {
   1155     // Drop packets that are NULL encrypted since the peer won't accept them
   1156     // anymore.
   1157     DLOG(INFO) << ENDPOINT << "Dropped packet: " << sequence_number
   1158                << " since the packet is NULL encrypted.";
   1159     DropPacket(sequence_number);
   1160     delete packet;
   1161     return true;
   1162   }
   1163 
   1164   Retransmission retransmission = IsRetransmission(sequence_number) ?
   1165       IS_RETRANSMISSION : NOT_RETRANSMISSION;
   1166   IsHandshake handshake = level == ENCRYPTION_NONE ? IS_HANDSHAKE
   1167                                                    : NOT_HANDSHAKE;
   1168 
   1169   // If we are not forced and we can't write, then simply return false;
   1170   if (forced == NO_FORCE &&
   1171       !CanWrite(retransmission, retransmittable, handshake)) {
   1172     return false;
   1173   }
   1174 
   1175   scoped_ptr<QuicEncryptedPacket> encrypted(
   1176       framer_.EncryptPacket(level, sequence_number, *packet));
   1177   DLOG(INFO) << ENDPOINT << "Sending packet number " << sequence_number
   1178              << " : " << (packet->is_fec_packet() ? "FEC " :
   1179                  (retransmittable == HAS_RETRANSMITTABLE_DATA
   1180                       ? "data bearing " : " ack only "))
   1181              << ", encryption level: "
   1182              << QuicUtils::EncryptionLevelToString(level)
   1183              << ", length:" << packet->length();
   1184   DVLOG(2) << ENDPOINT << "packet(" << sequence_number << "): " << std::endl
   1185            << QuicUtils::StringToHexASCIIDump(packet->AsStringPiece());
   1186 
   1187   DCHECK(encrypted->length() <= kMaxPacketSize)
   1188       << "Packet " << sequence_number << " will not be read; too large: "
   1189       << packet->length() << " " << encrypted->length() << " "
   1190       << " forced: " << (forced == FORCE ? "yes" : "no");
   1191 
   1192   int error;
   1193   QuicTime now = clock_->Now();
   1194   if (!retransmission) {
   1195     time_of_last_sent_packet_ = now;
   1196   }
   1197   DVLOG(1) << ENDPOINT << "time of last sent packet: "
   1198            << now.ToDebuggingValue();
   1199   if (WritePacketToWire(sequence_number, level, *encrypted, &error) == -1) {
   1200     if (helper_->IsWriteBlocked(error)) {
   1201       // TODO(satyashekhar): It might be more efficient (fewer system calls), if
   1202       // all connections share this variable i.e this becomes a part of
   1203       // PacketWriterInterface.
   1204       write_blocked_ = true;
   1205       // If the socket buffers the the data, then the packet should not
   1206       // be queued and sent again, which would result in an unnecessary
   1207       // duplicate packet being sent.
   1208       return helper_->IsWriteBlockedDataBuffered();
   1209     }
   1210     // We can't send an error as the socket is presumably borked.
   1211     CloseConnection(QUIC_PACKET_WRITE_ERROR, false);
   1212     return false;
   1213   }
   1214 
   1215   // Set the retransmit alarm only when we have sent the packet to the client
   1216   // and not when it goes to the pending queue, otherwise we will end up adding
   1217   // an entry to retransmission_timeout_ every time we attempt a write.
   1218   if (retransmittable == HAS_RETRANSMITTABLE_DATA) {
   1219     SetupRetransmission(sequence_number, level);
   1220   } else if (packet->is_fec_packet()) {
   1221     SetupAbandonFecTimer(sequence_number);
   1222   }
   1223 
   1224   congestion_manager_.SentPacket(sequence_number, now, packet->length(),
   1225                                  retransmission);
   1226 
   1227   stats_.bytes_sent += encrypted->length();
   1228   ++stats_.packets_sent;
   1229 
   1230   if (retransmission == IS_RETRANSMISSION) {
   1231     stats_.bytes_retransmitted += encrypted->length();
   1232     ++stats_.packets_retransmitted;
   1233   }
   1234 
   1235   delete packet;
   1236   return true;
   1237 }
   1238 
   1239 int QuicConnection::WritePacketToWire(QuicPacketSequenceNumber sequence_number,
   1240                                       EncryptionLevel level,
   1241                                       const QuicEncryptedPacket& packet,
   1242                                       int* error) {
   1243   int bytes_written = helper_->WritePacketToWire(packet, error);
   1244   if (debug_visitor_) {
   1245     // WritePacketToWire returned -1, then |error| will be populated with
   1246     // an error code, which we want to pass along to the visitor.
   1247     debug_visitor_->OnPacketSent(sequence_number, level, packet,
   1248                                  bytes_written == -1 ? *error : bytes_written);
   1249   }
   1250   return bytes_written;
   1251 }
   1252 
   1253 bool QuicConnection::OnSerializedPacket(
   1254     const SerializedPacket& serialized_packet) {
   1255   if (serialized_packet.retransmittable_frames != NULL) {
   1256     DCHECK(unacked_packets_.empty() ||
   1257            unacked_packets_.rbegin()->first <
   1258                serialized_packet.sequence_number);
   1259     // Retransmitted frames will be sent with the same encryption level as the
   1260     // original.
   1261     serialized_packet.retransmittable_frames->set_encryption_level(
   1262         encryption_level_);
   1263     unacked_packets_.insert(
   1264         make_pair(serialized_packet.sequence_number,
   1265                   serialized_packet.retransmittable_frames));
   1266     // All unacked packets might be retransmitted.
   1267     retransmission_map_.insert(
   1268         make_pair(serialized_packet.sequence_number,
   1269                   RetransmissionInfo(serialized_packet.sequence_number)));
   1270   } else if (serialized_packet.packet->is_fec_packet()) {
   1271     unacked_fec_packets_.insert(make_pair(
   1272         serialized_packet.sequence_number,
   1273         serialized_packet.retransmittable_frames));
   1274   }
   1275   return SendOrQueuePacket(encryption_level_,
   1276                            serialized_packet.sequence_number,
   1277                            serialized_packet.packet,
   1278                            serialized_packet.entropy_hash,
   1279                            serialized_packet.retransmittable_frames != NULL ?
   1280                                HAS_RETRANSMITTABLE_DATA :
   1281                                NO_RETRANSMITTABLE_DATA);
   1282 }
   1283 
   1284 bool QuicConnection::SendOrQueuePacket(EncryptionLevel level,
   1285                                        QuicPacketSequenceNumber sequence_number,
   1286                                        QuicPacket* packet,
   1287                                        QuicPacketEntropyHash entropy_hash,
   1288                                        HasRetransmittableData retransmittable) {
   1289   sent_entropy_manager_.RecordPacketEntropyHash(sequence_number, entropy_hash);
   1290   if (!WritePacket(level, sequence_number, packet, retransmittable, NO_FORCE)) {
   1291     queued_packets_.push_back(QueuedPacket(sequence_number, packet, level,
   1292                                            retransmittable));
   1293     return false;
   1294   }
   1295   return true;
   1296 }
   1297 
   1298 bool QuicConnection::ShouldSimulateLostPacket() {
   1299   // TODO(rch): enable this
   1300   return false;
   1301   /*
   1302   return FLAGS_fake_packet_loss_percentage > 0 &&
   1303       random_->Rand32() % 100 < FLAGS_fake_packet_loss_percentage;
   1304   */
   1305 }
   1306 
   1307 void QuicConnection::UpdateSentPacketInfo(SentPacketInfo* sent_info) {
   1308   if (!unacked_packets_.empty()) {
   1309     sent_info->least_unacked = unacked_packets_.begin()->first;
   1310   } else {
   1311     // If there are no unacked packets, set the least unacked packet to
   1312     // sequence_number() + 1 since that will be the sequence number of this
   1313     // ack packet whenever it is sent.
   1314     sent_info->least_unacked = packet_creator_.sequence_number() + 1;
   1315   }
   1316   sent_info->entropy_hash = sent_entropy_manager_.EntropyHash(
   1317       sent_info->least_unacked - 1);
   1318 }
   1319 
   1320 void QuicConnection::SendAck() {
   1321   ack_alarm_->Cancel();
   1322 
   1323   // TODO(rch): delay this until the CreateFeedbackFrame
   1324   // method is invoked.  This requires changes SetShouldSendAck
   1325   // to be a no-arg method, and re-jiggering its implementation.
   1326   bool send_feedback = false;
   1327   if (congestion_manager_.GenerateCongestionFeedback(
   1328           &outgoing_congestion_feedback_)) {
   1329     DVLOG(1) << ENDPOINT << "Sending feedback "
   1330              << outgoing_congestion_feedback_;
   1331     send_feedback = true;
   1332   }
   1333 
   1334   packet_generator_.SetShouldSendAck(send_feedback);
   1335 }
   1336 
   1337 void QuicConnection::MaybeAbandonFecPacket(
   1338     QuicPacketSequenceNumber sequence_number) {
   1339   if (!ContainsKey(unacked_fec_packets_, sequence_number)) {
   1340     DVLOG(2) << ENDPOINT << "no need to abandon fec packet: "
   1341              << sequence_number << "; it's already acked'";
   1342     return;
   1343   }
   1344   congestion_manager_.AbandoningPacket(sequence_number);
   1345   // TODO(satyashekhar): Should this decrease the congestion window?
   1346 }
   1347 
   1348 QuicTime QuicConnection::OnRetransmissionTimeout() {
   1349   // This guards against registering the alarm later than we should.
   1350   //
   1351   // If we have packet A and B in the list and we call
   1352   // MaybeRetransmitPacketForRTO on A, that may trigger a call to
   1353   // SetRetransmissionAlarm if A is retransmitted as C.  In that case we
   1354   // don't want to register the alarm under SetRetransmissionAlarm; we
   1355   // want to set it to the RTO of B when we return from this function.
   1356   handling_retransmission_timeout_ = true;
   1357 
   1358   for (size_t i = 0; i < max_packets_per_retransmission_alarm_ &&
   1359            !retransmission_timeouts_.empty(); ++i) {
   1360     RetransmissionTime retransmission_time = retransmission_timeouts_.top();
   1361     DCHECK(retransmission_time.scheduled_time.IsInitialized());
   1362     if (retransmission_time.scheduled_time > clock_->ApproximateNow()) {
   1363       break;
   1364     }
   1365     retransmission_timeouts_.pop();
   1366 
   1367     if (retransmission_time.for_fec) {
   1368       MaybeAbandonFecPacket(retransmission_time.sequence_number);
   1369       continue;
   1370     } else if (
   1371         !MaybeRetransmitPacketForRTO(retransmission_time.sequence_number)) {
   1372       DLOG(INFO) << ENDPOINT << "MaybeRetransmitPacketForRTO failed: "
   1373                  << "adding an extra delay for "
   1374                  << retransmission_time.sequence_number;
   1375       retransmission_time.scheduled_time = clock_->ApproximateNow().Add(
   1376           congestion_manager_.DefaultRetransmissionTime());
   1377       retransmission_timeouts_.push(retransmission_time);
   1378     }
   1379   }
   1380 
   1381   handling_retransmission_timeout_ = false;
   1382 
   1383   if (retransmission_timeouts_.empty()) {
   1384     return QuicTime::Zero();
   1385   }
   1386 
   1387   // We have packets remaining.  Return the absolute RTO of the oldest packet
   1388   // on the list.
   1389   return retransmission_timeouts_.top().scheduled_time;
   1390 }
   1391 
   1392 void QuicConnection::SetEncrypter(EncryptionLevel level,
   1393                                   QuicEncrypter* encrypter) {
   1394   framer_.SetEncrypter(level, encrypter);
   1395 }
   1396 
   1397 const QuicEncrypter* QuicConnection::encrypter(EncryptionLevel level) const {
   1398   return framer_.encrypter(level);
   1399 }
   1400 
   1401 void QuicConnection::SetDefaultEncryptionLevel(
   1402     EncryptionLevel level) {
   1403   encryption_level_ = level;
   1404 }
   1405 
   1406 void QuicConnection::SetDecrypter(QuicDecrypter* decrypter) {
   1407   framer_.SetDecrypter(decrypter);
   1408 }
   1409 
   1410 void QuicConnection::SetAlternativeDecrypter(QuicDecrypter* decrypter,
   1411                                              bool latch_once_used) {
   1412   framer_.SetAlternativeDecrypter(decrypter, latch_once_used);
   1413 }
   1414 
   1415 const QuicDecrypter* QuicConnection::decrypter() const {
   1416   return framer_.decrypter();
   1417 }
   1418 
   1419 const QuicDecrypter* QuicConnection::alternative_decrypter() const {
   1420   return framer_.alternative_decrypter();
   1421 }
   1422 
   1423 void QuicConnection::QueueUndecryptablePacket(
   1424     const QuicEncryptedPacket& packet) {
   1425   DVLOG(1) << ENDPOINT << "Queueing undecryptable packet.";
   1426   char* data = new char[packet.length()];
   1427   memcpy(data, packet.data(), packet.length());
   1428   undecryptable_packets_.push_back(
   1429       new QuicEncryptedPacket(data, packet.length(), true));
   1430 }
   1431 
   1432 void QuicConnection::MaybeProcessUndecryptablePackets() {
   1433   if (undecryptable_packets_.empty() ||
   1434       encryption_level_ == ENCRYPTION_NONE) {
   1435     return;
   1436   }
   1437 
   1438   while (connected_ && !undecryptable_packets_.empty()) {
   1439     DVLOG(1) << ENDPOINT << "Attempting to process undecryptable packet";
   1440     QuicEncryptedPacket* packet = undecryptable_packets_.front();
   1441     if (!framer_.ProcessPacket(*packet) &&
   1442         framer_.error() == QUIC_DECRYPTION_FAILURE) {
   1443       DVLOG(1) << ENDPOINT << "Unable to process undecryptable packet...";
   1444       break;
   1445     }
   1446     DVLOG(1) << ENDPOINT << "Processed undecryptable packet!";
   1447     delete packet;
   1448     undecryptable_packets_.pop_front();
   1449   }
   1450 
   1451   // Once forward secure encryption is in use, there will be no
   1452   // new keys installed and hence any undecryptable packets will
   1453   // never be able to be decrypted.
   1454   if (encryption_level_ == ENCRYPTION_FORWARD_SECURE) {
   1455     STLDeleteElements(&undecryptable_packets_);
   1456   }
   1457 }
   1458 
   1459 void QuicConnection::MaybeProcessRevivedPacket() {
   1460   QuicFecGroup* group = GetFecGroup();
   1461   if (!connected_ || group == NULL || !group->CanRevive()) {
   1462     return;
   1463   }
   1464   QuicPacketHeader revived_header;
   1465   char revived_payload[kMaxPacketSize];
   1466   size_t len = group->Revive(&revived_header, revived_payload, kMaxPacketSize);
   1467   revived_header.public_header.guid = guid_;
   1468   revived_header.public_header.version_flag = false;
   1469   revived_header.public_header.reset_flag = false;
   1470   revived_header.fec_flag = false;
   1471   revived_header.is_in_fec_group = NOT_IN_FEC_GROUP;
   1472   revived_header.fec_group = 0;
   1473   group_map_.erase(last_header_.fec_group);
   1474   delete group;
   1475 
   1476   last_packet_revived_ = true;
   1477   if (debug_visitor_) {
   1478     debug_visitor_->OnRevivedPacket(revived_header,
   1479                                     StringPiece(revived_payload, len));
   1480   }
   1481 
   1482   ++stats_.packets_revived;
   1483   framer_.ProcessRevivedPacket(&revived_header,
   1484                                StringPiece(revived_payload, len));
   1485 }
   1486 
   1487 QuicFecGroup* QuicConnection::GetFecGroup() {
   1488   QuicFecGroupNumber fec_group_num = last_header_.fec_group;
   1489   if (fec_group_num == 0) {
   1490     return NULL;
   1491   }
   1492   if (group_map_.count(fec_group_num) == 0) {
   1493     if (group_map_.size() >= kMaxFecGroups) {  // Too many groups
   1494       if (fec_group_num < group_map_.begin()->first) {
   1495         // The group being requested is a group we've seen before and deleted.
   1496         // Don't recreate it.
   1497         return NULL;
   1498       }
   1499       // Clear the lowest group number.
   1500       delete group_map_.begin()->second;
   1501       group_map_.erase(group_map_.begin());
   1502     }
   1503     group_map_[fec_group_num] = new QuicFecGroup();
   1504   }
   1505   return group_map_[fec_group_num];
   1506 }
   1507 
   1508 void QuicConnection::SendConnectionClose(QuicErrorCode error) {
   1509   SendConnectionCloseWithDetails(error, string());
   1510 }
   1511 
   1512 void QuicConnection::SendConnectionClosePacket(QuicErrorCode error,
   1513                                                const string& details) {
   1514   DLOG(INFO) << ENDPOINT << "Force closing with error "
   1515              << QuicUtils::ErrorToString(error) << " (" << error << ") "
   1516              << details;
   1517   QuicConnectionCloseFrame frame;
   1518   frame.error_code = error;
   1519   frame.error_details = details;
   1520   UpdateSentPacketInfo(&frame.ack_frame.sent_info);
   1521   received_packet_manager_.UpdateReceivedPacketInfo(
   1522       &frame.ack_frame.received_info, clock_->ApproximateNow());
   1523 
   1524   SerializedPacket serialized_packet =
   1525       packet_creator_.SerializeConnectionClose(&frame);
   1526 
   1527   // We need to update the sent entropy hash for all sent packets.
   1528   sent_entropy_manager_.RecordPacketEntropyHash(
   1529       serialized_packet.sequence_number,
   1530       serialized_packet.entropy_hash);
   1531 
   1532   if (!WritePacket(encryption_level_,
   1533                    serialized_packet.sequence_number,
   1534                    serialized_packet.packet,
   1535                    serialized_packet.retransmittable_frames != NULL ?
   1536                        HAS_RETRANSMITTABLE_DATA : NO_RETRANSMITTABLE_DATA,
   1537                    FORCE)) {
   1538     delete serialized_packet.packet;
   1539   }
   1540 }
   1541 
   1542 void QuicConnection::SendConnectionCloseWithDetails(QuicErrorCode error,
   1543                                                     const string& details) {
   1544   if (!write_blocked_) {
   1545     SendConnectionClosePacket(error, details);
   1546   }
   1547   CloseConnection(error, false);
   1548 }
   1549 
   1550 void QuicConnection::CloseConnection(QuicErrorCode error, bool from_peer) {
   1551   DCHECK(connected_);
   1552   connected_ = false;
   1553   visitor_->ConnectionClose(error, from_peer);
   1554 }
   1555 
   1556 void QuicConnection::SendGoAway(QuicErrorCode error,
   1557                                 QuicStreamId last_good_stream_id,
   1558                                 const string& reason) {
   1559   DLOG(INFO) << ENDPOINT << "Going away with error "
   1560              << QuicUtils::ErrorToString(error)
   1561              << " (" << error << ")";
   1562   packet_generator_.AddControlFrame(
   1563       QuicFrame(new QuicGoAwayFrame(error, last_good_stream_id, reason)));
   1564 }
   1565 
   1566 void QuicConnection::CloseFecGroupsBefore(
   1567     QuicPacketSequenceNumber sequence_number) {
   1568   FecGroupMap::iterator it = group_map_.begin();
   1569   while (it != group_map_.end()) {
   1570     // If this is the current group or the group doesn't protect this packet
   1571     // we can ignore it.
   1572     if (last_header_.fec_group == it->first ||
   1573         !it->second->ProtectsPacketsBefore(sequence_number)) {
   1574       ++it;
   1575       continue;
   1576     }
   1577     QuicFecGroup* fec_group = it->second;
   1578     DCHECK(!fec_group->CanRevive());
   1579     FecGroupMap::iterator next = it;
   1580     ++next;
   1581     group_map_.erase(it);
   1582     delete fec_group;
   1583     it = next;
   1584   }
   1585 }
   1586 
   1587 bool QuicConnection::HasQueuedData() const {
   1588   return !queued_packets_.empty() || packet_generator_.HasQueuedFrames();
   1589 }
   1590 
   1591 void QuicConnection::SetIdleNetworkTimeout(QuicTime::Delta timeout) {
   1592   if (timeout < idle_network_timeout_) {
   1593     idle_network_timeout_ = timeout;
   1594     CheckForTimeout();
   1595   } else {
   1596      idle_network_timeout_ = timeout;
   1597   }
   1598 }
   1599 
   1600 void QuicConnection::SetOverallConnectionTimeout(QuicTime::Delta timeout) {
   1601   if (timeout < overall_connection_timeout_) {
   1602     overall_connection_timeout_ = timeout;
   1603     CheckForTimeout();
   1604   } else {
   1605     overall_connection_timeout_ = timeout;
   1606   }
   1607 }
   1608 
   1609 bool QuicConnection::CheckForTimeout() {
   1610   QuicTime now = clock_->ApproximateNow();
   1611   QuicTime time_of_last_packet = std::max(time_of_last_received_packet_,
   1612                                           time_of_last_sent_packet_);
   1613 
   1614   // |delta| can be < 0 as |now| is approximate time but |time_of_last_packet|
   1615   // is accurate time. However, this should not change the behavior of
   1616   // timeout handling.
   1617   QuicTime::Delta delta = now.Subtract(time_of_last_packet);
   1618   DVLOG(1) << ENDPOINT << "last packet "
   1619            << time_of_last_packet.ToDebuggingValue()
   1620            << " now:" << now.ToDebuggingValue()
   1621            << " delta:" << delta.ToMicroseconds()
   1622            << " network_timeout: " << idle_network_timeout_.ToMicroseconds();
   1623   if (delta >= idle_network_timeout_) {
   1624     DVLOG(1) << ENDPOINT << "Connection timedout due to no network activity.";
   1625     SendConnectionClose(QUIC_CONNECTION_TIMED_OUT);
   1626     return true;
   1627   }
   1628 
   1629   // Next timeout delta.
   1630   QuicTime::Delta timeout = idle_network_timeout_.Subtract(delta);
   1631 
   1632   if (!overall_connection_timeout_.IsInfinite()) {
   1633     QuicTime::Delta connected_time = now.Subtract(creation_time_);
   1634     DVLOG(1) << ENDPOINT << "connection time: "
   1635              << connected_time.ToMilliseconds() << " overall timeout: "
   1636              << overall_connection_timeout_.ToMilliseconds();
   1637     if (connected_time >= overall_connection_timeout_) {
   1638       DVLOG(1) << ENDPOINT <<
   1639           "Connection timedout due to overall connection timeout.";
   1640       SendConnectionClose(QUIC_CONNECTION_TIMED_OUT);
   1641       return true;
   1642     }
   1643 
   1644     // Take the min timeout.
   1645     QuicTime::Delta connection_timeout =
   1646         overall_connection_timeout_.Subtract(connected_time);
   1647     if (connection_timeout < timeout) {
   1648       timeout = connection_timeout;
   1649     }
   1650   }
   1651 
   1652   timeout_alarm_->Cancel();
   1653   timeout_alarm_->Set(clock_->ApproximateNow().Add(timeout));
   1654   return false;
   1655 }
   1656 
   1657 }  // namespace net
   1658