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

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

Issue 1667583004: Landing Recent QUIC changes until 01/31/2016 05:22 UTC (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@Final_0203
Patch Set: Rebase Created 4 years, 10 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_crypto_client_stream_factory.cc ('k') | net/quic/quic_packet_creator_test.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/logging.h" 9 #include "base/logging.h"
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
95 next_packet_number_length_(PACKET_1BYTE_PACKET_NUMBER), 95 next_packet_number_length_(PACKET_1BYTE_PACKET_NUMBER),
96 max_packet_length_(0), 96 max_packet_length_(0),
97 connection_id_length_(PACKET_8BYTE_CONNECTION_ID), 97 connection_id_length_(PACKET_8BYTE_CONNECTION_ID),
98 packet_size_(0), 98 packet_size_(0),
99 connection_id_(connection_id), 99 connection_id_(connection_id),
100 packet_(kDefaultPathId, 100 packet_(kDefaultPathId,
101 0, 101 0,
102 next_packet_number_length_, 102 next_packet_number_length_,
103 nullptr, 103 nullptr,
104 0, 104 0,
105 0,
105 false, 106 false,
106 false), 107 false),
107 should_fec_protect_next_packet_(false), 108 should_fec_protect_next_packet_(false),
108 fec_protect_(false), 109 fec_protect_(false),
109 max_packets_per_fec_group_(kDefaultMaxPacketsPerFecGroup), 110 max_packets_per_fec_group_(kDefaultMaxPacketsPerFecGroup),
110 fec_send_policy_(FEC_ANY_TRIGGER), 111 fec_send_policy_(FEC_ANY_TRIGGER),
111 fec_timeout_(QuicTime::Delta::Zero()), 112 fec_timeout_(QuicTime::Delta::Zero()),
112 rtt_multiplier_for_fec_timeout_(kRttMultiplierForFecTimeout) { 113 rtt_multiplier_for_fec_timeout_(kRttMultiplierForFecTimeout) {
113 SetMaxPacketLength(kDefaultMaxPacketSize); 114 SetMaxPacketLength(kDefaultMaxPacketSize);
114 } 115 }
115 116
116 QuicPacketCreator::~QuicPacketCreator() { 117 QuicPacketCreator::~QuicPacketCreator() {
117 QuicUtils::DeleteFrames(&packet_.retransmittable_frames); 118 QuicUtils::DeleteFrames(&packet_.retransmittable_frames);
118 if (packet_.packet != nullptr) {
119 delete packet_.packet;
120 }
121 } 119 }
122 120
123 void QuicPacketCreator::OnBuiltFecProtectedPayload( 121 void QuicPacketCreator::OnBuiltFecProtectedPayload(
124 const QuicPacketHeader& header, 122 const QuicPacketHeader& header,
125 StringPiece payload) { 123 StringPiece payload) {
126 if (fec_group_.get() != nullptr) { 124 if (fec_group_.get() != nullptr) {
127 DCHECK_NE(0u, header.fec_group); 125 DCHECK_NE(0u, header.fec_group);
128 fec_group_->Update(packet_.encryption_level, header, payload); 126 fec_group_->Update(packet_.encryption_level, header, payload);
129 } 127 }
130 } 128 }
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 } 467 }
470 468
471 // TODO(rtenneti): Change the default 64 alignas value (used the default 469 // TODO(rtenneti): Change the default 64 alignas value (used the default
472 // value from CACHELINE_SIZE). 470 // value from CACHELINE_SIZE).
473 ALIGNAS(64) char seralized_packet_buffer[kMaxPacketSize]; 471 ALIGNAS(64) char seralized_packet_buffer[kMaxPacketSize];
474 SerializePacket(seralized_packet_buffer, kMaxPacketSize); 472 SerializePacket(seralized_packet_buffer, kMaxPacketSize);
475 OnSerializedPacket(); 473 OnSerializedPacket();
476 } 474 }
477 475
478 void QuicPacketCreator::OnSerializedPacket() { 476 void QuicPacketCreator::OnSerializedPacket() {
479 if (packet_.packet == nullptr) { 477 if (packet_.encrypted_buffer == nullptr) {
480 QUIC_BUG << "Failed to SerializePacket. fec_policy:" << fec_send_policy() 478 QUIC_BUG << "Failed to SerializePacket. fec_policy:" << fec_send_policy()
481 << " should_fec_protect_:" << should_fec_protect_next_packet_; 479 << " should_fec_protect_:" << should_fec_protect_next_packet_;
482 delegate_->CloseConnection(QUIC_FAILED_TO_SERIALIZE_PACKET, false); 480 delegate_->CloseConnection(QUIC_FAILED_TO_SERIALIZE_PACKET, false);
483 return; 481 return;
484 } 482 }
485 483
486 delegate_->OnSerializedPacket(&packet_); 484 delegate_->OnSerializedPacket(&packet_);
487 ClearPacket(); 485 ClearPacket();
488 MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/false, 486 MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/false,
489 /*is_fec_timeout=*/false); 487 /*is_fec_timeout=*/false);
490 // Maximum packet size may be only enacted while no packet is currently being 488 // Maximum packet size may be only enacted while no packet is currently being
491 // constructed, so here we have a good opportunity to actually change it. 489 // constructed, so here we have a good opportunity to actually change it.
492 if (CanSetMaxPacketLength()) { 490 if (CanSetMaxPacketLength()) {
493 SetMaxPacketLength(max_packet_length_); 491 SetMaxPacketLength(max_packet_length_);
494 } 492 }
495 } 493 }
496 494
497 void QuicPacketCreator::ClearPacket() { 495 void QuicPacketCreator::ClearPacket() {
498 packet_.has_ack = false; 496 packet_.has_ack = false;
499 packet_.has_stop_waiting = false; 497 packet_.has_stop_waiting = false;
500 packet_.has_crypto_handshake = NOT_HANDSHAKE; 498 packet_.has_crypto_handshake = NOT_HANDSHAKE;
501 packet_.needs_padding = false; 499 packet_.needs_padding = false;
502 packet_.is_fec_packet = false; 500 packet_.is_fec_packet = false;
503 packet_.original_packet_number = 0; 501 packet_.original_packet_number = 0;
504 packet_.transmission_type = NOT_RETRANSMISSION; 502 packet_.transmission_type = NOT_RETRANSMISSION;
505 packet_.packet = nullptr; 503 packet_.encrypted_buffer = nullptr;
504 packet_.encrypted_length = 0;
506 DCHECK(packet_.retransmittable_frames.empty()); 505 DCHECK(packet_.retransmittable_frames.empty());
507 packet_.listeners.clear(); 506 packet_.listeners.clear();
508 } 507 }
509 508
510 bool QuicPacketCreator::HasPendingFrames() const { 509 bool QuicPacketCreator::HasPendingFrames() const {
511 return !queued_frames_.empty(); 510 return !queued_frames_.empty();
512 } 511 }
513 512
514 bool QuicPacketCreator::HasPendingRetransmittableFrames() const { 513 bool QuicPacketCreator::HasPendingRetransmittableFrames() const {
515 return !packet_.retransmittable_frames.empty(); 514 return !packet_.retransmittable_frames.empty();
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 packet_.encryption_level, packet_.path_id, packet_.packet_number, packet, 616 packet_.encryption_level, packet_.path_id, packet_.packet_number, packet,
618 encrypted_buffer, encrypted_buffer_len); 617 encrypted_buffer, encrypted_buffer_len);
619 if (encrypted_length == 0) { 618 if (encrypted_length == 0) {
620 QUIC_BUG << "Failed to encrypt packet number " << packet_.packet_number; 619 QUIC_BUG << "Failed to encrypt packet number " << packet_.packet_number;
621 return; 620 return;
622 } 621 }
623 622
624 packet_size_ = 0; 623 packet_size_ = 0;
625 queued_frames_.clear(); 624 queued_frames_.clear();
626 packet_.entropy_hash = QuicFramer::GetPacketEntropyHash(header); 625 packet_.entropy_hash = QuicFramer::GetPacketEntropyHash(header);
627 packet_.packet = 626 packet_.encrypted_buffer = encrypted_buffer;
628 new QuicEncryptedPacket(encrypted_buffer, encrypted_length, false); 627 packet_.encrypted_length = encrypted_length;
629 } 628 }
630 629
631 void QuicPacketCreator::SerializeFec(char* buffer, size_t buffer_len) { 630 void QuicPacketCreator::SerializeFec(char* buffer, size_t buffer_len) {
632 DCHECK_LT(0u, buffer_len); 631 DCHECK_LT(0u, buffer_len);
633 if (fec_group_.get() == nullptr || fec_group_->NumReceivedPackets() <= 0) { 632 if (fec_group_.get() == nullptr || fec_group_->NumReceivedPackets() <= 0) {
634 QUIC_BUG << "SerializeFEC called but no group or zero packets in group."; 633 QUIC_BUG << "SerializeFEC called but no group or zero packets in group.";
635 return; 634 return;
636 } 635 }
637 if (FLAGS_quic_no_unencrypted_fec && 636 if (FLAGS_quic_no_unencrypted_fec &&
638 packet_.encryption_level == ENCRYPTION_NONE) { 637 packet_.encryption_level == ENCRYPTION_NONE) {
(...skipping 14 matching lines...) Expand all
653 // Immediately encrypt the packet, to ensure we don't encrypt the same packet 652 // Immediately encrypt the packet, to ensure we don't encrypt the same packet
654 // packet number multiple times. 653 // packet number multiple times.
655 size_t encrypted_length = framer_->EncryptPayload( 654 size_t encrypted_length = framer_->EncryptPayload(
656 packet_.encryption_level, packet_.path_id, packet_.packet_number, *packet, 655 packet_.encryption_level, packet_.path_id, packet_.packet_number, *packet,
657 buffer, buffer_len); 656 buffer, buffer_len);
658 if (encrypted_length == 0) { 657 if (encrypted_length == 0) {
659 QUIC_BUG << "Failed to encrypt packet number " << packet_.packet_number; 658 QUIC_BUG << "Failed to encrypt packet number " << packet_.packet_number;
660 return; 659 return;
661 } 660 }
662 packet_.entropy_hash = QuicFramer::GetPacketEntropyHash(header); 661 packet_.entropy_hash = QuicFramer::GetPacketEntropyHash(header);
663 packet_.packet = new QuicEncryptedPacket(buffer, encrypted_length, false); 662 packet_.encrypted_buffer = buffer;
663 packet_.encrypted_length = encrypted_length;
664 packet_.is_fec_packet = true; 664 packet_.is_fec_packet = true;
665 } 665 }
666 666
667 QuicEncryptedPacket* QuicPacketCreator::SerializeVersionNegotiationPacket( 667 QuicEncryptedPacket* QuicPacketCreator::SerializeVersionNegotiationPacket(
668 const QuicVersionVector& supported_versions) { 668 const QuicVersionVector& supported_versions) {
669 DCHECK_EQ(Perspective::IS_SERVER, framer_->perspective()); 669 DCHECK_EQ(Perspective::IS_SERVER, framer_->perspective());
670 QuicEncryptedPacket* encrypted = QuicFramer::BuildVersionNegotiationPacket( 670 QuicEncryptedPacket* encrypted = QuicFramer::BuildVersionNegotiationPacket(
671 connection_id_, supported_versions); 671 connection_id_, supported_versions);
672 DCHECK(encrypted); 672 DCHECK(encrypted);
673 DCHECK_GE(max_packet_length_, encrypted->length()); 673 DCHECK_GE(max_packet_length_, encrypted->length());
674 return encrypted; 674 return encrypted;
675 } 675 }
676 676
677 // TODO(jri): Make this a public method of framer? 677 // TODO(jri): Make this a public method of framer?
678 SerializedPacket QuicPacketCreator::NoPacket() { 678 SerializedPacket QuicPacketCreator::NoPacket() {
679 return SerializedPacket(kInvalidPathId, 0, PACKET_1BYTE_PACKET_NUMBER, 679 return SerializedPacket(kInvalidPathId, 0, PACKET_1BYTE_PACKET_NUMBER,
680 nullptr, 0, false, false); 680 nullptr, 0, 0, false, false);
681 } 681 }
682 682
683 void QuicPacketCreator::FillPacketHeader(QuicFecGroupNumber fec_group, 683 void QuicPacketCreator::FillPacketHeader(QuicFecGroupNumber fec_group,
684 bool fec_flag, 684 bool fec_flag,
685 QuicPacketHeader* header) { 685 QuicPacketHeader* header) {
686 header->public_header.connection_id = connection_id_; 686 header->public_header.connection_id = connection_id_;
687 header->public_header.connection_id_length = connection_id_length_; 687 header->public_header.connection_id_length = connection_id_length_;
688 header->public_header.multipath_flag = send_path_id_in_packet_; 688 header->public_header.multipath_flag = send_path_id_in_packet_;
689 header->public_header.reset_flag = false; 689 header->public_header.reset_flag = false;
690 header->public_header.version_flag = send_version_in_packet_; 690 header->public_header.version_flag = send_version_in_packet_;
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
855 packet_.packet_number = it == multipath_packet_number_.end() ? 0 : it->second; 855 packet_.packet_number = it == multipath_packet_number_.end() ? 0 : it->second;
856 packet_.path_id = path_id; 856 packet_.path_id = path_id;
857 DCHECK(packet_.path_id != kInvalidPathId); 857 DCHECK(packet_.path_id != kInvalidPathId);
858 // Send path in packet if current path is not the default path. 858 // Send path in packet if current path is not the default path.
859 send_path_id_in_packet_ = packet_.path_id != kDefaultPathId ? true : false; 859 send_path_id_in_packet_ = packet_.path_id != kDefaultPathId ? true : false;
860 // Switching path needs to update packet number length. 860 // Switching path needs to update packet number length.
861 UpdatePacketNumberLength(least_packet_awaited_by_peer, max_packets_in_flight); 861 UpdatePacketNumberLength(least_packet_awaited_by_peer, max_packets_in_flight);
862 } 862 }
863 863
864 } // namespace net 864 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_crypto_client_stream_factory.cc ('k') | net/quic/quic_packet_creator_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698