OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef NET_QUIC_QUIC_SENT_PACKET_MANAGER_H_ | 5 #ifndef NET_QUIC_QUIC_SENT_PACKET_MANAGER_H_ |
6 #define NET_QUIC_QUIC_SENT_PACKET_MANAGER_H_ | 6 #define NET_QUIC_QUIC_SENT_PACKET_MANAGER_H_ |
7 | 7 |
8 #include <deque> | 8 #include <deque> |
9 #include <list> | 9 #include <list> |
10 #include <map> | 10 #include <map> |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 // If this packet has been retransmitted, information on those packets | 85 // If this packet has been retransmitted, information on those packets |
86 // will be discarded as well. | 86 // will be discarded as well. |
87 void DiscardUnackedPacket(QuicPacketSequenceNumber sequence_number); | 87 void DiscardUnackedPacket(QuicPacketSequenceNumber sequence_number); |
88 | 88 |
89 // Discards all information about fec packet |sequence_number|. | 89 // Discards all information about fec packet |sequence_number|. |
90 void DiscardFecPacket(QuicPacketSequenceNumber sequence_number); | 90 void DiscardFecPacket(QuicPacketSequenceNumber sequence_number); |
91 | 91 |
92 // Returns true if |sequence_number| is a retransmission of a packet. | 92 // Returns true if |sequence_number| is a retransmission of a packet. |
93 bool IsRetransmission(QuicPacketSequenceNumber sequence_number) const; | 93 bool IsRetransmission(QuicPacketSequenceNumber sequence_number) const; |
94 | 94 |
95 // Returns the number of times the data in the packet |sequence_number| | |
96 // has been transmitted. | |
97 size_t GetRetransmissionCount( | |
98 QuicPacketSequenceNumber sequence_number) const; | |
99 | |
100 // Returns true if the non-FEC packet |sequence_number| is unacked. | 95 // Returns true if the non-FEC packet |sequence_number| is unacked. |
101 bool IsUnacked(QuicPacketSequenceNumber sequence_number) const; | 96 bool IsUnacked(QuicPacketSequenceNumber sequence_number) const; |
102 | 97 |
103 // Returns true if the FEC packet |sequence_number| is unacked. | 98 // Returns true if the FEC packet |sequence_number| is unacked. |
104 bool IsFecUnacked(QuicPacketSequenceNumber sequence_number) const; | 99 bool IsFecUnacked(QuicPacketSequenceNumber sequence_number) const; |
105 | 100 |
106 // Returns true if the unacked packet |sequence_number| has retransmittable | 101 // Returns true if the unacked packet |sequence_number| has retransmittable |
107 // frames. This will only return false if the packet has been acked, if a | 102 // frames. This will only return false if the packet has been acked, if a |
108 // previous transmission of this packet was ACK'd, or if this packet has been | 103 // previous transmission of this packet was ACK'd, or if this packet has been |
109 // retransmitted as with different sequence number. | 104 // retransmitted as with different sequence number. |
(...skipping 14 matching lines...) Expand all Loading... |
124 | 119 |
125 // Retrieves the next pending retransmission. | 120 // Retrieves the next pending retransmission. |
126 PendingRetransmission NextPendingRetransmission(); | 121 PendingRetransmission NextPendingRetransmission(); |
127 | 122 |
128 // Returns the time the fec packet was sent. | 123 // Returns the time the fec packet was sent. |
129 QuicTime GetFecSentTime(QuicPacketSequenceNumber sequence_number) const; | 124 QuicTime GetFecSentTime(QuicPacketSequenceNumber sequence_number) const; |
130 | 125 |
131 // Returns true if there are any unacked packets. | 126 // Returns true if there are any unacked packets. |
132 bool HasUnackedPackets() const; | 127 bool HasUnackedPackets() const; |
133 | 128 |
134 // Returns the number of unacked packets. | 129 // Returns the number of unacked packets which have retransmittable frames. |
135 size_t GetNumUnackedPackets() const; | 130 size_t GetNumRetransmittablePackets() const; |
136 | 131 |
137 // Returns true if there are any unacked FEC packets. | 132 // Returns true if there are any unacked FEC packets. |
138 bool HasUnackedFecPackets() const; | 133 bool HasUnackedFecPackets() const; |
139 | 134 |
140 // Returns the smallest sequence number of a sent packet which has not been | 135 // Returns the smallest sequence number of a sent packet which has not been |
141 // acked by the peer. Excludes any packets which have been retransmitted | 136 // acked by the peer. Excludes any packets which have been retransmitted |
142 // with a new sequence number. If all packets have been acked, returns the | 137 // with a new sequence number. If all packets have been acked, returns the |
143 // sequence number of the next packet that will be sent. | 138 // sequence number of the next packet that will be sent. |
144 QuicPacketSequenceNumber GetLeastUnackedSentPacket() const; | 139 QuicPacketSequenceNumber GetLeastUnackedSentPacket() const; |
145 | 140 |
146 // Returns the smallest sequence number of a sent fec packet which has not | 141 // Returns the smallest sequence number of a sent fec packet which has not |
147 // been acked by the peer. If all packets have been acked, returns the | 142 // been acked by the peer. If all packets have been acked, returns the |
148 // sequence number of the next packet that will be sent. | 143 // sequence number of the next packet that will be sent. |
149 QuicPacketSequenceNumber GetLeastUnackedFecPacket() const; | 144 QuicPacketSequenceNumber GetLeastUnackedFecPacket() const; |
150 | 145 |
151 // Returns the set of sequence numbers of all unacked packets. | 146 // Returns the set of sequence numbers of all unacked packets. |
152 SequenceNumberSet GetUnackedPackets() const; | 147 SequenceNumberSet GetUnackedPackets() const; |
153 | 148 |
154 // Returns true if |sequence_number| is a previous transmission of packet. | 149 // Returns true if |sequence_number| is a previous transmission of packet. |
155 bool IsPreviousTransmission(QuicPacketSequenceNumber sequence_number) const; | 150 bool IsPreviousTransmission(QuicPacketSequenceNumber sequence_number) const; |
156 | 151 |
157 private: | 152 private: |
158 struct RetransmissionInfo { | 153 struct TransmissionInfo { |
159 RetransmissionInfo() {} | 154 TransmissionInfo() {} |
160 explicit RetransmissionInfo(QuicPacketSequenceNumber sequence_number, | 155 TransmissionInfo(RetransmittableFrames* retransmittable_frames, |
161 QuicSequenceNumberLength sequence_number_length) | 156 QuicSequenceNumberLength sequence_number_length) |
162 : sequence_number(sequence_number), | 157 : retransmittable_frames(retransmittable_frames), |
163 sequence_number_length(sequence_number_length), | 158 sequence_number_length(sequence_number_length) { |
164 number_nacks(0), | |
165 number_retransmissions(0) { | |
166 } | 159 } |
167 | 160 |
168 QuicPacketSequenceNumber sequence_number; | 161 RetransmittableFrames* retransmittable_frames; |
169 QuicSequenceNumberLength sequence_number_length; | 162 QuicSequenceNumberLength sequence_number_length; |
170 size_t number_nacks; | |
171 // TODO(ianswett): I believe this is now obsolete, or could at least be | |
172 // changed to a bool. | |
173 size_t number_retransmissions; | |
174 }; | 163 }; |
175 | 164 |
176 typedef linked_hash_map<QuicPacketSequenceNumber, | 165 typedef linked_hash_map<QuicPacketSequenceNumber, |
177 RetransmittableFrames*> UnackedPacketMap; | 166 TransmissionInfo> UnackedPacketMap; |
178 typedef linked_hash_map<QuicPacketSequenceNumber, | 167 typedef linked_hash_map<QuicPacketSequenceNumber, |
179 QuicTime> UnackedFecPacketMap; | 168 QuicTime> UnackedFecPacketMap; |
180 typedef linked_hash_map<QuicPacketSequenceNumber, | 169 typedef linked_hash_map<QuicPacketSequenceNumber, |
181 TransmissionType> PendingRetransmissionMap; | 170 TransmissionType> PendingRetransmissionMap; |
182 typedef base::hash_map<QuicPacketSequenceNumber, | 171 typedef base::hash_map<QuicPacketSequenceNumber, size_t> NackMap; |
183 RetransmissionInfo> RetransmissionMap; | |
184 typedef base::hash_map<QuicPacketSequenceNumber, SequenceNumberSet*> | 172 typedef base::hash_map<QuicPacketSequenceNumber, SequenceNumberSet*> |
185 PreviousTransmissionMap; | 173 PreviousTransmissionMap; |
186 | 174 |
187 // Process the incoming ack looking for newly ack'd data packets. | 175 // Process the incoming ack looking for newly ack'd data packets. |
188 void HandleAckForSentPackets(const ReceivedPacketInfo& received_info, | 176 void HandleAckForSentPackets(const ReceivedPacketInfo& received_info, |
189 bool is_truncated_ack); | 177 bool is_truncated_ack); |
190 | 178 |
191 // Process the incoming ack looking for newly ack'd FEC packets. | 179 // Process the incoming ack looking for newly ack'd FEC packets. |
192 void HandleAckForSentFecPackets(const ReceivedPacketInfo& received_info); | 180 void HandleAckForSentFecPackets(const ReceivedPacketInfo& received_info); |
193 | 181 |
(...skipping 27 matching lines...) Expand all Loading... |
221 UnackedPacketMap unacked_packets_; | 209 UnackedPacketMap unacked_packets_; |
222 | 210 |
223 // Pending fec packets that have not been acked yet. These packets need to be | 211 // Pending fec packets that have not been acked yet. These packets need to be |
224 // cleared out of the cgst_window after a timeout since FEC packets are never | 212 // cleared out of the cgst_window after a timeout since FEC packets are never |
225 // retransmitted. | 213 // retransmitted. |
226 UnackedFecPacketMap unacked_fec_packets_; | 214 UnackedFecPacketMap unacked_fec_packets_; |
227 | 215 |
228 // Pending retransmissions which have not been packetized and sent yet. | 216 // Pending retransmissions which have not been packetized and sent yet. |
229 PendingRetransmissionMap pending_retransmissions_; | 217 PendingRetransmissionMap pending_retransmissions_; |
230 | 218 |
231 // Map from sequence number to the retransmission info for a packet. | 219 // Map from sequence number to the number of nacks for the packet. |
232 // This includes the retransmission timeout, and the NACK count. Only | 220 // Only the most recent transmission of packets are present in this map. |
233 // the new transmission of a packet will have entries in this map. | 221 NackMap nack_map_; |
234 RetransmissionMap retransmission_map_; | |
235 | 222 |
236 // Map from sequence number to set of all sequence number that this packet has | 223 // Map from sequence number to set of all sequence number that this packet has |
237 // been transmitted as. If a packet has not been retransmitted, it will not | 224 // been transmitted as. If a packet has not been retransmitted, it will not |
238 // have an entry in this map. If any transmission of a packet has been acked | 225 // have an entry in this map. If any transmission of a packet has been acked |
239 // it will not have an entry in this map. | 226 // it will not have an entry in this map. |
240 PreviousTransmissionMap previous_transmissions_map_; | 227 PreviousTransmissionMap previous_transmissions_map_; |
241 | 228 |
242 // Tracks if the connection was created by the server. | 229 // Tracks if the connection was created by the server. |
243 bool is_server_; | 230 bool is_server_; |
244 | 231 |
245 HelperInterface* helper_; | 232 HelperInterface* helper_; |
246 | 233 |
247 // An AckNotifier can register to be informed when ACKs have been received for | 234 // An AckNotifier can register to be informed when ACKs have been received for |
248 // all packets that a given block of data was sent in. The AckNotifierManager | 235 // all packets that a given block of data was sent in. The AckNotifierManager |
249 // maintains the currently active notifiers. | 236 // maintains the currently active notifiers. |
250 AckNotifierManager ack_notifier_manager_; | 237 AckNotifierManager ack_notifier_manager_; |
251 | 238 |
252 DISALLOW_COPY_AND_ASSIGN(QuicSentPacketManager); | 239 DISALLOW_COPY_AND_ASSIGN(QuicSentPacketManager); |
253 }; | 240 }; |
254 | 241 |
255 } // namespace net | 242 } // namespace net |
256 | 243 |
257 #endif // NET_QUIC_QUIC_SENT_PACKET_MANAGER_H_ | 244 #endif // NET_QUIC_QUIC_SENT_PACKET_MANAGER_H_ |
OLD | NEW |