| OLD | NEW |
| (Empty) | |
| 1 // Copyright (c) 2013 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_sent_packet_manager.h" |
| 6 |
| 7 #include "base/logging.h" |
| 8 #include "base/stl_util.h" |
| 9 |
| 10 using std::make_pair; |
| 11 |
| 12 namespace net { |
| 13 |
| 14 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") |
| 15 |
| 16 QuicSentPacketManager::HelperInterface::~HelperInterface() { |
| 17 } |
| 18 |
| 19 QuicSentPacketManager::QuicSentPacketManager(bool is_server, |
| 20 HelperInterface* helper) |
| 21 : is_server_(is_server), |
| 22 helper_(helper) { |
| 23 } |
| 24 |
| 25 QuicSentPacketManager::~QuicSentPacketManager() { |
| 26 STLDeleteValues(&unacked_packets_); |
| 27 } |
| 28 |
| 29 void QuicSentPacketManager::OnSerializedPacket( |
| 30 const SerializedPacket& serialized_packet) { |
| 31 if (serialized_packet.packet->is_fec_packet()) { |
| 32 unacked_fec_packets_.insert(make_pair( |
| 33 serialized_packet.sequence_number, |
| 34 serialized_packet.retransmittable_frames)); |
| 35 return; |
| 36 } |
| 37 |
| 38 if (serialized_packet.retransmittable_frames == NULL) { |
| 39 // Don't track ack/congestion feedback packets. |
| 40 return; |
| 41 } |
| 42 |
| 43 DCHECK(unacked_packets_.empty() || |
| 44 unacked_packets_.rbegin()->first < |
| 45 serialized_packet.sequence_number); |
| 46 unacked_packets_[serialized_packet.sequence_number] = |
| 47 serialized_packet.retransmittable_frames; |
| 48 retransmission_map_[serialized_packet.sequence_number] = |
| 49 RetransmissionInfo(serialized_packet.sequence_number, |
| 50 serialized_packet.sequence_number_length); |
| 51 } |
| 52 |
| 53 void QuicSentPacketManager::OnRetransmittedPacket( |
| 54 QuicPacketSequenceNumber old_sequence_number, |
| 55 QuicPacketSequenceNumber new_sequence_number) { |
| 56 DCHECK(ContainsKey(unacked_packets_, old_sequence_number)); |
| 57 DCHECK(ContainsKey(retransmission_map_, old_sequence_number)); |
| 58 DCHECK(unacked_packets_.empty() || |
| 59 unacked_packets_.rbegin()->first < new_sequence_number); |
| 60 |
| 61 RetransmissionInfo retransmission_info( |
| 62 new_sequence_number, GetSequenceNumberLength(old_sequence_number)); |
| 63 retransmission_info.number_retransmissions = |
| 64 retransmission_map_[old_sequence_number].number_retransmissions + 1; |
| 65 retransmission_map_.erase(old_sequence_number); |
| 66 retransmission_map_[new_sequence_number] = retransmission_info; |
| 67 |
| 68 RetransmittableFrames* frames = unacked_packets_[old_sequence_number]; |
| 69 DCHECK(frames); |
| 70 unacked_packets_.erase(old_sequence_number); |
| 71 unacked_packets_[new_sequence_number] = frames; |
| 72 } |
| 73 |
| 74 void QuicSentPacketManager::HandleAckForSentPackets( |
| 75 const QuicAckFrame& incoming_ack, |
| 76 SequenceNumberSet* acked_packets) { |
| 77 // Go through the packets we have not received an ack for and see if this |
| 78 // incoming_ack shows they've been seen by the peer. |
| 79 UnackedPacketMap::iterator it = unacked_packets_.begin(); |
| 80 while (it != unacked_packets_.end()) { |
| 81 QuicPacketSequenceNumber sequence_number = it->first; |
| 82 if (sequence_number > helper_->GetPeerLargestObservedPacket()) { |
| 83 // These are very new sequence_numbers. |
| 84 break; |
| 85 } |
| 86 RetransmittableFrames* unacked = it->second; |
| 87 if (!IsAwaitingPacket(incoming_ack.received_info, sequence_number)) { |
| 88 // Packet was acked, so remove it from our unacked packet list. |
| 89 DVLOG(1) << ENDPOINT <<"Got an ack for packet " << sequence_number; |
| 90 acked_packets->insert(sequence_number); |
| 91 delete unacked; |
| 92 unacked_packets_.erase(it++); |
| 93 retransmission_map_.erase(sequence_number); |
| 94 } else { |
| 95 // This is a packet which we planned on retransmitting and has not been |
| 96 // seen at the time of this ack being sent out. See if it's our new |
| 97 // lowest unacked packet. |
| 98 DVLOG(1) << ENDPOINT << "still missing packet " << sequence_number; |
| 99 ++it; |
| 100 // The peer got packets after this sequence number. This is an explicit |
| 101 // nack. |
| 102 RetransmissionMap::iterator retransmission_it = |
| 103 retransmission_map_.find(sequence_number); |
| 104 if (retransmission_it == retransmission_map_.end()) { |
| 105 continue; |
| 106 } |
| 107 size_t nack_count = ++(retransmission_it->second.number_nacks); |
| 108 helper_->OnPacketNacked(sequence_number, nack_count); |
| 109 } |
| 110 } |
| 111 } |
| 112 |
| 113 void QuicSentPacketManager::HandleAckForSentFecPackets( |
| 114 const QuicAckFrame& incoming_ack, |
| 115 SequenceNumberSet* acked_packets) { |
| 116 UnackedPacketMap::iterator it = unacked_fec_packets_.begin(); |
| 117 while (it != unacked_fec_packets_.end()) { |
| 118 QuicPacketSequenceNumber sequence_number = it->first; |
| 119 if (sequence_number > helper_->GetPeerLargestObservedPacket()) { |
| 120 break; |
| 121 } |
| 122 if (!IsAwaitingPacket(incoming_ack.received_info, sequence_number)) { |
| 123 DVLOG(1) << ENDPOINT << "Got an ack for fec packet: " << sequence_number; |
| 124 acked_packets->insert(sequence_number); |
| 125 unacked_fec_packets_.erase(it++); |
| 126 } else { |
| 127 DVLOG(1) << ENDPOINT << "Still missing ack for fec packet: " |
| 128 << sequence_number; |
| 129 ++it; |
| 130 } |
| 131 } |
| 132 } |
| 133 |
| 134 void QuicSentPacketManager::DiscardPacket( |
| 135 QuicPacketSequenceNumber sequence_number) { |
| 136 UnackedPacketMap::iterator unacked_it = |
| 137 unacked_packets_.find(sequence_number); |
| 138 if (unacked_it == unacked_packets_.end()) { |
| 139 // Packet was not meant to be retransmitted. |
| 140 DCHECK(!ContainsKey(retransmission_map_, sequence_number)); |
| 141 return; |
| 142 } |
| 143 |
| 144 // Delete the unacked packet. |
| 145 delete unacked_it->second; |
| 146 unacked_packets_.erase(unacked_it); |
| 147 retransmission_map_.erase(sequence_number); |
| 148 } |
| 149 |
| 150 bool QuicSentPacketManager::IsRetransmission( |
| 151 QuicPacketSequenceNumber sequence_number) const { |
| 152 RetransmissionMap::const_iterator it = |
| 153 retransmission_map_.find(sequence_number); |
| 154 return it != retransmission_map_.end() && |
| 155 it->second.number_retransmissions > 0; |
| 156 } |
| 157 |
| 158 size_t QuicSentPacketManager::GetRetransmissionCount( |
| 159 QuicPacketSequenceNumber sequence_number) const { |
| 160 DCHECK(ContainsKey(retransmission_map_, sequence_number)); |
| 161 RetransmissionMap::const_iterator it = |
| 162 retransmission_map_.find(sequence_number); |
| 163 return it->second.number_retransmissions; |
| 164 } |
| 165 |
| 166 bool QuicSentPacketManager::IsUnacked( |
| 167 QuicPacketSequenceNumber sequence_number) const { |
| 168 return ContainsKey(unacked_packets_, sequence_number); |
| 169 } |
| 170 |
| 171 bool QuicSentPacketManager::IsFecUnacked( |
| 172 QuicPacketSequenceNumber sequence_number) const { |
| 173 return ContainsKey(unacked_fec_packets_, sequence_number); |
| 174 } |
| 175 |
| 176 const RetransmittableFrames& QuicSentPacketManager::GetRetransmittableFrames( |
| 177 QuicPacketSequenceNumber sequence_number) const { |
| 178 DCHECK(ContainsKey(unacked_packets_, sequence_number)); |
| 179 DCHECK(ContainsKey(retransmission_map_, sequence_number)); |
| 180 |
| 181 return *unacked_packets_.find(sequence_number)->second; |
| 182 } |
| 183 |
| 184 QuicSequenceNumberLength QuicSentPacketManager::GetSequenceNumberLength( |
| 185 QuicPacketSequenceNumber sequence_number) const { |
| 186 DCHECK(ContainsKey(unacked_packets_, sequence_number)); |
| 187 DCHECK(ContainsKey(retransmission_map_, sequence_number)); |
| 188 |
| 189 return retransmission_map_.find( |
| 190 sequence_number)->second.sequence_number_length; |
| 191 } |
| 192 |
| 193 bool QuicSentPacketManager::HasUnackedPackets() const { |
| 194 return !unacked_packets_.empty(); |
| 195 } |
| 196 |
| 197 size_t QuicSentPacketManager::GetNumUnackedPackets() const { |
| 198 return unacked_packets_.size(); |
| 199 } |
| 200 |
| 201 QuicPacketSequenceNumber |
| 202 QuicSentPacketManager::GetLeastUnackedSentPacket() const { |
| 203 if (unacked_packets_.empty()) { |
| 204 // If there are no unacked packets, set the least unacked packet to |
| 205 // the sequence number of the next packet sent. |
| 206 return helper_->GetNextPacketSequenceNumber(); |
| 207 } |
| 208 |
| 209 return unacked_packets_.begin()->first; |
| 210 } |
| 211 |
| 212 SequenceNumberSet QuicSentPacketManager::GetUnackedPackets() const { |
| 213 SequenceNumberSet unacked_packets; |
| 214 for (UnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
| 215 it != unacked_packets_.end(); ++it) { |
| 216 unacked_packets.insert(it->first); |
| 217 } |
| 218 return unacked_packets; |
| 219 } |
| 220 |
| 221 } // namespace net |
| OLD | NEW |