| 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 |