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