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_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 Loading... |
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 Loading... |
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 |
OLD | NEW |