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 |