| 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_framer.h" | 5 #include "net/quic/quic_framer.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 2168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2179 | 2179 |
| 2180 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2180 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2181 ASSERT_TRUE(visitor_.header_.get()); | 2181 ASSERT_TRUE(visitor_.header_.get()); |
| 2182 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2182 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
| 2183 | 2183 |
| 2184 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 2184 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
| 2185 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 2185 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 2186 QuicAckFrame* frame = visitor_.ack_frames_[0]; | 2186 QuicAckFrame* frame = visitor_.ack_frames_[0]; |
| 2187 EXPECT_EQ(0xBA, frame->entropy_hash); | 2187 EXPECT_EQ(0xBA, frame->entropy_hash); |
| 2188 EXPECT_EQ(UINT64_C(0x0123456789ABF), frame->largest_observed); | 2188 EXPECT_EQ(UINT64_C(0x0123456789ABF), frame->largest_observed); |
| 2189 EXPECT_EQ(0u, frame->revived_packets.size()); | 2189 EXPECT_EQ(0u, frame->latest_revived_packet); |
| 2190 ASSERT_EQ(500u, frame->missing_packets.NumPacketsSlow()); | 2190 ASSERT_EQ(500u, frame->missing_packets.NumPacketsSlow()); |
| 2191 EXPECT_EQ(UINT64_C(0x0123456789ABE) - 499, frame->missing_packets.Min()); | 2191 EXPECT_EQ(UINT64_C(0x0123456789ABE) - 499, frame->missing_packets.Min()); |
| 2192 EXPECT_EQ(UINT64_C(0x0123456789ABE), frame->missing_packets.Max()); | 2192 EXPECT_EQ(UINT64_C(0x0123456789ABE), frame->missing_packets.Max()); |
| 2193 | 2193 |
| 2194 // Verify that the packet re-serializes identically. | 2194 // Verify that the packet re-serializes identically. |
| 2195 QuicFrames frames; | 2195 QuicFrames frames; |
| 2196 frames.push_back(QuicFrame(frame)); | 2196 frames.push_back(QuicFrame(frame)); |
| 2197 scoped_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); | 2197 scoped_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); |
| 2198 ASSERT_TRUE(data != nullptr); | 2198 ASSERT_TRUE(data != nullptr); |
| 2199 | 2199 |
| (...skipping 1816 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4016 'e', 'f', 'g', 'h', | 4016 'e', 'f', 'g', 'h', |
| 4017 'i', 'j', 'k', 'l', | 4017 'i', 'j', 'k', 'l', |
| 4018 'm', 'n', 'o', 'p', | 4018 'm', 'n', 'o', 'p', |
| 4019 }; | 4019 }; |
| 4020 // clang-format on | 4020 // clang-format on |
| 4021 | 4021 |
| 4022 scoped_ptr<QuicPacket> raw(new QuicPacket( | 4022 scoped_ptr<QuicPacket> raw(new QuicPacket( |
| 4023 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, | 4023 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, |
| 4024 !kIncludeVersion, PACKET_6BYTE_PACKET_NUMBER)); | 4024 !kIncludeVersion, PACKET_6BYTE_PACKET_NUMBER)); |
| 4025 char buffer[kMaxPacketSize]; | 4025 char buffer[kMaxPacketSize]; |
| 4026 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPayload( | 4026 size_t encrypted_length = framer_.EncryptPayload( |
| 4027 ENCRYPTION_NONE, packet_number, *raw, buffer, kMaxPacketSize)); | 4027 ENCRYPTION_NONE, packet_number, *raw, buffer, kMaxPacketSize); |
| 4028 | 4028 |
| 4029 ASSERT_TRUE(encrypted.get() != nullptr); | 4029 ASSERT_NE(0u, encrypted_length); |
| 4030 EXPECT_TRUE(CheckEncryption(packet_number, raw.get())); | 4030 EXPECT_TRUE(CheckEncryption(packet_number, raw.get())); |
| 4031 } | 4031 } |
| 4032 | 4032 |
| 4033 TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) { | 4033 TEST_P(QuicFramerTest, EncryptPacketWithVersionFlag) { |
| 4034 QuicPacketNumber packet_number = UINT64_C(0x123456789ABC); | 4034 QuicPacketNumber packet_number = UINT64_C(0x123456789ABC); |
| 4035 // clang-format off | 4035 // clang-format off |
| 4036 unsigned char packet[] = { | 4036 unsigned char packet[] = { |
| 4037 // public flags (version, 8 byte connection_id) | 4037 // public flags (version, 8 byte connection_id) |
| 4038 0x3D, | 4038 0x3D, |
| 4039 // connection_id | 4039 // connection_id |
| (...skipping 14 matching lines...) Expand all Loading... |
| 4054 'e', 'f', 'g', 'h', | 4054 'e', 'f', 'g', 'h', |
| 4055 'i', 'j', 'k', 'l', | 4055 'i', 'j', 'k', 'l', |
| 4056 'm', 'n', 'o', 'p', | 4056 'm', 'n', 'o', 'p', |
| 4057 }; | 4057 }; |
| 4058 // clang-format on | 4058 // clang-format on |
| 4059 | 4059 |
| 4060 scoped_ptr<QuicPacket> raw(new QuicPacket( | 4060 scoped_ptr<QuicPacket> raw(new QuicPacket( |
| 4061 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, | 4061 AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, |
| 4062 kIncludeVersion, PACKET_6BYTE_PACKET_NUMBER)); | 4062 kIncludeVersion, PACKET_6BYTE_PACKET_NUMBER)); |
| 4063 char buffer[kMaxPacketSize]; | 4063 char buffer[kMaxPacketSize]; |
| 4064 scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPayload( | 4064 size_t encrypted_length = framer_.EncryptPayload( |
| 4065 ENCRYPTION_NONE, packet_number, *raw, buffer, kMaxPacketSize)); | 4065 ENCRYPTION_NONE, packet_number, *raw, buffer, kMaxPacketSize); |
| 4066 | 4066 |
| 4067 ASSERT_TRUE(encrypted.get() != nullptr); | 4067 ASSERT_NE(0u, encrypted_length); |
| 4068 EXPECT_TRUE(CheckEncryption(packet_number, raw.get())); | 4068 EXPECT_TRUE(CheckEncryption(packet_number, raw.get())); |
| 4069 } | 4069 } |
| 4070 | 4070 |
| 4071 TEST_P(QuicFramerTest, AckTruncationLargePacket) { | 4071 TEST_P(QuicFramerTest, AckTruncationLargePacket) { |
| 4072 QuicPacketHeader header; | 4072 QuicPacketHeader header; |
| 4073 header.public_header.connection_id = UINT64_C(0xFEDCBA9876543210); | 4073 header.public_header.connection_id = UINT64_C(0xFEDCBA9876543210); |
| 4074 header.public_header.reset_flag = false; | 4074 header.public_header.reset_flag = false; |
| 4075 header.public_header.version_flag = false; | 4075 header.public_header.version_flag = false; |
| 4076 header.fec_flag = false; | 4076 header.fec_flag = false; |
| 4077 header.entropy_flag = false; | 4077 header.entropy_flag = false; |
| 4078 header.packet_number = UINT64_C(0x123456789ABC); | 4078 header.packet_number = UINT64_C(0x123456789ABC); |
| 4079 header.fec_group = 0; | 4079 header.fec_group = 0; |
| 4080 | 4080 |
| 4081 // Create a packet with just the ack. | 4081 // Create a packet with just the ack. |
| 4082 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u); | 4082 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u); |
| 4083 QuicFrame frame; | 4083 QuicFrame frame; |
| 4084 frame.type = ACK_FRAME; | 4084 frame.type = ACK_FRAME; |
| 4085 frame.ack_frame = &ack_frame; | 4085 frame.ack_frame = &ack_frame; |
| 4086 QuicFrames frames; | 4086 QuicFrames frames; |
| 4087 frames.push_back(frame); | 4087 frames.push_back(frame); |
| 4088 | 4088 |
| 4089 // Build an ack packet with truncation due to limit in number of nack ranges. | 4089 // Build an ack packet with truncation due to limit in number of nack ranges. |
| 4090 scoped_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames)); | 4090 scoped_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames)); |
| 4091 ASSERT_TRUE(raw_ack_packet != nullptr); | 4091 ASSERT_TRUE(raw_ack_packet != nullptr); |
| 4092 char buffer[kMaxPacketSize]; | 4092 char buffer[kMaxPacketSize]; |
| 4093 scoped_ptr<QuicEncryptedPacket> ack_packet( | 4093 size_t encrypted_length = |
| 4094 framer_.EncryptPayload(ENCRYPTION_NONE, header.packet_number, | 4094 framer_.EncryptPayload(ENCRYPTION_NONE, header.packet_number, |
| 4095 *raw_ack_packet, buffer, kMaxPacketSize)); | 4095 *raw_ack_packet, buffer, kMaxPacketSize); |
| 4096 ASSERT_NE(0u, encrypted_length); |
| 4096 // Now make sure we can turn our ack packet back into an ack frame. | 4097 // Now make sure we can turn our ack packet back into an ack frame. |
| 4097 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); | 4098 ASSERT_TRUE(framer_.ProcessPacket( |
| 4099 QuicEncryptedPacket(buffer, encrypted_length, false))); |
| 4098 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 4100 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 4099 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; | 4101 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; |
| 4100 EXPECT_TRUE(processed_ack_frame.is_truncated); | 4102 EXPECT_TRUE(processed_ack_frame.is_truncated); |
| 4101 EXPECT_EQ(510u, processed_ack_frame.largest_observed); | 4103 EXPECT_EQ(510u, processed_ack_frame.largest_observed); |
| 4102 ASSERT_EQ(255u, processed_ack_frame.missing_packets.NumPacketsSlow()); | 4104 ASSERT_EQ(255u, processed_ack_frame.missing_packets.NumPacketsSlow()); |
| 4103 EXPECT_EQ(1u, processed_ack_frame.missing_packets.Min()); | 4105 EXPECT_EQ(1u, processed_ack_frame.missing_packets.Min()); |
| 4104 EXPECT_EQ(509u, processed_ack_frame.missing_packets.Max()); | 4106 EXPECT_EQ(509u, processed_ack_frame.missing_packets.Max()); |
| 4105 } | 4107 } |
| 4106 | 4108 |
| 4107 TEST_P(QuicFramerTest, AckTruncationSmallPacket) { | 4109 TEST_P(QuicFramerTest, AckTruncationSmallPacket) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 4119 QuicFrame frame; | 4121 QuicFrame frame; |
| 4120 frame.type = ACK_FRAME; | 4122 frame.type = ACK_FRAME; |
| 4121 frame.ack_frame = &ack_frame; | 4123 frame.ack_frame = &ack_frame; |
| 4122 QuicFrames frames; | 4124 QuicFrames frames; |
| 4123 frames.push_back(frame); | 4125 frames.push_back(frame); |
| 4124 | 4126 |
| 4125 // Build an ack packet with truncation due to limit in number of nack ranges. | 4127 // Build an ack packet with truncation due to limit in number of nack ranges. |
| 4126 scoped_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames, 500)); | 4128 scoped_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames, 500)); |
| 4127 ASSERT_TRUE(raw_ack_packet != nullptr); | 4129 ASSERT_TRUE(raw_ack_packet != nullptr); |
| 4128 char buffer[kMaxPacketSize]; | 4130 char buffer[kMaxPacketSize]; |
| 4129 scoped_ptr<QuicEncryptedPacket> ack_packet( | 4131 size_t encrypted_length = |
| 4130 framer_.EncryptPayload(ENCRYPTION_NONE, header.packet_number, | 4132 framer_.EncryptPayload(ENCRYPTION_NONE, header.packet_number, |
| 4131 *raw_ack_packet, buffer, kMaxPacketSize)); | 4133 *raw_ack_packet, buffer, kMaxPacketSize); |
| 4134 ASSERT_NE(0u, encrypted_length); |
| 4132 // Now make sure we can turn our ack packet back into an ack frame. | 4135 // Now make sure we can turn our ack packet back into an ack frame. |
| 4133 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); | 4136 ASSERT_TRUE(framer_.ProcessPacket( |
| 4137 QuicEncryptedPacket(buffer, encrypted_length, false))); |
| 4134 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 4138 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 4135 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; | 4139 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; |
| 4136 EXPECT_TRUE(processed_ack_frame.is_truncated); | 4140 EXPECT_TRUE(processed_ack_frame.is_truncated); |
| 4137 EXPECT_EQ(476u, processed_ack_frame.largest_observed); | 4141 EXPECT_EQ(476u, processed_ack_frame.largest_observed); |
| 4138 ASSERT_EQ(238u, processed_ack_frame.missing_packets.NumPacketsSlow()); | 4142 ASSERT_EQ(238u, processed_ack_frame.missing_packets.NumPacketsSlow()); |
| 4139 EXPECT_EQ(1u, processed_ack_frame.missing_packets.Min()); | 4143 EXPECT_EQ(1u, processed_ack_frame.missing_packets.Min()); |
| 4140 EXPECT_EQ(475u, processed_ack_frame.missing_packets.Max()); | 4144 EXPECT_EQ(475u, processed_ack_frame.missing_packets.Max()); |
| 4141 } | 4145 } |
| 4142 | 4146 |
| 4143 TEST_P(QuicFramerTest, CleanTruncation) { | 4147 TEST_P(QuicFramerTest, CleanTruncation) { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 4158 QuicFrame frame; | 4162 QuicFrame frame; |
| 4159 frame.type = ACK_FRAME; | 4163 frame.type = ACK_FRAME; |
| 4160 frame.ack_frame = &ack_frame; | 4164 frame.ack_frame = &ack_frame; |
| 4161 QuicFrames frames; | 4165 QuicFrames frames; |
| 4162 frames.push_back(frame); | 4166 frames.push_back(frame); |
| 4163 | 4167 |
| 4164 scoped_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames)); | 4168 scoped_ptr<QuicPacket> raw_ack_packet(BuildDataPacket(header, frames)); |
| 4165 ASSERT_TRUE(raw_ack_packet != nullptr); | 4169 ASSERT_TRUE(raw_ack_packet != nullptr); |
| 4166 | 4170 |
| 4167 char buffer[kMaxPacketSize]; | 4171 char buffer[kMaxPacketSize]; |
| 4168 scoped_ptr<QuicEncryptedPacket> ack_packet( | 4172 size_t encrypted_length = |
| 4169 framer_.EncryptPayload(ENCRYPTION_NONE, header.packet_number, | 4173 framer_.EncryptPayload(ENCRYPTION_NONE, header.packet_number, |
| 4170 *raw_ack_packet, buffer, kMaxPacketSize)); | 4174 *raw_ack_packet, buffer, kMaxPacketSize); |
| 4175 ASSERT_NE(0u, encrypted_length); |
| 4171 | 4176 |
| 4172 // Now make sure we can turn our ack packet back into an ack frame. | 4177 // Now make sure we can turn our ack packet back into an ack frame. |
| 4173 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); | 4178 ASSERT_TRUE(framer_.ProcessPacket( |
| 4179 QuicEncryptedPacket(buffer, encrypted_length, false))); |
| 4174 | 4180 |
| 4175 // Test for clean truncation of the ack by comparing the length of the | 4181 // Test for clean truncation of the ack by comparing the length of the |
| 4176 // original packets to the re-serialized packets. | 4182 // original packets to the re-serialized packets. |
| 4177 frames.clear(); | 4183 frames.clear(); |
| 4178 frame.type = ACK_FRAME; | 4184 frame.type = ACK_FRAME; |
| 4179 frame.ack_frame = visitor_.ack_frames_[0]; | 4185 frame.ack_frame = visitor_.ack_frames_[0]; |
| 4180 frames.push_back(frame); | 4186 frames.push_back(frame); |
| 4181 | 4187 |
| 4182 size_t original_raw_length = raw_ack_packet->length(); | 4188 size_t original_raw_length = raw_ack_packet->length(); |
| 4183 raw_ack_packet.reset(BuildDataPacket(header, frames)); | 4189 raw_ack_packet.reset(BuildDataPacket(header, frames)); |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4395 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0); | 4401 EXPECT_CALL(visitor, OnStreamFrame(_)).Times(0); |
| 4396 EXPECT_CALL(visitor, OnAckFrame(_)).Times(0); | 4402 EXPECT_CALL(visitor, OnAckFrame(_)).Times(0); |
| 4397 EXPECT_CALL(visitor, OnPacketComplete()).Times(0); | 4403 EXPECT_CALL(visitor, OnPacketComplete()).Times(0); |
| 4398 | 4404 |
| 4399 EXPECT_FALSE(framer_.ProcessPacket(*packet)); | 4405 EXPECT_FALSE(framer_.ProcessPacket(*packet)); |
| 4400 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error()); | 4406 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error()); |
| 4401 } | 4407 } |
| 4402 | 4408 |
| 4403 } // namespace test | 4409 } // namespace test |
| 4404 } // namespace net | 4410 } // namespace net |
| OLD | NEW |