| 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 630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 641 // not in AddFrame, because when the first padded frame is added to the queue, | 641 // not in AddFrame, because when the first padded frame is added to the queue, |
| 642 // it might not be retransmittable, and hence the flag would end up being not | 642 // it might not be retransmittable, and hence the flag would end up being not |
| 643 // set. | 643 // set. |
| 644 if (queued_retransmittable_frames_.get() != nullptr) { | 644 if (queued_retransmittable_frames_.get() != nullptr) { |
| 645 queued_retransmittable_frames_->set_needs_padding(needs_padding_); | 645 queued_retransmittable_frames_->set_needs_padding(needs_padding_); |
| 646 } | 646 } |
| 647 | 647 |
| 648 packet_size_ = 0; | 648 packet_size_ = 0; |
| 649 queued_frames_.clear(); | 649 queued_frames_.clear(); |
| 650 needs_padding_ = false; | 650 needs_padding_ = false; |
| 651 return SerializedPacket( | 651 return SerializedPacket(current_path_, header.packet_number, |
| 652 header.packet_number, header.public_header.packet_number_length, | 652 header.public_header.packet_number_length, |
| 653 encrypted_buffer, encrypted_length, /* owns_buffer*/ false, | 653 encrypted_buffer, encrypted_length, |
| 654 QuicFramer::GetPacketEntropyHash(header), | 654 /* owns_buffer*/ false, |
| 655 queued_retransmittable_frames_.release(), has_ack_, has_stop_waiting_, | 655 QuicFramer::GetPacketEntropyHash(header), |
| 656 encryption_level_); | 656 queued_retransmittable_frames_.release(), has_ack_, |
| 657 has_stop_waiting_, encryption_level_); |
| 657 } | 658 } |
| 658 | 659 |
| 659 SerializedPacket QuicPacketCreator::SerializeFec(char* buffer, | 660 SerializedPacket QuicPacketCreator::SerializeFec(char* buffer, |
| 660 size_t buffer_len) { | 661 size_t buffer_len) { |
| 661 DCHECK_LT(0u, buffer_len); | 662 DCHECK_LT(0u, buffer_len); |
| 662 if (fec_group_.get() == nullptr || fec_group_->NumReceivedPackets() <= 0) { | 663 if (fec_group_.get() == nullptr || fec_group_->NumReceivedPackets() <= 0) { |
| 663 LOG(DFATAL) << "SerializeFEC called but no group or zero packets in group."; | 664 LOG(DFATAL) << "SerializeFEC called but no group or zero packets in group."; |
| 664 // TODO(jri): Make this a public method of framer? | 665 // TODO(jri): Make this a public method of framer? |
| 665 return NoPacket(); | 666 return NoPacket(); |
| 666 } | 667 } |
| 667 DCHECK_EQ(0u, queued_frames_.size()); | 668 DCHECK_EQ(0u, queued_frames_.size()); |
| 668 QuicPacketHeader header; | 669 QuicPacketHeader header; |
| 669 FillPacketHeader(fec_group_->FecGroupNumber(), true, &header); | 670 FillPacketHeader(fec_group_->FecGroupNumber(), true, &header); |
| 670 scoped_ptr<QuicPacket> packet( | 671 scoped_ptr<QuicPacket> packet( |
| 671 framer_->BuildFecPacket(header, fec_group_->PayloadParity())); | 672 framer_->BuildFecPacket(header, fec_group_->PayloadParity())); |
| 672 fec_group_.reset(nullptr); | 673 fec_group_.reset(nullptr); |
| 673 packet_size_ = 0; | 674 packet_size_ = 0; |
| 674 LOG_IF(DFATAL, packet == nullptr) | 675 LOG_IF(DFATAL, packet == nullptr) |
| 675 << "Failed to serialize fec packet for group:" | 676 << "Failed to serialize fec packet for group:" |
| 676 << fec_group_->FecGroupNumber(); | 677 << fec_group_->FecGroupNumber(); |
| 677 DCHECK_GE(max_packet_length_, packet->length()); | 678 DCHECK_GE(max_packet_length_, packet->length()); |
| 678 // Immediately encrypt the packet, to ensure we don't encrypt the same packet | 679 // Immediately encrypt the packet, to ensure we don't encrypt the same packet |
| 679 // packet number multiple times. | 680 // packet number multiple times. |
| 680 size_t encrypted_length = framer_->EncryptPayload( | 681 size_t encrypted_length = framer_->EncryptPayload( |
| 681 encryption_level_, packet_number_, *packet, buffer, buffer_len); | 682 encryption_level_, packet_number_, *packet, buffer, buffer_len); |
| 682 if (encrypted_length == 0) { | 683 if (encrypted_length == 0) { |
| 683 LOG(DFATAL) << "Failed to encrypt packet number " << packet_number_; | 684 LOG(DFATAL) << "Failed to encrypt packet number " << packet_number_; |
| 684 return NoPacket(); | 685 return NoPacket(); |
| 685 } | 686 } |
| 686 SerializedPacket serialized(header.packet_number, | 687 SerializedPacket serialized(current_path_, header.packet_number, |
| 687 header.public_header.packet_number_length, buffer, | 688 header.public_header.packet_number_length, buffer, |
| 688 encrypted_length, /* owns_buffer */ false, | 689 encrypted_length, /* owns_buffer */ false, |
| 689 QuicFramer::GetPacketEntropyHash(header), nullptr, | 690 QuicFramer::GetPacketEntropyHash(header), nullptr, |
| 690 false, false, encryption_level_); | 691 false, false, encryption_level_); |
| 691 serialized.is_fec_packet = true; | 692 serialized.is_fec_packet = true; |
| 692 return serialized; | 693 return serialized; |
| 693 } | 694 } |
| 694 | 695 |
| 695 QuicEncryptedPacket* QuicPacketCreator::SerializeVersionNegotiationPacket( | 696 QuicEncryptedPacket* QuicPacketCreator::SerializeVersionNegotiationPacket( |
| 696 const QuicVersionVector& supported_versions) { | 697 const QuicVersionVector& supported_versions) { |
| 697 DCHECK_EQ(Perspective::IS_SERVER, framer_->perspective()); | 698 DCHECK_EQ(Perspective::IS_SERVER, framer_->perspective()); |
| 698 QuicEncryptedPacket* encrypted = QuicFramer::BuildVersionNegotiationPacket( | 699 QuicEncryptedPacket* encrypted = QuicFramer::BuildVersionNegotiationPacket( |
| 699 connection_id_, supported_versions); | 700 connection_id_, supported_versions); |
| 700 DCHECK(encrypted); | 701 DCHECK(encrypted); |
| 701 DCHECK_GE(max_packet_length_, encrypted->length()); | 702 DCHECK_GE(max_packet_length_, encrypted->length()); |
| 702 return encrypted; | 703 return encrypted; |
| 703 } | 704 } |
| 704 | 705 |
| 705 SerializedPacket QuicPacketCreator::NoPacket() { | 706 SerializedPacket QuicPacketCreator::NoPacket() { |
| 706 return SerializedPacket(0, PACKET_1BYTE_PACKET_NUMBER, nullptr, 0, nullptr, | 707 return SerializedPacket(kInvalidPathId, 0, PACKET_1BYTE_PACKET_NUMBER, |
| 707 false, false); | 708 nullptr, 0, nullptr, false, false); |
| 708 } | 709 } |
| 709 | 710 |
| 710 void QuicPacketCreator::FillPacketHeader(QuicFecGroupNumber fec_group, | 711 void QuicPacketCreator::FillPacketHeader(QuicFecGroupNumber fec_group, |
| 711 bool fec_flag, | 712 bool fec_flag, |
| 712 QuicPacketHeader* header) { | 713 QuicPacketHeader* header) { |
| 713 header->public_header.connection_id = connection_id_; | 714 header->public_header.connection_id = connection_id_; |
| 714 header->public_header.connection_id_length = connection_id_length_; | 715 header->public_header.connection_id_length = connection_id_length_; |
| 715 header->public_header.reset_flag = false; | 716 header->public_header.reset_flag = false; |
| 716 header->public_header.version_flag = send_version_in_packet_; | 717 header->public_header.version_flag = send_version_in_packet_; |
| 717 header->fec_flag = fec_flag; | 718 header->fec_flag = fec_flag; |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 865 hash_map<QuicPathId, QuicPacketNumber>::iterator it = | 866 hash_map<QuicPathId, QuicPacketNumber>::iterator it = |
| 866 multipath_packet_number_.find(path_id); | 867 multipath_packet_number_.find(path_id); |
| 867 // If path_id is not in the map, it's a new path. Set packet_number to 0. | 868 // If path_id is not in the map, it's a new path. Set packet_number to 0. |
| 868 packet_number_ = it == multipath_packet_number_.end() ? 0 : it->second; | 869 packet_number_ = it == multipath_packet_number_.end() ? 0 : it->second; |
| 869 current_path_ = path_id; | 870 current_path_ = path_id; |
| 870 // Switching path needs to update packet number length. | 871 // Switching path needs to update packet number length. |
| 871 UpdatePacketNumberLength(least_packet_awaited_by_peer, max_packets_in_flight); | 872 UpdatePacketNumberLength(least_packet_awaited_by_peer, max_packets_in_flight); |
| 872 } | 873 } |
| 873 | 874 |
| 874 } // namespace net | 875 } // namespace net |
| OLD | NEW |