Home | History | Annotate | Download | only in quic
      1 // Copyright 2014 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 #ifndef NET_QUIC_QUIC_UNACKED_PACKET_MAP_H_
      6 #define NET_QUIC_QUIC_UNACKED_PACKET_MAP_H_
      7 
      8 #include "net/base/linked_hash_map.h"
      9 #include "net/quic/quic_protocol.h"
     10 
     11 namespace net {
     12 
     13 // Class which tracks unacked packets for three purposes:
     14 // 1) Track retransmittable data, including multiple transmissions of frames.
     15 // 2) Track packets and bytes in flight for congestion control.
     16 // 3) Track sent time of packets to provide RTT measurements from acks.
     17 class NET_EXPORT_PRIVATE QuicUnackedPacketMap {
     18  public:
     19   QuicUnackedPacketMap();
     20   ~QuicUnackedPacketMap();
     21 
     22   // Adds |serialized_packet| to the map.  Does not mark it in flight.
     23   void AddPacket(const SerializedPacket& serialized_packet);
     24 
     25   // Called when a packet is retransmitted with a new sequence number.
     26   // |old_sequence_number| will remain unacked, but will have no
     27   // retransmittable data associated with it. |new_sequence_number| will
     28   // be both unacked and associated with retransmittable data.
     29   void OnRetransmittedPacket(QuicPacketSequenceNumber old_sequence_number,
     30                              QuicPacketSequenceNumber new_sequence_number,
     31                              TransmissionType transmission_type);
     32 
     33   // Returns true if the packet |sequence_number| is unacked.
     34   bool IsUnacked(QuicPacketSequenceNumber sequence_number) const;
     35 
     36   // Sets the nack count to the max of the current nack count and |min_nacks|.
     37   void NackPacket(QuicPacketSequenceNumber sequence_number,
     38                   size_t min_nacks);
     39 
     40   // Marks |sequence_number| as no longer in flight.
     41   void RemoveFromInFlight(QuicPacketSequenceNumber sequence_number);
     42 
     43   // Returns true if the unacked packet |sequence_number| has retransmittable
     44   // frames.  This will return false if the packet has been acked, if a
     45   // previous transmission of this packet was ACK'd, or if this packet has been
     46   // retransmitted as with different sequence number, or if the packet never
     47   // had any retransmittable packets in the first place.
     48   bool HasRetransmittableFrames(QuicPacketSequenceNumber sequence_number) const;
     49 
     50   // Returns true if there are any unacked packets.
     51   bool HasUnackedPackets() const;
     52 
     53   // Returns true if there are any unacked packets which have retransmittable
     54   // frames.
     55   bool HasUnackedRetransmittableFrames() const;
     56 
     57   // Returns the largest sequence number that has been sent.
     58   QuicPacketSequenceNumber largest_sent_packet() const {
     59     return largest_sent_packet_;
     60   }
     61 
     62   // Returns the sum of bytes from all packets in flight.
     63   QuicByteCount bytes_in_flight() const {
     64     return bytes_in_flight_;
     65   }
     66 
     67   // Returns the smallest sequence number of a serialized packet which has not
     68   // been acked by the peer.  If there are no unacked packets, returns 0.
     69   QuicPacketSequenceNumber GetLeastUnackedSentPacket() const;
     70 
     71   // Sets a packet as sent with the sent time |sent_time|.  Marks the packet
     72   // as in flight if |set_in_flight| is true.
     73   // Packets marked as in flight are expected to be marked as missing when they
     74   // don't arrive, indicating the need for retransmission.
     75   void SetSent(QuicPacketSequenceNumber sequence_number,
     76                QuicTime sent_time,
     77                QuicByteCount bytes_sent,
     78                bool set_in_flight);
     79 
     80   // Clears up to |num_to_clear| previous transmissions in order to make room
     81   // in the ack frame for new acks.
     82   void ClearPreviousRetransmissions(size_t num_to_clear);
     83 
     84   typedef linked_hash_map<QuicPacketSequenceNumber,
     85                           TransmissionInfo> UnackedPacketMap;
     86 
     87   typedef UnackedPacketMap::const_iterator const_iterator;
     88 
     89   const_iterator begin() const { return unacked_packets_.begin(); }
     90   const_iterator end() const { return unacked_packets_.end(); }
     91 
     92   // Returns true if there are unacked packets that are in flight.
     93   bool HasInFlightPackets() const;
     94 
     95   // Returns the TransmissionInfo associated with |sequence_number|, which
     96   // must be unacked.
     97   const TransmissionInfo& GetTransmissionInfo(
     98       QuicPacketSequenceNumber sequence_number) const;
     99 
    100   // Returns the time that the last unacked packet was sent.
    101   QuicTime GetLastPacketSentTime() const;
    102 
    103   // Returns the time that the first in flight packet was sent.
    104   QuicTime GetFirstInFlightPacketSentTime() const;
    105 
    106   // Returns the number of unacked packets.
    107   size_t GetNumUnackedPackets() const;
    108 
    109   // Returns true if there are multiple packets in flight.
    110   bool HasMultipleInFlightPackets() const;
    111 
    112   // Returns true if there are any pending crypto packets.
    113   bool HasPendingCryptoPackets() const;
    114 
    115   // Removes any retransmittable frames from this transmission or an associated
    116   // transmission.  It removes now useless transmissions, and disconnects any
    117   // other packets from other transmissions.
    118   void RemoveRetransmittability(QuicPacketSequenceNumber sequence_number);
    119 
    120   // Increases the largest observed.  Any packets less or equal to
    121   // |largest_acked_packet| are discarded if they are only for the RTT purposes.
    122   void IncreaseLargestObserved(QuicPacketSequenceNumber largest_observed);
    123 
    124  private:
    125   void MaybeRemoveRetransmittableFrames(TransmissionInfo* transmission_info);
    126 
    127   // Returns true if the packet no longer has a purpose in the map.
    128   bool IsPacketUseless(UnackedPacketMap::const_iterator it) const;
    129 
    130   QuicPacketSequenceNumber largest_sent_packet_;
    131   QuicPacketSequenceNumber largest_observed_;
    132 
    133   // Newly serialized retransmittable and fec packets are added to this map,
    134   // which contains owning pointers to any contained frames.  If a packet is
    135   // retransmitted, this map will contain entries for both the old and the new
    136   // packet. The old packet's retransmittable frames entry will be NULL, while
    137   // the new packet's entry will contain the frames to retransmit.
    138   // If the old packet is acked before the new packet, then the old entry will
    139   // be removed from the map and the new entry's retransmittable frames will be
    140   // set to NULL.
    141   UnackedPacketMap unacked_packets_;
    142 
    143   size_t bytes_in_flight_;
    144   // Number of retransmittable crypto handshake packets.
    145   size_t pending_crypto_packet_count_;
    146 
    147   DISALLOW_COPY_AND_ASSIGN(QuicUnackedPacketMap);
    148 };
    149 
    150 }  // namespace net
    151 
    152 #endif  // NET_QUIC_QUIC_UNACKED_PACKET_MAP_H_
    153