| 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_framer.h" | 5 #include "net/quic/core/quic_framer.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cstdint> | 8 #include <cstdint> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 106 // Public resets always have full connection_ids. | 106 // Public resets always have full connection_ids. |
| 107 const size_t kPublicResetPacketMessageTagOffset = | 107 const size_t kPublicResetPacketMessageTagOffset = |
| 108 kConnectionIdOffset + PACKET_8BYTE_CONNECTION_ID; | 108 kConnectionIdOffset + PACKET_8BYTE_CONNECTION_ID; |
| 109 | 109 |
| 110 class TestEncrypter : public QuicEncrypter { | 110 class TestEncrypter : public QuicEncrypter { |
| 111 public: | 111 public: |
| 112 ~TestEncrypter() override {} | 112 ~TestEncrypter() override {} |
| 113 bool SetKey(StringPiece key) override { return true; } | 113 bool SetKey(StringPiece key) override { return true; } |
| 114 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } | 114 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } |
| 115 bool EncryptPacket(QuicVersion version, | 115 bool EncryptPacket(QuicVersion version, |
| 116 QuicPathId path_id, | |
| 117 QuicPacketNumber packet_number, | 116 QuicPacketNumber packet_number, |
| 118 StringPiece associated_data, | 117 StringPiece associated_data, |
| 119 StringPiece plaintext, | 118 StringPiece plaintext, |
| 120 char* output, | 119 char* output, |
| 121 size_t* output_length, | 120 size_t* output_length, |
| 122 size_t max_output_length) override { | 121 size_t max_output_length) override { |
| 123 version_ = version; | 122 version_ = version; |
| 124 path_id_ = path_id; | |
| 125 packet_number_ = packet_number; | 123 packet_number_ = packet_number; |
| 126 associated_data_ = associated_data.as_string(); | 124 associated_data_ = associated_data.as_string(); |
| 127 plaintext_ = plaintext.as_string(); | 125 plaintext_ = plaintext.as_string(); |
| 128 memcpy(output, plaintext.data(), plaintext.length()); | 126 memcpy(output, plaintext.data(), plaintext.length()); |
| 129 *output_length = plaintext.length(); | 127 *output_length = plaintext.length(); |
| 130 return true; | 128 return true; |
| 131 } | 129 } |
| 132 size_t GetKeySize() const override { return 0; } | 130 size_t GetKeySize() const override { return 0; } |
| 133 size_t GetNoncePrefixSize() const override { return 0; } | 131 size_t GetNoncePrefixSize() const override { return 0; } |
| 134 size_t GetMaxPlaintextSize(size_t ciphertext_size) const override { | 132 size_t GetMaxPlaintextSize(size_t ciphertext_size) const override { |
| 135 return ciphertext_size; | 133 return ciphertext_size; |
| 136 } | 134 } |
| 137 size_t GetCiphertextSize(size_t plaintext_size) const override { | 135 size_t GetCiphertextSize(size_t plaintext_size) const override { |
| 138 return plaintext_size; | 136 return plaintext_size; |
| 139 } | 137 } |
| 140 StringPiece GetKey() const override { return StringPiece(); } | 138 StringPiece GetKey() const override { return StringPiece(); } |
| 141 StringPiece GetNoncePrefix() const override { return StringPiece(); } | 139 StringPiece GetNoncePrefix() const override { return StringPiece(); } |
| 142 | 140 |
| 143 QuicVersion version_; | 141 QuicVersion version_; |
| 144 Perspective perspective_; | 142 Perspective perspective_; |
| 145 QuicPathId path_id_; | |
| 146 QuicPacketNumber packet_number_; | 143 QuicPacketNumber packet_number_; |
| 147 string associated_data_; | 144 string associated_data_; |
| 148 string plaintext_; | 145 string plaintext_; |
| 149 }; | 146 }; |
| 150 | 147 |
| 151 class TestDecrypter : public QuicDecrypter { | 148 class TestDecrypter : public QuicDecrypter { |
| 152 public: | 149 public: |
| 153 ~TestDecrypter() override {} | 150 ~TestDecrypter() override {} |
| 154 bool SetKey(StringPiece key) override { return true; } | 151 bool SetKey(StringPiece key) override { return true; } |
| 155 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } | 152 bool SetNoncePrefix(StringPiece nonce_prefix) override { return true; } |
| 156 bool SetPreliminaryKey(StringPiece key) override { | 153 bool SetPreliminaryKey(StringPiece key) override { |
| 157 QUIC_BUG << "should not be called"; | 154 QUIC_BUG << "should not be called"; |
| 158 return false; | 155 return false; |
| 159 } | 156 } |
| 160 bool SetDiversificationNonce(const DiversificationNonce& key) override { | 157 bool SetDiversificationNonce(const DiversificationNonce& key) override { |
| 161 return true; | 158 return true; |
| 162 } | 159 } |
| 163 bool DecryptPacket(QuicVersion version, | 160 bool DecryptPacket(QuicVersion version, |
| 164 QuicPathId path_id, | |
| 165 QuicPacketNumber packet_number, | 161 QuicPacketNumber packet_number, |
| 166 StringPiece associated_data, | 162 StringPiece associated_data, |
| 167 StringPiece ciphertext, | 163 StringPiece ciphertext, |
| 168 char* output, | 164 char* output, |
| 169 size_t* output_length, | 165 size_t* output_length, |
| 170 size_t max_output_length) override { | 166 size_t max_output_length) override { |
| 171 version_ = version; | 167 version_ = version; |
| 172 path_id_ = path_id; | |
| 173 packet_number_ = packet_number; | 168 packet_number_ = packet_number; |
| 174 associated_data_ = associated_data.as_string(); | 169 associated_data_ = associated_data.as_string(); |
| 175 ciphertext_ = ciphertext.as_string(); | 170 ciphertext_ = ciphertext.as_string(); |
| 176 memcpy(output, ciphertext.data(), ciphertext.length()); | 171 memcpy(output, ciphertext.data(), ciphertext.length()); |
| 177 *output_length = ciphertext.length(); | 172 *output_length = ciphertext.length(); |
| 178 return true; | 173 return true; |
| 179 } | 174 } |
| 180 StringPiece GetKey() const override { return StringPiece(); } | 175 StringPiece GetKey() const override { return StringPiece(); } |
| 181 StringPiece GetNoncePrefix() const override { return StringPiece(); } | 176 StringPiece GetNoncePrefix() const override { return StringPiece(); } |
| 182 const char* cipher_name() const override { return "Test"; } | 177 const char* cipher_name() const override { return "Test"; } |
| 183 // Use a distinct value starting with 0xFFFFFF, which is never used by TLS. | 178 // Use a distinct value starting with 0xFFFFFF, which is never used by TLS. |
| 184 uint32_t cipher_id() const override { return 0xFFFFFFF2; } | 179 uint32_t cipher_id() const override { return 0xFFFFFFF2; } |
| 185 QuicVersion version_; | 180 QuicVersion version_; |
| 186 Perspective perspective_; | 181 Perspective perspective_; |
| 187 QuicPathId path_id_; | |
| 188 QuicPacketNumber packet_number_; | 182 QuicPacketNumber packet_number_; |
| 189 string associated_data_; | 183 string associated_data_; |
| 190 string ciphertext_; | 184 string ciphertext_; |
| 191 }; | 185 }; |
| 192 | 186 |
| 193 class TestQuicVisitor : public QuicFramerVisitorInterface { | 187 class TestQuicVisitor : public QuicFramerVisitorInterface { |
| 194 public: | 188 public: |
| 195 TestQuicVisitor() | 189 TestQuicVisitor() |
| 196 : error_count_(0), | 190 : error_count_(0), |
| 197 version_mismatch_(0), | 191 version_mismatch_(0), |
| (...skipping 3567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3765 'i', 'j', 'k', 'l', | 3759 'i', 'j', 'k', 'l', |
| 3766 'm', 'n', 'o', 'p', | 3760 'm', 'n', 'o', 'p', |
| 3767 }; | 3761 }; |
| 3768 // clang-format on | 3762 // clang-format on |
| 3769 | 3763 |
| 3770 std::unique_ptr<QuicPacket> raw(new QuicPacket( | 3764 std::unique_ptr<QuicPacket> raw(new QuicPacket( |
| 3771 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, | 3765 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, |
| 3772 !kIncludeVersion, !kIncludePathId, !kIncludeDiversificationNonce, | 3766 !kIncludeVersion, !kIncludePathId, !kIncludeDiversificationNonce, |
| 3773 PACKET_6BYTE_PACKET_NUMBER)); | 3767 PACKET_6BYTE_PACKET_NUMBER)); |
| 3774 char buffer[kMaxPacketSize]; | 3768 char buffer[kMaxPacketSize]; |
| 3775 size_t encrypted_length = | 3769 size_t encrypted_length = framer_.EncryptPayload( |
| 3776 framer_.EncryptPayload(ENCRYPTION_NONE, kDefaultPathId, packet_number, | 3770 ENCRYPTION_NONE, packet_number, *raw, buffer, kMaxPacketSize); |
| 3777 *raw, buffer, kMaxPacketSize); | |
| 3778 | 3771 |
| 3779 ASSERT_NE(0u, encrypted_length); | 3772 ASSERT_NE(0u, encrypted_length); |
| 3780 EXPECT_TRUE(CheckEncryption(kDefaultPathId, packet_number, raw.get())); | 3773 EXPECT_TRUE(CheckEncryption(kDefaultPathId, packet_number, raw.get())); |
| 3781 } | 3774 } |
| 3782 | 3775 |
| 3783 TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) { | 3776 TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) { |
| 3784 QuicPacketNumber packet_number = kPacketNumber; | 3777 QuicPacketNumber packet_number = kPacketNumber; |
| 3785 // clang-format off | 3778 // clang-format off |
| 3786 unsigned char packet[] = { | 3779 unsigned char packet[] = { |
| 3787 // public flags (version, 8 byte connection_id) | 3780 // public flags (version, 8 byte connection_id) |
| (...skipping 13 matching lines...) Expand all Loading... |
| 3801 'i', 'j', 'k', 'l', | 3794 'i', 'j', 'k', 'l', |
| 3802 'm', 'n', 'o', 'p', | 3795 'm', 'n', 'o', 'p', |
| 3803 }; | 3796 }; |
| 3804 // clang-format on | 3797 // clang-format on |
| 3805 | 3798 |
| 3806 std::unique_ptr<QuicPacket> raw(new QuicPacket( | 3799 std::unique_ptr<QuicPacket> raw(new QuicPacket( |
| 3807 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, | 3800 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, |
| 3808 kIncludeVersion, !kIncludePathId, !kIncludeDiversificationNonce, | 3801 kIncludeVersion, !kIncludePathId, !kIncludeDiversificationNonce, |
| 3809 PACKET_6BYTE_PACKET_NUMBER)); | 3802 PACKET_6BYTE_PACKET_NUMBER)); |
| 3810 char buffer[kMaxPacketSize]; | 3803 char buffer[kMaxPacketSize]; |
| 3811 size_t encrypted_length = | 3804 size_t encrypted_length = framer_.EncryptPayload( |
| 3812 framer_.EncryptPayload(ENCRYPTION_NONE, kDefaultPathId, packet_number, | 3805 ENCRYPTION_NONE, packet_number, *raw, buffer, kMaxPacketSize); |
| 3813 *raw, buffer, kMaxPacketSize); | |
| 3814 | 3806 |
| 3815 ASSERT_NE(0u, encrypted_length); | 3807 ASSERT_NE(0u, encrypted_length); |
| 3816 EXPECT_TRUE(CheckEncryption(kDefaultPathId, packet_number, raw.get())); | 3808 EXPECT_TRUE(CheckEncryption(kDefaultPathId, packet_number, raw.get())); |
| 3817 } | 3809 } |
| 3818 | 3810 |
| 3819 TEST_P(QuicFramerTest, EncryptPacketWithMultipathFlag) { | 3811 TEST_P(QuicFramerTest, EncryptPacketWithMultipathFlag) { |
| 3820 QuicPacketNumber packet_number = kPacketNumber; | 3812 QuicPacketNumber packet_number = kPacketNumber; |
| 3821 // clang-format off | 3813 // clang-format off |
| 3822 unsigned char packet[] = { | 3814 unsigned char packet[] = { |
| 3823 // public flags (version, 8 byte connection_id) | 3815 // public flags (version, 8 byte connection_id) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 3838 'm', 'n', 'o', 'p', | 3830 'm', 'n', 'o', 'p', |
| 3839 }; | 3831 }; |
| 3840 // clang-format on | 3832 // clang-format on |
| 3841 | 3833 |
| 3842 std::unique_ptr<QuicPacket> raw(new QuicPacket( | 3834 std::unique_ptr<QuicPacket> raw(new QuicPacket( |
| 3843 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, | 3835 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, |
| 3844 !kIncludeVersion, kIncludePathId, !kIncludeDiversificationNonce, | 3836 !kIncludeVersion, kIncludePathId, !kIncludeDiversificationNonce, |
| 3845 PACKET_6BYTE_PACKET_NUMBER)); | 3837 PACKET_6BYTE_PACKET_NUMBER)); |
| 3846 char buffer[kMaxPacketSize]; | 3838 char buffer[kMaxPacketSize]; |
| 3847 size_t encrypted_length = framer_.EncryptPayload( | 3839 size_t encrypted_length = framer_.EncryptPayload( |
| 3848 ENCRYPTION_NONE, kPathId, packet_number, *raw, buffer, kMaxPacketSize); | 3840 ENCRYPTION_NONE, packet_number, *raw, buffer, kMaxPacketSize); |
| 3849 | 3841 |
| 3850 ASSERT_NE(0u, encrypted_length); | 3842 ASSERT_NE(0u, encrypted_length); |
| 3851 EXPECT_TRUE(CheckEncryption(kPathId, packet_number, raw.get())); | 3843 EXPECT_TRUE(CheckEncryption(kPathId, packet_number, raw.get())); |
| 3852 } | 3844 } |
| 3853 | 3845 |
| 3854 TEST_P(QuicFramerTest, EncryptPacketWithBothVersionFlagAndMultipathFlag) { | 3846 TEST_P(QuicFramerTest, EncryptPacketWithBothVersionFlagAndMultipathFlag) { |
| 3855 QuicPacketNumber packet_number = kPacketNumber; | 3847 QuicPacketNumber packet_number = kPacketNumber; |
| 3856 // clang-format off | 3848 // clang-format off |
| 3857 unsigned char packet[] = { | 3849 unsigned char packet[] = { |
| 3858 // public flags (version, 8 byte connection_id) | 3850 // public flags (version, 8 byte connection_id) |
| (...skipping 16 matching lines...) Expand all Loading... |
| 3875 'm', 'n', 'o', 'p', | 3867 'm', 'n', 'o', 'p', |
| 3876 }; | 3868 }; |
| 3877 // clang-format on | 3869 // clang-format on |
| 3878 | 3870 |
| 3879 std::unique_ptr<QuicPacket> raw(new QuicPacket( | 3871 std::unique_ptr<QuicPacket> raw(new QuicPacket( |
| 3880 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, | 3872 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, |
| 3881 kIncludeVersion, kIncludePathId, !kIncludeDiversificationNonce, | 3873 kIncludeVersion, kIncludePathId, !kIncludeDiversificationNonce, |
| 3882 PACKET_6BYTE_PACKET_NUMBER)); | 3874 PACKET_6BYTE_PACKET_NUMBER)); |
| 3883 char buffer[kMaxPacketSize]; | 3875 char buffer[kMaxPacketSize]; |
| 3884 size_t encrypted_length = framer_.EncryptPayload( | 3876 size_t encrypted_length = framer_.EncryptPayload( |
| 3885 ENCRYPTION_NONE, kPathId, packet_number, *raw, buffer, kMaxPacketSize); | 3877 ENCRYPTION_NONE, packet_number, *raw, buffer, kMaxPacketSize); |
| 3886 | 3878 |
| 3887 ASSERT_NE(0u, encrypted_length); | 3879 ASSERT_NE(0u, encrypted_length); |
| 3888 EXPECT_TRUE(CheckEncryption(kPathId, packet_number, raw.get())); | 3880 EXPECT_TRUE(CheckEncryption(kPathId, packet_number, raw.get())); |
| 3889 } | 3881 } |
| 3890 | 3882 |
| 3891 TEST_P(QuicFramerTest, AckTruncationLargePacket) { | 3883 TEST_P(QuicFramerTest, AckTruncationLargePacket) { |
| 3892 QuicPacketHeader header; | 3884 QuicPacketHeader header; |
| 3893 header.public_header.connection_id = kConnectionId; | 3885 header.public_header.connection_id = kConnectionId; |
| 3894 header.public_header.reset_flag = false; | 3886 header.public_header.reset_flag = false; |
| 3895 header.public_header.version_flag = false; | 3887 header.public_header.version_flag = false; |
| 3896 header.packet_number = kPacketNumber; | 3888 header.packet_number = kPacketNumber; |
| 3897 | 3889 |
| 3898 QuicAckFrame ack_frame; | 3890 QuicAckFrame ack_frame; |
| 3899 // Create a packet with just the ack. | 3891 // Create a packet with just the ack. |
| 3900 ack_frame = MakeAckFrameWithAckBlocks(300, 0u); | 3892 ack_frame = MakeAckFrameWithAckBlocks(300, 0u); |
| 3901 QuicFrames frames = {QuicFrame(&ack_frame)}; | 3893 QuicFrames frames = {QuicFrame(&ack_frame)}; |
| 3902 | 3894 |
| 3903 // Build an ack packet with truncation due to limit in number of nack ranges. | 3895 // Build an ack packet with truncation due to limit in number of nack ranges. |
| 3904 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames)); | 3896 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames)); |
| 3905 ASSERT_TRUE(raw_ack_packet != nullptr); | 3897 ASSERT_TRUE(raw_ack_packet != nullptr); |
| 3906 char buffer[kMaxPacketSize]; | 3898 char buffer[kMaxPacketSize]; |
| 3907 size_t encrypted_length = framer_.EncryptPayload( | 3899 size_t encrypted_length = |
| 3908 ENCRYPTION_NONE, kDefaultPathId, header.packet_number, *raw_ack_packet, | 3900 framer_.EncryptPayload(ENCRYPTION_NONE, header.packet_number, |
| 3909 buffer, kMaxPacketSize); | 3901 *raw_ack_packet, buffer, kMaxPacketSize); |
| 3910 ASSERT_NE(0u, encrypted_length); | 3902 ASSERT_NE(0u, encrypted_length); |
| 3911 // Now make sure we can turn our ack packet back into an ack frame. | 3903 // Now make sure we can turn our ack packet back into an ack frame. |
| 3912 ASSERT_TRUE(framer_.ProcessPacket( | 3904 ASSERT_TRUE(framer_.ProcessPacket( |
| 3913 QuicEncryptedPacket(buffer, encrypted_length, false))); | 3905 QuicEncryptedPacket(buffer, encrypted_length, false))); |
| 3914 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 3906 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 3915 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; | 3907 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; |
| 3916 EXPECT_EQ(600u, processed_ack_frame.largest_observed); | 3908 EXPECT_EQ(600u, processed_ack_frame.largest_observed); |
| 3917 ASSERT_EQ(256u, processed_ack_frame.packets.NumPacketsSlow()); | 3909 ASSERT_EQ(256u, processed_ack_frame.packets.NumPacketsSlow()); |
| 3918 EXPECT_EQ(90u, processed_ack_frame.packets.Min()); | 3910 EXPECT_EQ(90u, processed_ack_frame.packets.Min()); |
| 3919 EXPECT_EQ(600u, processed_ack_frame.packets.Max()); | 3911 EXPECT_EQ(600u, processed_ack_frame.packets.Max()); |
| 3920 } | 3912 } |
| 3921 | 3913 |
| 3922 TEST_P(QuicFramerTest, AckTruncationSmallPacket) { | 3914 TEST_P(QuicFramerTest, AckTruncationSmallPacket) { |
| 3923 QuicPacketHeader header; | 3915 QuicPacketHeader header; |
| 3924 header.public_header.connection_id = kConnectionId; | 3916 header.public_header.connection_id = kConnectionId; |
| 3925 header.public_header.reset_flag = false; | 3917 header.public_header.reset_flag = false; |
| 3926 header.public_header.version_flag = false; | 3918 header.public_header.version_flag = false; |
| 3927 header.packet_number = kPacketNumber; | 3919 header.packet_number = kPacketNumber; |
| 3928 | 3920 |
| 3929 // Create a packet with just the ack. | 3921 // Create a packet with just the ack. |
| 3930 QuicAckFrame ack_frame; | 3922 QuicAckFrame ack_frame; |
| 3931 ack_frame = MakeAckFrameWithAckBlocks(300, 0u); | 3923 ack_frame = MakeAckFrameWithAckBlocks(300, 0u); |
| 3932 QuicFrames frames = {QuicFrame(&ack_frame)}; | 3924 QuicFrames frames = {QuicFrame(&ack_frame)}; |
| 3933 | 3925 |
| 3934 // Build an ack packet with truncation due to limit in number of nack ranges. | 3926 // Build an ack packet with truncation due to limit in number of nack ranges. |
| 3935 std::unique_ptr<QuicPacket> raw_ack_packet( | 3927 std::unique_ptr<QuicPacket> raw_ack_packet( |
| 3936 BuildDataPacket(header, frames, 500)); | 3928 BuildDataPacket(header, frames, 500)); |
| 3937 ASSERT_TRUE(raw_ack_packet != nullptr); | 3929 ASSERT_TRUE(raw_ack_packet != nullptr); |
| 3938 char buffer[kMaxPacketSize]; | 3930 char buffer[kMaxPacketSize]; |
| 3939 size_t encrypted_length = framer_.EncryptPayload( | 3931 size_t encrypted_length = |
| 3940 ENCRYPTION_NONE, kDefaultPathId, header.packet_number, *raw_ack_packet, | 3932 framer_.EncryptPayload(ENCRYPTION_NONE, header.packet_number, |
| 3941 buffer, kMaxPacketSize); | 3933 *raw_ack_packet, buffer, kMaxPacketSize); |
| 3942 ASSERT_NE(0u, encrypted_length); | 3934 ASSERT_NE(0u, encrypted_length); |
| 3943 // Now make sure we can turn our ack packet back into an ack frame. | 3935 // Now make sure we can turn our ack packet back into an ack frame. |
| 3944 ASSERT_TRUE(framer_.ProcessPacket( | 3936 ASSERT_TRUE(framer_.ProcessPacket( |
| 3945 QuicEncryptedPacket(buffer, encrypted_length, false))); | 3937 QuicEncryptedPacket(buffer, encrypted_length, false))); |
| 3946 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 3938 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 3947 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; | 3939 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; |
| 3948 EXPECT_EQ(600u, processed_ack_frame.largest_observed); | 3940 EXPECT_EQ(600u, processed_ack_frame.largest_observed); |
| 3949 ASSERT_EQ(239u, processed_ack_frame.packets.NumPacketsSlow()); | 3941 ASSERT_EQ(239u, processed_ack_frame.packets.NumPacketsSlow()); |
| 3950 EXPECT_EQ(124u, processed_ack_frame.packets.Min()); | 3942 EXPECT_EQ(124u, processed_ack_frame.packets.Min()); |
| 3951 EXPECT_EQ(600u, processed_ack_frame.packets.Max()); | 3943 EXPECT_EQ(600u, processed_ack_frame.packets.Max()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 3962 ack_frame.largest_observed = 201; | 3954 ack_frame.largest_observed = 201; |
| 3963 ack_frame.packets.Add(1, ack_frame.largest_observed); | 3955 ack_frame.packets.Add(1, ack_frame.largest_observed); |
| 3964 | 3956 |
| 3965 // Create a packet with just the ack. | 3957 // Create a packet with just the ack. |
| 3966 QuicFrames frames = {QuicFrame(&ack_frame)}; | 3958 QuicFrames frames = {QuicFrame(&ack_frame)}; |
| 3967 | 3959 |
| 3968 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames)); | 3960 std::unique_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames)); |
| 3969 ASSERT_TRUE(raw_ack_packet != nullptr); | 3961 ASSERT_TRUE(raw_ack_packet != nullptr); |
| 3970 | 3962 |
| 3971 char buffer[kMaxPacketSize]; | 3963 char buffer[kMaxPacketSize]; |
| 3972 size_t encrypted_length = framer_.EncryptPayload( | 3964 size_t encrypted_length = |
| 3973 ENCRYPTION_NONE, kDefaultPathId, header.packet_number, *raw_ack_packet, | 3965 framer_.EncryptPayload(ENCRYPTION_NONE, header.packet_number, |
| 3974 buffer, kMaxPacketSize); | 3966 *raw_ack_packet, buffer, kMaxPacketSize); |
| 3975 ASSERT_NE(0u, encrypted_length); | 3967 ASSERT_NE(0u, encrypted_length); |
| 3976 | 3968 |
| 3977 // Now make sure we can turn our ack packet back into an ack frame. | 3969 // Now make sure we can turn our ack packet back into an ack frame. |
| 3978 ASSERT_TRUE(framer_.ProcessPacket( | 3970 ASSERT_TRUE(framer_.ProcessPacket( |
| 3979 QuicEncryptedPacket(buffer, encrypted_length, false))); | 3971 QuicEncryptedPacket(buffer, encrypted_length, false))); |
| 3980 | 3972 |
| 3981 // Test for clean truncation of the ack by comparing the length of the | 3973 // Test for clean truncation of the ack by comparing the length of the |
| 3982 // original packets to the re-serialized packets. | 3974 // original packets to the re-serialized packets. |
| 3983 frames.clear(); | 3975 frames.clear(); |
| 3984 frames.push_back(QuicFrame(visitor_.ack_frames_[0].get())); | 3976 frames.push_back(QuicFrame(visitor_.ack_frames_[0].get())); |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4186 'o', ' ', 'w', 'o', | 4178 'o', ' ', 'w', 'o', |
| 4187 'r', 'l', 'd', '!', | 4179 'r', 'l', 'd', '!', |
| 4188 }; | 4180 }; |
| 4189 // clang-format on | 4181 // clang-format on |
| 4190 | 4182 |
| 4191 QuicFramerFuzzFunc(packet, arraysize(packet)); | 4183 QuicFramerFuzzFunc(packet, arraysize(packet)); |
| 4192 } | 4184 } |
| 4193 | 4185 |
| 4194 } // namespace test | 4186 } // namespace test |
| 4195 } // namespace net | 4187 } // namespace net |
| OLD | NEW |