Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(485)

Side by Side Diff: net/quic/quic_sent_packet_manager.cc

Issue 23691073: Land Recent QUIC changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Compiler/unittests fix Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_sent_packet_manager.h ('k') | net/quic/quic_sent_packet_manager_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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
OLDNEW
« no previous file with comments | « net/quic/quic_sent_packet_manager.h ('k') | net/quic/quic_sent_packet_manager_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698