OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_packet_generator.h" | 5 #include "net/quic/quic_packet_generator.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "net/quic/quic_fec_group.h" | 8 #include "net/quic/quic_fec_group.h" |
9 #include "net/quic/quic_utils.h" | 9 #include "net/quic/quic_utils.h" |
10 | 10 |
11 using base::StringPiece; | 11 using base::StringPiece; |
12 | 12 |
13 namespace net { | 13 namespace net { |
14 | 14 |
15 QuicPacketGenerator::QuicPacketGenerator(DelegateInterface* delegate, | 15 QuicPacketGenerator::QuicPacketGenerator(DelegateInterface* delegate, |
| 16 DebugDelegateInterface* debug_delegate, |
16 QuicPacketCreator* creator) | 17 QuicPacketCreator* creator) |
17 : delegate_(delegate), | 18 : delegate_(delegate), |
| 19 debug_delegate_(debug_delegate), |
18 packet_creator_(creator), | 20 packet_creator_(creator), |
19 should_flush_(true), | 21 should_flush_(true), |
20 should_send_ack_(false), | 22 should_send_ack_(false), |
21 should_send_feedback_(false) { | 23 should_send_feedback_(false) { |
22 } | 24 } |
23 | 25 |
24 QuicPacketGenerator::~QuicPacketGenerator() { | 26 QuicPacketGenerator::~QuicPacketGenerator() { |
25 for (QuicFrames::iterator it = queued_control_frames_.begin(); | 27 for (QuicFrames::iterator it = queued_control_frames_.begin(); |
26 it != queued_control_frames_.end(); ++it) { | 28 it != queued_control_frames_.end(); ++it) { |
27 switch (it->type) { | 29 switch (it->type) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 bool fin) { | 72 bool fin) { |
71 SendQueuedFrames(); | 73 SendQueuedFrames(); |
72 | 74 |
73 size_t total_bytes_consumed = 0; | 75 size_t total_bytes_consumed = 0; |
74 bool fin_consumed = false; | 76 bool fin_consumed = false; |
75 | 77 |
76 while (delegate_->CanWrite(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA)) { | 78 while (delegate_->CanWrite(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA)) { |
77 QuicFrame frame; | 79 QuicFrame frame; |
78 size_t bytes_consumed = packet_creator_->CreateStreamFrame( | 80 size_t bytes_consumed = packet_creator_->CreateStreamFrame( |
79 id, data, offset + total_bytes_consumed, fin, &frame); | 81 id, data, offset + total_bytes_consumed, fin, &frame); |
80 bool success = packet_creator_->AddSavedFrame(frame); | 82 bool success = AddFrame(frame); |
81 DCHECK(success); | 83 DCHECK(success); |
82 | 84 |
83 total_bytes_consumed += bytes_consumed; | 85 total_bytes_consumed += bytes_consumed; |
84 fin_consumed = fin && bytes_consumed == data.size(); | 86 fin_consumed = fin && bytes_consumed == data.size(); |
85 data.remove_prefix(bytes_consumed); | 87 data.remove_prefix(bytes_consumed); |
86 DCHECK(data.empty() || packet_creator_->BytesFree() == 0u); | 88 DCHECK(data.empty() || packet_creator_->BytesFree() == 0u); |
87 | 89 |
88 // TODO(ianswett): Restore packet reordering. | 90 // TODO(ianswett): Restore packet reordering. |
89 if (should_flush_ || !packet_creator_->HasRoomForStreamFrame()) { | 91 if (should_flush_ || !packet_creator_->HasRoomForStreamFrame()) { |
90 SerializeAndSendPacket(); | 92 SerializeAndSendPacket(); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 } | 153 } |
152 | 154 |
153 bool QuicPacketGenerator::HasPendingFrames() const { | 155 bool QuicPacketGenerator::HasPendingFrames() const { |
154 return should_send_ack_ || should_send_feedback_ || | 156 return should_send_ack_ || should_send_feedback_ || |
155 !queued_control_frames_.empty(); | 157 !queued_control_frames_.empty(); |
156 } | 158 } |
157 | 159 |
158 bool QuicPacketGenerator::AddNextPendingFrame() { | 160 bool QuicPacketGenerator::AddNextPendingFrame() { |
159 if (should_send_ack_) { | 161 if (should_send_ack_) { |
160 pending_ack_frame_.reset(delegate_->CreateAckFrame()); | 162 pending_ack_frame_.reset(delegate_->CreateAckFrame()); |
161 if (!packet_creator_->AddSavedFrame(QuicFrame(pending_ack_frame_.get()))) { | 163 if (!AddFrame(QuicFrame(pending_ack_frame_.get()))) { |
162 // packet was full | 164 // packet was full |
163 return false; | 165 return false; |
164 } | 166 } |
165 should_send_ack_ = false; | 167 should_send_ack_ = false; |
166 return true; | 168 return true; |
167 } | 169 } |
168 | 170 |
169 if (should_send_feedback_) { | 171 if (should_send_feedback_) { |
170 pending_feedback_frame_.reset(delegate_->CreateFeedbackFrame()); | 172 pending_feedback_frame_.reset(delegate_->CreateFeedbackFrame()); |
171 if (!packet_creator_->AddSavedFrame(QuicFrame( | 173 if (!AddFrame(QuicFrame(pending_feedback_frame_.get()))) { |
172 pending_feedback_frame_.get()))) { | |
173 // packet was full | 174 // packet was full |
174 return false; | 175 return false; |
175 } | 176 } |
176 should_send_feedback_ = false; | 177 should_send_feedback_ = false; |
177 return true; | 178 return true; |
178 } | 179 } |
179 | 180 |
180 DCHECK(!queued_control_frames_.empty()); | 181 DCHECK(!queued_control_frames_.empty()); |
181 if (!packet_creator_->AddSavedFrame(queued_control_frames_.back())) { | 182 if (!AddFrame(queued_control_frames_.back())) { |
182 // packet was full | 183 // packet was full |
183 return false; | 184 return false; |
184 } | 185 } |
185 queued_control_frames_.pop_back(); | 186 queued_control_frames_.pop_back(); |
186 return true; | 187 return true; |
187 } | 188 } |
188 | 189 |
| 190 bool QuicPacketGenerator::AddFrame(const QuicFrame& frame) { |
| 191 bool success = packet_creator_->AddSavedFrame(frame); |
| 192 if (success && debug_delegate_) { |
| 193 debug_delegate_->OnFrameAddedToPacket(frame); |
| 194 } |
| 195 return success; |
| 196 } |
| 197 |
189 void QuicPacketGenerator::SerializeAndSendPacket() { | 198 void QuicPacketGenerator::SerializeAndSendPacket() { |
190 SerializedPacket serialized_packet = packet_creator_->SerializePacket(); | 199 SerializedPacket serialized_packet = packet_creator_->SerializePacket(); |
191 DCHECK(serialized_packet.packet); | 200 DCHECK(serialized_packet.packet); |
192 delegate_->OnSerializedPacket(serialized_packet); | 201 delegate_->OnSerializedPacket(serialized_packet); |
193 | 202 |
194 if (packet_creator_->ShouldSendFec(false)) { | 203 if (packet_creator_->ShouldSendFec(false)) { |
195 SerializedPacket serialized_fec = packet_creator_->SerializeFec(); | 204 SerializedPacket serialized_fec = packet_creator_->SerializeFec(); |
196 DCHECK(serialized_fec.packet); | 205 DCHECK(serialized_fec.packet); |
197 delegate_->OnSerializedPacket(serialized_fec); | 206 delegate_->OnSerializedPacket(serialized_fec); |
198 packet_creator_->MaybeStartFEC(); | 207 packet_creator_->MaybeStartFEC(); |
199 } | 208 } |
200 } | 209 } |
201 | 210 |
202 } // namespace net | 211 } // namespace net |
OLD | NEW |