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 |