| 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 |