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/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "net/quic/quic_ack_notifier.h" | 9 #include "net/quic/quic_ack_notifier.h" |
10 #include "net/quic/quic_fec_group.h" | 10 #include "net/quic/quic_fec_group.h" |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 | 161 |
162 if (!fin && (iov.total_length == 0)) { | 162 if (!fin && (iov.total_length == 0)) { |
163 LOG(DFATAL) << "Attempt to consume empty data without FIN."; | 163 LOG(DFATAL) << "Attempt to consume empty data without FIN."; |
164 return QuicConsumedData(0, false); | 164 return QuicConsumedData(0, false); |
165 } | 165 } |
166 | 166 |
167 int frames_created = 0; | 167 int frames_created = 0; |
168 while (delegate_->ShouldGeneratePacket( | 168 while (delegate_->ShouldGeneratePacket( |
169 HAS_RETRANSMITTABLE_DATA, has_handshake ? IS_HANDSHAKE : NOT_HANDSHAKE)) { | 169 HAS_RETRANSMITTABLE_DATA, has_handshake ? IS_HANDSHAKE : NOT_HANDSHAKE)) { |
170 QuicFrame frame; | 170 QuicFrame frame; |
171 scoped_ptr<char[]> buffer; | 171 UniqueStreamBuffer buffer; |
172 size_t bytes_consumed = packet_creator_.CreateStreamFrame( | 172 size_t bytes_consumed = packet_creator_.CreateStreamFrame( |
173 id, iov, total_bytes_consumed, offset + total_bytes_consumed, fin, | 173 id, iov, total_bytes_consumed, offset + total_bytes_consumed, fin, |
174 &frame, &buffer); | 174 &frame, &buffer); |
175 ++frames_created; | 175 ++frames_created; |
176 | 176 |
177 // We want to track which packet this stream frame ends up in. | 177 // We want to track which packet this stream frame ends up in. |
178 if (notifier != nullptr) { | 178 if (notifier != nullptr) { |
179 ack_notifiers_.push_back(notifier); | 179 ack_notifiers_.push_back(notifier); |
180 } | 180 } |
181 | 181 |
182 if (!AddFrame(frame, buffer.get(), has_handshake)) { | 182 if (!AddFrame(frame, buffer.Pass(), has_handshake)) { |
183 LOG(DFATAL) << "Failed to add stream frame."; | 183 LOG(DFATAL) << "Failed to add stream frame."; |
184 // Inability to add a STREAM frame creates an unrecoverable hole in a | 184 // Inability to add a STREAM frame creates an unrecoverable hole in a |
185 // the stream, so it's best to close the connection. | 185 // the stream, so it's best to close the connection. |
186 delegate_->CloseConnection(QUIC_INTERNAL_ERROR, false); | 186 delegate_->CloseConnection(QUIC_INTERNAL_ERROR, false); |
187 delete notifier; | 187 delete notifier; |
188 return QuicConsumedData(0, false); | 188 return QuicConsumedData(0, false); |
189 } | 189 } |
190 // When AddFrame succeeds, it takes ownership of the buffer. | |
191 ignore_result(buffer.release()); | |
192 | 190 |
193 total_bytes_consumed += bytes_consumed; | 191 total_bytes_consumed += bytes_consumed; |
194 fin_consumed = fin && total_bytes_consumed == iov.total_length; | 192 fin_consumed = fin && total_bytes_consumed == iov.total_length; |
195 DCHECK(total_bytes_consumed == iov.total_length || | 193 DCHECK(total_bytes_consumed == iov.total_length || |
196 packet_creator_.BytesFree() == 0u); | 194 packet_creator_.BytesFree() == 0u); |
197 | 195 |
198 if (!InBatchMode() || !packet_creator_.HasRoomForStreamFrame(id, offset)) { | 196 if (!InBatchMode() || !packet_creator_.HasRoomForStreamFrame(id, offset)) { |
199 // TODO(rtenneti): remove MaybeSendFecPacketAndCloseGroup() from inside | 197 // TODO(rtenneti): remove MaybeSendFecPacketAndCloseGroup() from inside |
200 // SerializeAndSendPacket() and make it an explicit call here (and | 198 // SerializeAndSendPacket() and make it an explicit call here (and |
201 // elsewhere where we call SerializeAndSendPacket?). | 199 // elsewhere where we call SerializeAndSendPacket?). |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
435 if (!AddFrame(queued_control_frames_.back(), nullptr, | 433 if (!AddFrame(queued_control_frames_.back(), nullptr, |
436 /*needs_padding=*/false)) { | 434 /*needs_padding=*/false)) { |
437 // Packet was full. | 435 // Packet was full. |
438 return false; | 436 return false; |
439 } | 437 } |
440 queued_control_frames_.pop_back(); | 438 queued_control_frames_.pop_back(); |
441 return true; | 439 return true; |
442 } | 440 } |
443 | 441 |
444 bool QuicPacketGenerator::AddFrame(const QuicFrame& frame, | 442 bool QuicPacketGenerator::AddFrame(const QuicFrame& frame, |
445 char* buffer, | 443 UniqueStreamBuffer buffer, |
446 bool needs_padding) { | 444 bool needs_padding) { |
447 bool success = needs_padding | 445 bool success = needs_padding |
448 ? packet_creator_.AddPaddedSavedFrame(frame, buffer) | 446 ? packet_creator_.AddPaddedSavedFrame(frame, buffer.Pass()) |
449 : packet_creator_.AddSavedFrame(frame, buffer); | 447 : packet_creator_.AddSavedFrame(frame, buffer.Pass()); |
450 if (success && debug_delegate_) { | 448 if (success && debug_delegate_) { |
451 debug_delegate_->OnFrameAddedToPacket(frame); | 449 debug_delegate_->OnFrameAddedToPacket(frame); |
452 } | 450 } |
453 return success; | 451 return success; |
454 } | 452 } |
455 | 453 |
456 void QuicPacketGenerator::SerializeAndSendPacket() { | 454 void QuicPacketGenerator::SerializeAndSendPacket() { |
457 // The optimized encryption algorithm implementations run faster when | 455 // The optimized encryption algorithm implementations run faster when |
458 // operating on aligned memory. | 456 // operating on aligned memory. |
459 // | 457 // |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
555 void QuicPacketGenerator::set_encryption_level(EncryptionLevel level) { | 553 void QuicPacketGenerator::set_encryption_level(EncryptionLevel level) { |
556 packet_creator_.set_encryption_level(level); | 554 packet_creator_.set_encryption_level(level); |
557 } | 555 } |
558 | 556 |
559 void QuicPacketGenerator::SetEncrypter(EncryptionLevel level, | 557 void QuicPacketGenerator::SetEncrypter(EncryptionLevel level, |
560 QuicEncrypter* encrypter) { | 558 QuicEncrypter* encrypter) { |
561 packet_creator_.SetEncrypter(level, encrypter); | 559 packet_creator_.SetEncrypter(level, encrypter); |
562 } | 560 } |
563 | 561 |
564 } // namespace net | 562 } // namespace net |
OLD | NEW |