• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
largest_sent_packet()58   QuicPacketSequenceNumber largest_sent_packet() const {
59     return largest_sent_packet_;
60   }
61 
62   // Returns the sum of bytes from all packets in flight.
bytes_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 
begin()89   const_iterator begin() const { return unacked_packets_.begin(); }
end()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