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