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

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

Issue 2515613002: deprecate FLAGS_quic_disable_pre_34 (Closed)
Patch Set: Created 4 years, 1 month 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/core/quic_packet_creator.h ('k') | net/quic/core/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/core/quic_packet_creator.h" 5 #include "net/quic/core/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"
11 #include "net/quic/core/crypto/crypto_protocol.h" 11 #include "net/quic/core/crypto/crypto_protocol.h"
12 #include "net/quic/core/crypto/quic_random.h"
13 #include "net/quic/core/quic_bug_tracker.h" 12 #include "net/quic/core/quic_bug_tracker.h"
14 #include "net/quic/core/quic_data_writer.h" 13 #include "net/quic/core/quic_data_writer.h"
15 #include "net/quic/core/quic_flags.h" 14 #include "net/quic/core/quic_flags.h"
16 #include "net/quic/core/quic_utils.h" 15 #include "net/quic/core/quic_utils.h"
17 16
18 using base::StringPiece; 17 using base::StringPiece;
19 using std::make_pair; 18 using std::make_pair;
20 using std::max; 19 using std::max;
21 using std::min; 20 using std::min;
22 using std::pair; 21 using std::pair;
23 using std::string; 22 using std::string;
24 using std::vector; 23 using std::vector;
25 24
26 // If true, enforce that QUIC CHLOs fit in one packet. 25 // If true, enforce that QUIC CHLOs fit in one packet.
27 bool FLAGS_quic_enforce_single_packet_chlo = true; 26 bool FLAGS_quic_enforce_single_packet_chlo = true;
28 27
29 namespace net { 28 namespace net {
30 29
31 QuicPacketCreator::QuicPacketCreator(QuicConnectionId connection_id, 30 QuicPacketCreator::QuicPacketCreator(QuicConnectionId connection_id,
32 QuicFramer* framer, 31 QuicFramer* framer,
33 QuicRandom* random_generator,
34 QuicBufferAllocator* buffer_allocator, 32 QuicBufferAllocator* buffer_allocator,
35 DelegateInterface* delegate) 33 DelegateInterface* delegate)
36 : delegate_(delegate), 34 : delegate_(delegate),
37 debug_delegate_(nullptr), 35 debug_delegate_(nullptr),
38 framer_(framer), 36 framer_(framer),
39 random_bool_source_(random_generator),
40 buffer_allocator_(buffer_allocator), 37 buffer_allocator_(buffer_allocator),
41 send_version_in_packet_(framer->perspective() == Perspective::IS_CLIENT), 38 send_version_in_packet_(framer->perspective() == Perspective::IS_CLIENT),
42 send_path_id_in_packet_(false), 39 send_path_id_in_packet_(false),
43 next_packet_number_length_(PACKET_1BYTE_PACKET_NUMBER), 40 next_packet_number_length_(PACKET_1BYTE_PACKET_NUMBER),
44 have_diversification_nonce_(false), 41 have_diversification_nonce_(false),
45 max_packet_length_(0), 42 max_packet_length_(0),
46 connection_id_length_(PACKET_8BYTE_CONNECTION_ID), 43 connection_id_length_(PACKET_8BYTE_CONNECTION_ID),
47 packet_size_(0), 44 packet_size_(0),
48 connection_id_(connection_id), 45 connection_id_(connection_id),
49 packet_(kDefaultPathId, 46 packet_(kDefaultPathId,
50 0, 47 0,
51 PACKET_1BYTE_PACKET_NUMBER, 48 PACKET_1BYTE_PACKET_NUMBER,
52 nullptr, 49 nullptr,
53 0, 50 0,
54 0,
55 false, 51 false,
56 false) { 52 false) {
57 SetMaxPacketLength(kDefaultMaxPacketSize); 53 SetMaxPacketLength(kDefaultMaxPacketSize);
58 } 54 }
59 55
60 QuicPacketCreator::~QuicPacketCreator() { 56 QuicPacketCreator::~QuicPacketCreator() {
61 QuicUtils::DeleteFrames(&packet_.retransmittable_frames); 57 QuicUtils::DeleteFrames(&packet_.retransmittable_frames);
62 } 58 }
63 59
64 void QuicPacketCreator::SetEncrypter(EncryptionLevel level, 60 void QuicPacketCreator::SetEncrypter(EncryptionLevel level,
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 GetStartOfEncryptedData(framer_->version(), header), writer.length(), 412 GetStartOfEncryptedData(framer_->version(), header), writer.length(),
417 arraysize(encrypted_buffer), encrypted_buffer); 413 arraysize(encrypted_buffer), encrypted_buffer);
418 if (encrypted_length == 0) { 414 if (encrypted_length == 0) {
419 QUIC_BUG << "Failed to encrypt packet number " << header.packet_number; 415 QUIC_BUG << "Failed to encrypt packet number " << header.packet_number;
420 return; 416 return;
421 } 417 }
422 // TODO(ianswett): Optimize the storage so RetransmitableFrames can be 418 // TODO(ianswett): Optimize the storage so RetransmitableFrames can be
423 // unioned with a QuicStreamFrame and a UniqueStreamBuffer. 419 // unioned with a QuicStreamFrame and a UniqueStreamBuffer.
424 *num_bytes_consumed = bytes_consumed; 420 *num_bytes_consumed = bytes_consumed;
425 packet_size_ = 0; 421 packet_size_ = 0;
426 packet_.entropy_hash = QuicFramer::GetPacketEntropyHash(header);
427 packet_.encrypted_buffer = encrypted_buffer; 422 packet_.encrypted_buffer = encrypted_buffer;
428 packet_.encrypted_length = encrypted_length; 423 packet_.encrypted_length = encrypted_length;
429 if (listener != nullptr) { 424 if (listener != nullptr) {
430 packet_.listeners.emplace_back(listener, bytes_consumed); 425 packet_.listeners.emplace_back(listener, bytes_consumed);
431 } 426 }
432 packet_.retransmittable_frames.push_back(QuicFrame(frame.release())); 427 packet_.retransmittable_frames.push_back(QuicFrame(frame.release()));
433 OnSerializedPacket(); 428 OnSerializedPacket();
434 } 429 }
435 430
436 bool QuicPacketCreator::HasPendingFrames() const { 431 bool QuicPacketCreator::HasPendingFrames() const {
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 packet_.encryption_level, packet_.path_id, packet_.packet_number, 515 packet_.encryption_level, packet_.path_id, packet_.packet_number,
521 GetStartOfEncryptedData(framer_->version(), header), length, 516 GetStartOfEncryptedData(framer_->version(), header), length,
522 encrypted_buffer_len, encrypted_buffer); 517 encrypted_buffer_len, encrypted_buffer);
523 if (encrypted_length == 0) { 518 if (encrypted_length == 0) {
524 QUIC_BUG << "Failed to encrypt packet number " << packet_.packet_number; 519 QUIC_BUG << "Failed to encrypt packet number " << packet_.packet_number;
525 return; 520 return;
526 } 521 }
527 522
528 packet_size_ = 0; 523 packet_size_ = 0;
529 queued_frames_.clear(); 524 queued_frames_.clear();
530 packet_.entropy_hash = QuicFramer::GetPacketEntropyHash(header);
531 packet_.encrypted_buffer = encrypted_buffer; 525 packet_.encrypted_buffer = encrypted_buffer;
532 packet_.encrypted_length = encrypted_length; 526 packet_.encrypted_length = encrypted_length;
533 } 527 }
534 528
535 std::unique_ptr<QuicEncryptedPacket> 529 std::unique_ptr<QuicEncryptedPacket>
536 QuicPacketCreator::SerializeVersionNegotiationPacket( 530 QuicPacketCreator::SerializeVersionNegotiationPacket(
537 const QuicVersionVector& supported_versions) { 531 const QuicVersionVector& supported_versions) {
538 DCHECK_EQ(Perspective::IS_SERVER, framer_->perspective()); 532 DCHECK_EQ(Perspective::IS_SERVER, framer_->perspective());
539 std::unique_ptr<QuicEncryptedPacket> encrypted = 533 std::unique_ptr<QuicEncryptedPacket> encrypted =
540 QuicFramer::BuildVersionNegotiationPacket(connection_id_, 534 QuicFramer::BuildVersionNegotiationPacket(connection_id_,
541 supported_versions); 535 supported_versions);
542 DCHECK(encrypted); 536 DCHECK(encrypted);
543 DCHECK_GE(max_packet_length_, encrypted->length()); 537 DCHECK_GE(max_packet_length_, encrypted->length());
544 return encrypted; 538 return encrypted;
545 } 539 }
546 540
547 // TODO(jri): Make this a public method of framer? 541 // TODO(jri): Make this a public method of framer?
548 SerializedPacket QuicPacketCreator::NoPacket() { 542 SerializedPacket QuicPacketCreator::NoPacket() {
549 return SerializedPacket(kInvalidPathId, 0, PACKET_1BYTE_PACKET_NUMBER, 543 return SerializedPacket(kInvalidPathId, 0, PACKET_1BYTE_PACKET_NUMBER,
550 nullptr, 0, 0, false, false); 544 nullptr, 0, false, false);
551 } 545 }
552 546
553 void QuicPacketCreator::FillPacketHeader(QuicPacketHeader* header) { 547 void QuicPacketCreator::FillPacketHeader(QuicPacketHeader* header) {
554 header->public_header.connection_id = connection_id_; 548 header->public_header.connection_id = connection_id_;
555 header->public_header.connection_id_length = connection_id_length_; 549 header->public_header.connection_id_length = connection_id_length_;
556 header->public_header.multipath_flag = send_path_id_in_packet_; 550 header->public_header.multipath_flag = send_path_id_in_packet_;
557 header->public_header.reset_flag = false; 551 header->public_header.reset_flag = false;
558 header->public_header.version_flag = send_version_in_packet_; 552 header->public_header.version_flag = send_version_in_packet_;
559 if (IncludeNonceInPublicHeader()) { 553 if (IncludeNonceInPublicHeader()) {
560 DCHECK_EQ(Perspective::IS_SERVER, framer_->perspective()); 554 DCHECK_EQ(Perspective::IS_SERVER, framer_->perspective());
561 header->public_header.nonce = &diversification_nonce_; 555 header->public_header.nonce = &diversification_nonce_;
562 } else { 556 } else {
563 header->public_header.nonce = nullptr; 557 header->public_header.nonce = nullptr;
564 } 558 }
565 header->path_id = packet_.path_id; 559 header->path_id = packet_.path_id;
566 header->packet_number = ++packet_.packet_number; 560 header->packet_number = ++packet_.packet_number;
567 header->public_header.packet_number_length = packet_.packet_number_length; 561 header->public_header.packet_number_length = packet_.packet_number_length;
568 header->entropy_flag = random_bool_source_.RandBool();
569 } 562 }
570 563
571 bool QuicPacketCreator::ShouldRetransmit(const QuicFrame& frame) { 564 bool QuicPacketCreator::ShouldRetransmit(const QuicFrame& frame) {
572 switch (frame.type) { 565 switch (frame.type) {
573 case ACK_FRAME: 566 case ACK_FRAME:
574 case PADDING_FRAME: 567 case PADDING_FRAME:
575 case STOP_WAITING_FRAME: 568 case STOP_WAITING_FRAME:
576 case MTU_DISCOVERY_FRAME: 569 case MTU_DISCOVERY_FRAME:
577 return false; 570 return false;
578 default: 571 default:
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
670 send_path_id_in_packet_ = packet_.path_id != kDefaultPathId ? true : false; 663 send_path_id_in_packet_ = packet_.path_id != kDefaultPathId ? true : false;
671 // Switching path needs to update packet number length. 664 // Switching path needs to update packet number length.
672 UpdatePacketNumberLength(least_packet_awaited_by_peer, max_packets_in_flight); 665 UpdatePacketNumberLength(least_packet_awaited_by_peer, max_packets_in_flight);
673 } 666 }
674 667
675 bool QuicPacketCreator::IncludeNonceInPublicHeader() { 668 bool QuicPacketCreator::IncludeNonceInPublicHeader() {
676 return have_diversification_nonce_ && 669 return have_diversification_nonce_ &&
677 packet_.encryption_level == ENCRYPTION_INITIAL; 670 packet_.encryption_level == ENCRYPTION_INITIAL;
678 } 671 }
679 672
680 QuicPacketCreator::QuicRandomBoolSource::QuicRandomBoolSource(
681 QuicRandom* random)
682 : random_(random), bit_bucket_(0), bit_mask_(0) {}
683
684 QuicPacketCreator::QuicRandomBoolSource::~QuicRandomBoolSource() {}
685
686 bool QuicPacketCreator::QuicRandomBoolSource::RandBool() {
687 if (bit_mask_ == 0) {
688 bit_bucket_ = random_->RandUint64();
689 bit_mask_ = 1;
690 }
691 bool result = ((bit_bucket_ & bit_mask_) != 0);
692 bit_mask_ <<= 1;
693 return result;
694 }
695
696 } // namespace net 673 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/core/quic_packet_creator.h ('k') | net/quic/core/quic_packet_creator_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698