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

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

Issue 1421593004: Change QuicFramer::BuildDataPacket to return a length instead of QuicPacket* in order to reduce mem… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@105596142
Patch Set: Created 5 years, 2 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
« no previous file with comments | « net/quic/quic_framer.cc ('k') | net/quic/test_tools/quic_test_utils.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_creator.h" 5 #include "net/quic/quic_packet_creator.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/basictypes.h" 9 #include "base/basictypes.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 // truncation due to length occurred, then GetSerializedFrameLength will have 449 // truncation due to length occurred, then GetSerializedFrameLength will have
450 // returned all bytes free. 450 // returned all bytes free.
451 bool possibly_truncated_by_length = packet_size_ == max_plaintext_size_ && 451 bool possibly_truncated_by_length = packet_size_ == max_plaintext_size_ &&
452 queued_frames_.size() == 1 && 452 queued_frames_.size() == 1 &&
453 queued_frames_.back().type == ACK_FRAME; 453 queued_frames_.back().type == ACK_FRAME;
454 // The optimized encryption algorithm implementations run faster when 454 // The optimized encryption algorithm implementations run faster when
455 // operating on aligned memory. 455 // operating on aligned memory.
456 // TODO(rtenneti): Change the default 64 alignas value (used the default 456 // TODO(rtenneti): Change the default 64 alignas value (used the default
457 // value from CACHELINE_SIZE). 457 // value from CACHELINE_SIZE).
458 ALIGNAS(64) char buffer[kMaxPacketSize]; 458 ALIGNAS(64) char buffer[kMaxPacketSize];
459 scoped_ptr<QuicPacket> packet;
460 // Use the packet_size_ instead of the buffer size to ensure smaller 459 // Use the packet_size_ instead of the buffer size to ensure smaller
461 // packet sizes are properly used. 460 // packet sizes are properly used.
462 scoped_ptr<char[]> large_buffer; 461 scoped_ptr<char[]> large_buffer;
463 if (packet_size_ <= kMaxPacketSize) { 462 size_t length = 0;
464 packet.reset( 463 const bool use_stack_buffer = packet_size_ <= kMaxPacketSize;
465 framer_->BuildDataPacket(header, queued_frames_, buffer, packet_size_)); 464 if (use_stack_buffer) {
465 length =
466 framer_->BuildDataPacket(header, queued_frames_, buffer, packet_size_);
466 } else { 467 } else {
467 large_buffer.reset(new char[packet_size_]); 468 large_buffer.reset(new char[packet_size_]);
468 packet.reset(framer_->BuildDataPacket(header, queued_frames_, 469 length = framer_->BuildDataPacket(header, queued_frames_,
469 large_buffer.get(), packet_size_)); 470 large_buffer.get(), packet_size_);
470 } 471 }
471 if (packet == nullptr) { 472 if (length == 0) {
472 LOG(DFATAL) << "Failed to serialize " << queued_frames_.size() 473 LOG(DFATAL) << "Failed to serialize " << queued_frames_.size()
473 << " frames."; 474 << " frames.";
474 return NoPacket(); 475 return NoPacket();
475 } 476 }
476 477
477 OnBuiltFecProtectedPayload(header, packet->FecProtectedData()); 478 // TODO(ianswett) Consider replacing QuicPacket with something else,
479 // since it's only used to provide convenience methods to FEC and encryption.
480 QuicPacket packet(use_stack_buffer ? buffer : large_buffer.get(), length,
481 /* owns_buffer */ false,
482 header.public_header.connection_id_length,
483 header.public_header.version_flag,
484 header.public_header.packet_number_length);
485 OnBuiltFecProtectedPayload(header, packet.FecProtectedData());
478 486
479 // Because of possible truncation, we can't be confident that our 487 // Because of possible truncation, we can't be confident that our
480 // packet size calculation worked correctly. 488 // packet size calculation worked correctly.
481 if (!possibly_truncated_by_length) { 489 if (!possibly_truncated_by_length) {
482 DCHECK_EQ(packet_size_, packet->length()); 490 DCHECK_EQ(packet_size_, length);
483 } 491 }
484 // Immediately encrypt the packet, to ensure we don't encrypt the same packet 492 // Immediately encrypt the packet, to ensure we don't encrypt the same packet
485 // packet number multiple times. 493 // packet number multiple times.
486 QuicEncryptedPacket* encrypted = 494 QuicEncryptedPacket* encrypted =
487 framer_->EncryptPayload(encryption_level_, packet_number_, *packet, 495 framer_->EncryptPayload(encryption_level_, packet_number_, packet,
488 encrypted_buffer, encrypted_buffer_len); 496 encrypted_buffer, encrypted_buffer_len);
489 if (encrypted == nullptr) { 497 if (encrypted == nullptr) {
490 LOG(DFATAL) << "Failed to encrypt packet number " << packet_number_; 498 LOG(DFATAL) << "Failed to encrypt packet number " << packet_number_;
491 return NoPacket(); 499 return NoPacket();
492 } 500 }
493 501
494 // Update |needs_padding_| flag of |queued_retransmittable_frames_| here, and 502 // Update |needs_padding_| flag of |queued_retransmittable_frames_| here, and
495 // not in AddFrame, because when the first padded frame is added to the queue, 503 // not in AddFrame, because when the first padded frame is added to the queue,
496 // it might not be retransmittable, and hence the flag would end up being not 504 // it might not be retransmittable, and hence the flag would end up being not
497 // set. 505 // set.
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 if (BytesFree() == 0) { 646 if (BytesFree() == 0) {
639 // Don't pad full packets. 647 // Don't pad full packets.
640 return; 648 return;
641 } 649 }
642 650
643 bool success = AddFrame(QuicFrame(QuicPaddingFrame()), false, false, nullptr); 651 bool success = AddFrame(QuicFrame(QuicPaddingFrame()), false, false, nullptr);
644 DCHECK(success); 652 DCHECK(success);
645 } 653 }
646 654
647 } // namespace net 655 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_framer.cc ('k') | net/quic/test_tools/quic_test_utils.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698