| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 #include "net/quic/quic_unacked_packet_map.h" | 5 #include "net/quic/quic_unacked_packet_map.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "net/quic/quic_connection_stats.h" | 9 #include "net/quic/quic_connection_stats.h" |
| 10 #include "net/quic/quic_utils_chromium.h" | 10 #include "net/quic/quic_utils_chromium.h" |
| 11 | 11 |
| 12 using std::max; | 12 using std::max; |
| 13 | 13 |
| 14 namespace net { | 14 namespace net { |
| 15 | 15 |
| 16 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") | |
| 17 | |
| 18 QuicUnackedPacketMap::TransmissionInfo::TransmissionInfo() | 16 QuicUnackedPacketMap::TransmissionInfo::TransmissionInfo() |
| 19 : retransmittable_frames(NULL), | 17 : retransmittable_frames(NULL), |
| 20 sequence_number_length(PACKET_1BYTE_SEQUENCE_NUMBER), | 18 sequence_number_length(PACKET_1BYTE_SEQUENCE_NUMBER), |
| 21 sent_time(QuicTime::Zero()), | 19 sent_time(QuicTime::Zero()), |
| 22 bytes_sent(0), | 20 bytes_sent(0), |
| 23 nack_count(0), | 21 nack_count(0), |
| 24 all_transmissions(NULL), | 22 all_transmissions(NULL), |
| 25 pending(false) { } | 23 pending(false) { } |
| 26 | 24 |
| 27 QuicUnackedPacketMap::TransmissionInfo::TransmissionInfo( | 25 QuicUnackedPacketMap::TransmissionInfo::TransmissionInfo( |
| (...skipping 18 matching lines...) Expand all Loading... |
| 46 : retransmittable_frames(retransmittable_frames), | 44 : retransmittable_frames(retransmittable_frames), |
| 47 sequence_number_length(sequence_number_length), | 45 sequence_number_length(sequence_number_length), |
| 48 sent_time(QuicTime::Zero()), | 46 sent_time(QuicTime::Zero()), |
| 49 bytes_sent(0), | 47 bytes_sent(0), |
| 50 nack_count(0), | 48 nack_count(0), |
| 51 all_transmissions(all_transmissions), | 49 all_transmissions(all_transmissions), |
| 52 pending(false) { | 50 pending(false) { |
| 53 all_transmissions->insert(sequence_number); | 51 all_transmissions->insert(sequence_number); |
| 54 } | 52 } |
| 55 | 53 |
| 56 QuicUnackedPacketMap::QuicUnackedPacketMap(bool is_server) | 54 QuicUnackedPacketMap::QuicUnackedPacketMap() |
| 57 : largest_sent_packet_(0), | 55 : largest_sent_packet_(0), |
| 58 bytes_in_flight_(0), | 56 bytes_in_flight_(0), |
| 59 is_server_(is_server) { | 57 pending_crypto_packet_count_(0) { |
| 60 } | 58 } |
| 61 | 59 |
| 62 QuicUnackedPacketMap::~QuicUnackedPacketMap() { | 60 QuicUnackedPacketMap::~QuicUnackedPacketMap() { |
| 63 for (UnackedPacketMap::iterator it = unacked_packets_.begin(); | 61 for (UnackedPacketMap::iterator it = unacked_packets_.begin(); |
| 64 it != unacked_packets_.end(); ++it) { | 62 it != unacked_packets_.end(); ++it) { |
| 65 delete it->second.retransmittable_frames; | 63 delete it->second.retransmittable_frames; |
| 66 // Only delete all_transmissions once, for the newest packet. | 64 // Only delete all_transmissions once, for the newest packet. |
| 67 if (it->first == *it->second.all_transmissions->rbegin()) { | 65 if (it->first == *it->second.all_transmissions->rbegin()) { |
| 68 delete it->second.all_transmissions; | 66 delete it->second.all_transmissions; |
| 69 } | 67 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 80 LOG_IF(DFATAL, is_old_packet) << "Old packet serialized: " | 78 LOG_IF(DFATAL, is_old_packet) << "Old packet serialized: " |
| 81 << serialized_packet.sequence_number | 79 << serialized_packet.sequence_number |
| 82 << " vs: " | 80 << " vs: " |
| 83 << unacked_packets_.rbegin()->first; | 81 << unacked_packets_.rbegin()->first; |
| 84 } | 82 } |
| 85 | 83 |
| 86 unacked_packets_[serialized_packet.sequence_number] = | 84 unacked_packets_[serialized_packet.sequence_number] = |
| 87 TransmissionInfo(serialized_packet.retransmittable_frames, | 85 TransmissionInfo(serialized_packet.retransmittable_frames, |
| 88 serialized_packet.sequence_number, | 86 serialized_packet.sequence_number, |
| 89 serialized_packet.sequence_number_length); | 87 serialized_packet.sequence_number_length); |
| 88 if (serialized_packet.retransmittable_frames != NULL && |
| 89 serialized_packet.retransmittable_frames->HasCryptoHandshake() |
| 90 == IS_HANDSHAKE) { |
| 91 ++pending_crypto_packet_count_; |
| 92 } |
| 90 } | 93 } |
| 91 | 94 |
| 92 void QuicUnackedPacketMap::OnRetransmittedPacket( | 95 void QuicUnackedPacketMap::OnRetransmittedPacket( |
| 93 QuicPacketSequenceNumber old_sequence_number, | 96 QuicPacketSequenceNumber old_sequence_number, |
| 94 QuicPacketSequenceNumber new_sequence_number) { | 97 QuicPacketSequenceNumber new_sequence_number) { |
| 95 DCHECK(ContainsKey(unacked_packets_, old_sequence_number)); | 98 DCHECK(ContainsKey(unacked_packets_, old_sequence_number)); |
| 96 DCHECK(unacked_packets_.empty() || | 99 DCHECK(unacked_packets_.empty() || |
| 97 unacked_packets_.rbegin()->first < new_sequence_number); | 100 unacked_packets_.rbegin()->first < new_sequence_number); |
| 98 | 101 |
| 99 // TODO(ianswett): Discard and lose the packet lazily instead of immediately. | 102 // TODO(ianswett): Discard and lose the packet lazily instead of immediately. |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 if (it == unacked_packets_.end()) { | 163 if (it == unacked_packets_.end()) { |
| 161 LOG(DFATAL) << "packet is not unacked: " << sequence_number; | 164 LOG(DFATAL) << "packet is not unacked: " << sequence_number; |
| 162 return; | 165 return; |
| 163 } | 166 } |
| 164 const TransmissionInfo& transmission_info = it->second; | 167 const TransmissionInfo& transmission_info = it->second; |
| 165 transmission_info.all_transmissions->erase(sequence_number); | 168 transmission_info.all_transmissions->erase(sequence_number); |
| 166 if (transmission_info.all_transmissions->empty()) { | 169 if (transmission_info.all_transmissions->empty()) { |
| 167 delete transmission_info.all_transmissions; | 170 delete transmission_info.all_transmissions; |
| 168 } | 171 } |
| 169 if (transmission_info.retransmittable_frames != NULL) { | 172 if (transmission_info.retransmittable_frames != NULL) { |
| 173 if (transmission_info.retransmittable_frames->HasCryptoHandshake() |
| 174 == IS_HANDSHAKE) { |
| 175 --pending_crypto_packet_count_; |
| 176 } |
| 170 delete transmission_info.retransmittable_frames; | 177 delete transmission_info.retransmittable_frames; |
| 171 } | 178 } |
| 172 unacked_packets_.erase(it); | 179 unacked_packets_.erase(it); |
| 173 } | 180 } |
| 174 | 181 |
| 175 void QuicUnackedPacketMap::NeuterPacket( | 182 void QuicUnackedPacketMap::NeuterPacket( |
| 176 QuicPacketSequenceNumber sequence_number) { | 183 QuicPacketSequenceNumber sequence_number) { |
| 177 UnackedPacketMap::iterator it = unacked_packets_.find(sequence_number); | 184 UnackedPacketMap::iterator it = unacked_packets_.find(sequence_number); |
| 178 if (it == unacked_packets_.end()) { | 185 if (it == unacked_packets_.end()) { |
| 179 LOG(DFATAL) << "packet is not unacked: " << sequence_number; | 186 LOG(DFATAL) << "packet is not unacked: " << sequence_number; |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 275 if (it->second.pending) { | 282 if (it->second.pending) { |
| 276 ++num_pending; | 283 ++num_pending; |
| 277 } | 284 } |
| 278 if (num_pending > 1) { | 285 if (num_pending > 1) { |
| 279 return true; | 286 return true; |
| 280 } | 287 } |
| 281 } | 288 } |
| 282 return false; | 289 return false; |
| 283 } | 290 } |
| 284 | 291 |
| 292 bool QuicUnackedPacketMap::HasPendingCryptoPackets() const { |
| 293 return pending_crypto_packet_count_ > 0; |
| 294 } |
| 295 |
| 285 bool QuicUnackedPacketMap::HasUnackedRetransmittableFrames() const { | 296 bool QuicUnackedPacketMap::HasUnackedRetransmittableFrames() const { |
| 286 for (UnackedPacketMap::const_reverse_iterator it = | 297 for (UnackedPacketMap::const_reverse_iterator it = |
| 287 unacked_packets_.rbegin(); it != unacked_packets_.rend(); ++it) { | 298 unacked_packets_.rbegin(); it != unacked_packets_.rend(); ++it) { |
| 288 if (it->second.pending && it->second.retransmittable_frames) { | 299 if (it->second.pending && it->second.retransmittable_frames) { |
| 289 return true; | 300 return true; |
| 290 } | 301 } |
| 291 } | 302 } |
| 292 return false; | 303 return false; |
| 293 } | 304 } |
| 294 | 305 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 DCHECK(!it->second.pending); | 346 DCHECK(!it->second.pending); |
| 336 | 347 |
| 337 largest_sent_packet_ = max(sequence_number, largest_sent_packet_); | 348 largest_sent_packet_ = max(sequence_number, largest_sent_packet_); |
| 338 bytes_in_flight_ += bytes_sent; | 349 bytes_in_flight_ += bytes_sent; |
| 339 it->second.sent_time = sent_time; | 350 it->second.sent_time = sent_time; |
| 340 it->second.bytes_sent = bytes_sent; | 351 it->second.bytes_sent = bytes_sent; |
| 341 it->second.pending = true; | 352 it->second.pending = true; |
| 342 } | 353 } |
| 343 | 354 |
| 344 } // namespace net | 355 } // namespace net |
| OLD | NEW |