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" |
(...skipping 24 matching lines...) Expand all Loading... |
35 } | 35 } |
36 | 36 |
37 void QuicUnackedPacketMap::AddSentPacket( | 37 void QuicUnackedPacketMap::AddSentPacket( |
38 const SerializedPacket& packet, | 38 const SerializedPacket& packet, |
39 QuicPacketSequenceNumber old_sequence_number, | 39 QuicPacketSequenceNumber old_sequence_number, |
40 TransmissionType transmission_type, | 40 TransmissionType transmission_type, |
41 QuicTime sent_time, | 41 QuicTime sent_time, |
42 QuicByteCount bytes_sent, | 42 QuicByteCount bytes_sent, |
43 bool set_in_flight) { | 43 bool set_in_flight) { |
44 QuicPacketSequenceNumber sequence_number = packet.sequence_number; | 44 QuicPacketSequenceNumber sequence_number = packet.sequence_number; |
45 DCHECK_LT(largest_sent_packet_, sequence_number); | 45 LOG_IF(DFATAL, largest_sent_packet_ > sequence_number); |
46 DCHECK_GE(sequence_number, least_unacked_ + unacked_packets_.size()); | 46 DCHECK_GE(sequence_number, least_unacked_ + unacked_packets_.size()); |
47 while (least_unacked_ + unacked_packets_.size() < sequence_number) { | 47 while (least_unacked_ + unacked_packets_.size() < sequence_number) { |
48 unacked_packets_.push_back(TransmissionInfo()); | 48 unacked_packets_.push_back(TransmissionInfo()); |
49 unacked_packets_.back().is_unackable = true; | 49 unacked_packets_.back().is_unackable = true; |
50 } | 50 } |
51 | 51 |
52 TransmissionInfo info; | 52 TransmissionInfo info(packet.retransmittable_frames, |
| 53 packet.sequence_number_length, |
| 54 transmission_type, |
| 55 sent_time); |
53 if (old_sequence_number == 0) { | 56 if (old_sequence_number == 0) { |
54 if (packet.retransmittable_frames != nullptr && | 57 if (packet.retransmittable_frames != nullptr && |
55 packet.retransmittable_frames->HasCryptoHandshake() == IS_HANDSHAKE) { | 58 packet.retransmittable_frames->HasCryptoHandshake() == IS_HANDSHAKE) { |
56 ++pending_crypto_packet_count_; | 59 ++pending_crypto_packet_count_; |
57 } | 60 } |
58 info = TransmissionInfo(packet.retransmittable_frames, | |
59 packet.sequence_number_length); | |
60 } else { | 61 } else { |
61 info = OnRetransmittedPacket( | 62 TransferRetransmissionInfo( |
62 old_sequence_number, sequence_number, transmission_type); | 63 old_sequence_number, sequence_number, transmission_type, &info); |
63 } | 64 } |
64 info.sent_time = sent_time; | |
65 | 65 |
66 largest_sent_packet_ = max(sequence_number, largest_sent_packet_); | 66 largest_sent_packet_ = sequence_number; |
67 if (set_in_flight) { | 67 if (set_in_flight) { |
68 bytes_in_flight_ += bytes_sent; | 68 bytes_in_flight_ += bytes_sent; |
69 info.bytes_sent = bytes_sent; | 69 info.bytes_sent = bytes_sent; |
70 info.in_flight = true; | 70 info.in_flight = true; |
71 } | 71 } |
72 unacked_packets_.push_back(info); | 72 unacked_packets_.push_back(info); |
73 } | 73 } |
74 | 74 |
75 void QuicUnackedPacketMap::RemoveObsoletePackets() { | 75 void QuicUnackedPacketMap::RemoveObsoletePackets() { |
76 while (!unacked_packets_.empty()) { | 76 while (!unacked_packets_.empty()) { |
77 if (!IsPacketRemovable(least_unacked_, unacked_packets_.front())) { | 77 if (!IsPacketRemovable(least_unacked_, unacked_packets_.front())) { |
78 break; | 78 break; |
79 } | 79 } |
80 unacked_packets_.pop_front(); | 80 unacked_packets_.pop_front(); |
81 ++least_unacked_; | 81 ++least_unacked_; |
82 } | 82 } |
83 } | 83 } |
84 | 84 |
85 TransmissionInfo QuicUnackedPacketMap::OnRetransmittedPacket( | 85 void QuicUnackedPacketMap::TransferRetransmissionInfo( |
86 QuicPacketSequenceNumber old_sequence_number, | 86 QuicPacketSequenceNumber old_sequence_number, |
87 QuicPacketSequenceNumber new_sequence_number, | 87 QuicPacketSequenceNumber new_sequence_number, |
88 TransmissionType transmission_type) { | 88 TransmissionType transmission_type, |
| 89 TransmissionInfo* info) { |
89 DCHECK_GE(old_sequence_number, least_unacked_); | 90 DCHECK_GE(old_sequence_number, least_unacked_); |
90 DCHECK_LT(old_sequence_number, least_unacked_ + unacked_packets_.size()); | 91 DCHECK_LT(old_sequence_number, least_unacked_ + unacked_packets_.size()); |
91 DCHECK_GE(new_sequence_number, least_unacked_ + unacked_packets_.size()); | 92 DCHECK_GE(new_sequence_number, least_unacked_ + unacked_packets_.size()); |
92 DCHECK_NE(NOT_RETRANSMISSION, transmission_type); | 93 DCHECK_NE(NOT_RETRANSMISSION, transmission_type); |
93 | 94 |
94 // TODO(ianswett): Discard and lose the packet lazily instead of immediately. | 95 // TODO(ianswett): Discard and lose the packet lazily instead of immediately. |
95 TransmissionInfo* transmission_info = | 96 TransmissionInfo* transmission_info = |
96 &unacked_packets_.at(old_sequence_number - least_unacked_); | 97 &unacked_packets_.at(old_sequence_number - least_unacked_); |
97 RetransmittableFrames* frames = transmission_info->retransmittable_frames; | 98 RetransmittableFrames* frames = transmission_info->retransmittable_frames; |
98 transmission_info->retransmittable_frames = nullptr; | 99 transmission_info->retransmittable_frames = nullptr; |
(...skipping 24 matching lines...) Expand all Loading... |
123 if (transmission_type == ALL_INITIAL_RETRANSMISSION || | 124 if (transmission_type == ALL_INITIAL_RETRANSMISSION || |
124 transmission_type == ALL_UNACKED_RETRANSMISSION) { | 125 transmission_type == ALL_UNACKED_RETRANSMISSION) { |
125 RemoveAckability(transmission_info); | 126 RemoveAckability(transmission_info); |
126 } else { | 127 } else { |
127 if (transmission_info->all_transmissions == nullptr) { | 128 if (transmission_info->all_transmissions == nullptr) { |
128 transmission_info->all_transmissions = new SequenceNumberList(); | 129 transmission_info->all_transmissions = new SequenceNumberList(); |
129 transmission_info->all_transmissions->push_back(old_sequence_number); | 130 transmission_info->all_transmissions->push_back(old_sequence_number); |
130 } | 131 } |
131 transmission_info->all_transmissions->push_back(new_sequence_number); | 132 transmission_info->all_transmissions->push_back(new_sequence_number); |
132 } | 133 } |
133 TransmissionInfo info = | 134 info->retransmittable_frames = frames; |
134 TransmissionInfo(frames, | 135 info->all_transmissions = transmission_info->all_transmissions; |
135 transmission_info->sequence_number_length, | |
136 transmission_type, | |
137 transmission_info->all_transmissions); | |
138 // Proactively remove obsolete packets so the least unacked can be raised. | 136 // Proactively remove obsolete packets so the least unacked can be raised. |
139 RemoveObsoletePackets(); | 137 RemoveObsoletePackets(); |
140 return info; | |
141 } | 138 } |
142 | 139 |
143 void QuicUnackedPacketMap::ClearAllPreviousRetransmissions() { | 140 void QuicUnackedPacketMap::ClearAllPreviousRetransmissions() { |
144 while (!unacked_packets_.empty() && least_unacked_ < largest_observed_) { | 141 while (!unacked_packets_.empty() && least_unacked_ < largest_observed_) { |
145 // If this packet is in flight, or has retransmittable data, then there is | 142 // If this packet is in flight, or has retransmittable data, then there is |
146 // no point in clearing out any further packets, because they would not | 143 // no point in clearing out any further packets, because they would not |
147 // affect the high water mark. | 144 // affect the high water mark. |
148 TransmissionInfo* info = &unacked_packets_.front(); | 145 TransmissionInfo* info = &unacked_packets_.front(); |
149 if (info->in_flight || info->retransmittable_frames != nullptr) { | 146 if (info->in_flight || info->retransmittable_frames != nullptr) { |
150 break; | 147 break; |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
377 TransmissionInfo* info = &unacked_packets_[sequence_number - least_unacked_]; | 374 TransmissionInfo* info = &unacked_packets_[sequence_number - least_unacked_]; |
378 DCHECK(!info->in_flight); | 375 DCHECK(!info->in_flight); |
379 DCHECK_NE(0u, info->bytes_sent); | 376 DCHECK_NE(0u, info->bytes_sent); |
380 DCHECK(info->sent_time.IsInitialized()); | 377 DCHECK(info->sent_time.IsInitialized()); |
381 | 378 |
382 bytes_in_flight_ += info->bytes_sent; | 379 bytes_in_flight_ += info->bytes_sent; |
383 info->in_flight = true; | 380 info->in_flight = true; |
384 } | 381 } |
385 | 382 |
386 } // namespace net | 383 } // namespace net |
OLD | NEW |