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 <algorithm> | 7 #include <algorithm> |
8 #include <map> | 8 #include <map> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | 10 #include <vector> |
(...skipping 1732 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1743 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; | 1743 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; |
1744 const size_t kReceivedEntropyOffset = kLeastUnackedOffset + | 1744 const size_t kReceivedEntropyOffset = kLeastUnackedOffset + |
1745 PACKET_6BYTE_SEQUENCE_NUMBER; | 1745 PACKET_6BYTE_SEQUENCE_NUMBER; |
1746 const size_t kLargestObservedOffset = kReceivedEntropyOffset + | 1746 const size_t kLargestObservedOffset = kReceivedEntropyOffset + |
1747 kQuicEntropyHashSize; | 1747 kQuicEntropyHashSize; |
1748 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + | 1748 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + |
1749 PACKET_6BYTE_SEQUENCE_NUMBER; | 1749 PACKET_6BYTE_SEQUENCE_NUMBER; |
1750 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + | 1750 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + |
1751 kQuicDeltaTimeLargestObservedSize; | 1751 kQuicDeltaTimeLargestObservedSize; |
1752 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + | 1752 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + |
1753 kNumberOfMissingPacketsSize; | 1753 kNumberOfNackRangesSize; |
1754 const size_t kMissingPacketsRange = kMissingPacketsOffset + | 1754 const size_t kMissingPacketsRange = kMissingPacketsOffset + |
1755 PACKET_1BYTE_SEQUENCE_NUMBER; | 1755 PACKET_1BYTE_SEQUENCE_NUMBER; |
1756 const size_t kRevivedPacketsLength = kMissingPacketsRange + | 1756 const size_t kRevivedPacketsLength = kMissingPacketsRange + |
1757 PACKET_1BYTE_SEQUENCE_NUMBER; | 1757 PACKET_1BYTE_SEQUENCE_NUMBER; |
1758 // Now test framing boundaries | 1758 // Now test framing boundaries |
1759 const size_t ack_frame_size = kRevivedPacketsLength + | 1759 const size_t ack_frame_size = kRevivedPacketsLength + |
1760 PACKET_1BYTE_SEQUENCE_NUMBER; | 1760 PACKET_1BYTE_SEQUENCE_NUMBER; |
1761 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | 1761 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { |
1762 string expected_error; | 1762 string expected_error; |
1763 if (i < kLeastUnackedOffset) { | 1763 if (i < kLeastUnackedOffset) { |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1842 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); | 1842 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); |
1843 | 1843 |
1844 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | 1844 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; |
1845 const size_t kLargestObservedOffset = kReceivedEntropyOffset + | 1845 const size_t kLargestObservedOffset = kReceivedEntropyOffset + |
1846 kQuicEntropyHashSize; | 1846 kQuicEntropyHashSize; |
1847 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + | 1847 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + |
1848 PACKET_6BYTE_SEQUENCE_NUMBER; | 1848 PACKET_6BYTE_SEQUENCE_NUMBER; |
1849 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + | 1849 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + |
1850 kQuicDeltaTimeLargestObservedSize; | 1850 kQuicDeltaTimeLargestObservedSize; |
1851 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + | 1851 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + |
1852 kNumberOfMissingPacketsSize; | 1852 kNumberOfNackRangesSize; |
1853 const size_t kMissingPacketsRange = kMissingPacketsOffset + | 1853 const size_t kMissingPacketsRange = kMissingPacketsOffset + |
1854 PACKET_1BYTE_SEQUENCE_NUMBER; | 1854 PACKET_1BYTE_SEQUENCE_NUMBER; |
1855 const size_t kRevivedPacketsLength = kMissingPacketsRange + | 1855 const size_t kRevivedPacketsLength = kMissingPacketsRange + |
1856 PACKET_1BYTE_SEQUENCE_NUMBER; | 1856 PACKET_1BYTE_SEQUENCE_NUMBER; |
1857 // Now test framing boundaries | 1857 // Now test framing boundaries |
1858 const size_t ack_frame_size = kRevivedPacketsLength + | 1858 const size_t ack_frame_size = kRevivedPacketsLength + |
1859 PACKET_1BYTE_SEQUENCE_NUMBER; | 1859 PACKET_1BYTE_SEQUENCE_NUMBER; |
1860 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | 1860 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { |
1861 string expected_error; | 1861 string expected_error; |
1862 if (i < kLargestObservedOffset) { | 1862 if (i < kLargestObservedOffset) { |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1940 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); | 1940 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); |
1941 | 1941 |
1942 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | 1942 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; |
1943 const size_t kLargestObservedOffset = kReceivedEntropyOffset + | 1943 const size_t kLargestObservedOffset = kReceivedEntropyOffset + |
1944 kQuicEntropyHashSize; | 1944 kQuicEntropyHashSize; |
1945 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + | 1945 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + |
1946 PACKET_6BYTE_SEQUENCE_NUMBER; | 1946 PACKET_6BYTE_SEQUENCE_NUMBER; |
1947 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + | 1947 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + |
1948 kQuicDeltaTimeLargestObservedSize; | 1948 kQuicDeltaTimeLargestObservedSize; |
1949 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + | 1949 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + |
1950 kNumberOfMissingPacketsSize; | 1950 kNumberOfNackRangesSize; |
1951 const size_t kMissingPacketsRange = kMissingPacketsOffset + | 1951 const size_t kMissingPacketsRange = kMissingPacketsOffset + |
1952 PACKET_1BYTE_SEQUENCE_NUMBER; | 1952 PACKET_1BYTE_SEQUENCE_NUMBER; |
1953 const size_t kRevivedPacketsLength = kMissingPacketsRange + | 1953 const size_t kRevivedPacketsLength = kMissingPacketsRange + |
1954 PACKET_1BYTE_SEQUENCE_NUMBER; | 1954 PACKET_1BYTE_SEQUENCE_NUMBER; |
1955 const size_t kRevivedPacketSequenceNumberLength = kRevivedPacketsLength + | 1955 const size_t kRevivedPacketSequenceNumberLength = kRevivedPacketsLength + |
1956 PACKET_1BYTE_SEQUENCE_NUMBER; | 1956 PACKET_1BYTE_SEQUENCE_NUMBER; |
1957 // Now test framing boundaries | 1957 // Now test framing boundaries |
1958 const size_t ack_frame_size = kRevivedPacketSequenceNumberLength + | 1958 const size_t ack_frame_size = kRevivedPacketSequenceNumberLength + |
1959 PACKET_6BYTE_SEQUENCE_NUMBER; | 1959 PACKET_6BYTE_SEQUENCE_NUMBER; |
1960 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | 1960 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2054 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; | 2054 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; |
2055 const size_t kReceivedEntropyOffset = kLeastUnackedOffset + | 2055 const size_t kReceivedEntropyOffset = kLeastUnackedOffset + |
2056 PACKET_6BYTE_SEQUENCE_NUMBER; | 2056 PACKET_6BYTE_SEQUENCE_NUMBER; |
2057 const size_t kLargestObservedOffset = kReceivedEntropyOffset + | 2057 const size_t kLargestObservedOffset = kReceivedEntropyOffset + |
2058 kQuicEntropyHashSize; | 2058 kQuicEntropyHashSize; |
2059 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + | 2059 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + |
2060 PACKET_6BYTE_SEQUENCE_NUMBER; | 2060 PACKET_6BYTE_SEQUENCE_NUMBER; |
2061 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + | 2061 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + |
2062 kQuicDeltaTimeLargestObservedSize; | 2062 kQuicDeltaTimeLargestObservedSize; |
2063 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + | 2063 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + |
2064 kNumberOfMissingPacketsSize; | 2064 kNumberOfNackRangesSize; |
2065 const size_t kMissingPacketsRange = kMissingPacketsOffset + | 2065 const size_t kMissingPacketsRange = kMissingPacketsOffset + |
2066 PACKET_1BYTE_SEQUENCE_NUMBER; | 2066 PACKET_1BYTE_SEQUENCE_NUMBER; |
2067 const size_t kRevivedPacketsLength = kMissingPacketsRange + | 2067 const size_t kRevivedPacketsLength = kMissingPacketsRange + |
2068 PACKET_1BYTE_SEQUENCE_NUMBER; | 2068 PACKET_1BYTE_SEQUENCE_NUMBER; |
2069 const size_t kRevivedPacketSequenceNumberLength = kRevivedPacketsLength + | 2069 const size_t kRevivedPacketSequenceNumberLength = kRevivedPacketsLength + |
2070 PACKET_1BYTE_SEQUENCE_NUMBER; | 2070 PACKET_1BYTE_SEQUENCE_NUMBER; |
2071 // Now test framing boundaries | 2071 // Now test framing boundaries |
2072 const size_t ack_frame_size = kRevivedPacketSequenceNumberLength + | 2072 const size_t ack_frame_size = kRevivedPacketSequenceNumberLength + |
2073 PACKET_6BYTE_SEQUENCE_NUMBER; | 2073 PACKET_6BYTE_SEQUENCE_NUMBER; |
2074 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | 2074 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { |
(...skipping 1640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3715 | 3715 |
3716 scoped_ptr<QuicPacket> data( | 3716 scoped_ptr<QuicPacket> data( |
3717 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3717 framer_.BuildUnsizedDataPacket(header, frames).packet); |
3718 ASSERT_TRUE(data != NULL); | 3718 ASSERT_TRUE(data != NULL); |
3719 | 3719 |
3720 test::CompareCharArraysWithHexError("constructed packet", | 3720 test::CompareCharArraysWithHexError("constructed packet", |
3721 data->data(), data->length(), | 3721 data->data(), data->length(), |
3722 AsChars(packet), arraysize(packet)); | 3722 AsChars(packet), arraysize(packet)); |
3723 } | 3723 } |
3724 | 3724 |
| 3725 // TODO(jri): Add test for tuncated packets in which the original ack frame had |
| 3726 // revived packets. (In both the large and small packet cases below). |
| 3727 TEST_P(QuicFramerTest, BuildTruncatedAckFrameLargePacket) { |
| 3728 if (version_ <= QUIC_VERSION_15) { |
| 3729 return; |
| 3730 } |
| 3731 QuicPacketHeader header; |
| 3732 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
| 3733 header.public_header.reset_flag = false; |
| 3734 header.public_header.version_flag = false; |
| 3735 header.fec_flag = false; |
| 3736 header.entropy_flag = true; |
| 3737 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); |
| 3738 header.fec_group = 0; |
| 3739 |
| 3740 QuicAckFrame ack_frame; |
| 3741 // This entropy hash is different from what shows up in the packet below, |
| 3742 // since entropy is recomputed by the framer on ack truncation (by |
| 3743 // TestEntropyCalculator for this test.) |
| 3744 ack_frame.received_info.entropy_hash = 0x43; |
| 3745 ack_frame.received_info.largest_observed = 2 * 300; |
| 3746 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero(); |
| 3747 for (size_t i = 1; i < 2 * 300; i += 2) { |
| 3748 ack_frame.received_info.missing_packets.insert(i); |
| 3749 } |
| 3750 |
| 3751 QuicFrames frames; |
| 3752 frames.push_back(QuicFrame(&ack_frame)); |
| 3753 |
| 3754 unsigned char packet[] = { |
| 3755 // public flags (8 byte connection_id) |
| 3756 0x3C, |
| 3757 // connection_id |
| 3758 0x10, 0x32, 0x54, 0x76, |
| 3759 0x98, 0xBA, 0xDC, 0xFE, |
| 3760 // packet sequence number |
| 3761 0xA8, 0x9A, 0x78, 0x56, |
| 3762 0x34, 0x12, |
| 3763 // private flags (entropy) |
| 3764 0x01, |
| 3765 |
| 3766 // frame type (ack frame) |
| 3767 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta) |
| 3768 0x74, |
| 3769 // entropy hash of all received packets, set to 1 by TestEntropyCalculator |
| 3770 // since ack is truncated. |
| 3771 0x01, |
| 3772 // 2-byte largest observed packet sequence number. |
| 3773 // Expected to be 510 (0x1FE), since only 255 nack ranges can fit. |
| 3774 0xFE, 0x01, |
| 3775 // Zero delta time. |
| 3776 0x0, 0x0, |
| 3777 // num missing packet ranges (limited to 255 by size of this field). |
| 3778 0xFF, |
| 3779 // {missing packet delta, further missing packets in range} |
| 3780 // 6 nack ranges x 42 + 3 nack ranges |
| 3781 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3782 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3783 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3784 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3785 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3786 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3787 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3788 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3789 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3790 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3791 |
| 3792 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3793 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3794 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3795 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3796 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3797 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3798 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3799 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3800 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3801 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3802 |
| 3803 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3804 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3805 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3806 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3807 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3808 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3809 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3810 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3811 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3812 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3813 |
| 3814 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3815 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3816 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3817 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3818 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3819 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3820 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3821 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3822 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3823 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3824 |
| 3825 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3826 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3827 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3828 |
| 3829 // 0 revived packets. |
| 3830 0x00, |
| 3831 }; |
| 3832 |
| 3833 scoped_ptr<QuicPacket> data( |
| 3834 framer_.BuildDataPacket(header, frames, kMaxPacketSize).packet); |
| 3835 ASSERT_TRUE(data != NULL); |
| 3836 |
| 3837 test::CompareCharArraysWithHexError("constructed packet", |
| 3838 data->data(), data->length(), |
| 3839 AsChars(packet), arraysize(packet)); |
| 3840 } |
| 3841 |
| 3842 |
| 3843 TEST_P(QuicFramerTest, BuildTruncatedAckFrameSmallPacket) { |
| 3844 if (version_ <= QUIC_VERSION_15) { |
| 3845 return; |
| 3846 } |
| 3847 QuicPacketHeader header; |
| 3848 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
| 3849 header.public_header.reset_flag = false; |
| 3850 header.public_header.version_flag = false; |
| 3851 header.fec_flag = false; |
| 3852 header.entropy_flag = true; |
| 3853 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); |
| 3854 header.fec_group = 0; |
| 3855 |
| 3856 QuicAckFrame ack_frame; |
| 3857 // This entropy hash is different from what shows up in the packet below, |
| 3858 // since entropy is recomputed by the framer on ack truncation (by |
| 3859 // TestEntropyCalculator for this test.) |
| 3860 ack_frame.received_info.entropy_hash = 0x43; |
| 3861 ack_frame.received_info.largest_observed = 2 * 300; |
| 3862 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero(); |
| 3863 for (size_t i = 1; i < 2 * 300; i += 2) { |
| 3864 ack_frame.received_info.missing_packets.insert(i); |
| 3865 } |
| 3866 |
| 3867 QuicFrames frames; |
| 3868 frames.push_back(QuicFrame(&ack_frame)); |
| 3869 |
| 3870 unsigned char packet[] = { |
| 3871 // public flags (8 byte connection_id) |
| 3872 0x3C, |
| 3873 // connection_id |
| 3874 0x10, 0x32, 0x54, 0x76, |
| 3875 0x98, 0xBA, 0xDC, 0xFE, |
| 3876 // packet sequence number |
| 3877 0xA8, 0x9A, 0x78, 0x56, |
| 3878 0x34, 0x12, |
| 3879 // private flags (entropy) |
| 3880 0x01, |
| 3881 |
| 3882 // frame type (ack frame) |
| 3883 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta) |
| 3884 0x74, |
| 3885 // entropy hash of all received packets, set to 1 by TestEntropyCalculator |
| 3886 // since ack is truncated. |
| 3887 0x01, |
| 3888 // 2-byte largest observed packet sequence number. |
| 3889 // Expected to be 12 (0x0C), since only 6 nack ranges can fit. |
| 3890 0x0C, 0x00, |
| 3891 // Zero delta time. |
| 3892 0x0, 0x0, |
| 3893 // num missing packet ranges (limited to 6 by packet size of 37). |
| 3894 0x06, |
| 3895 // {missing packet delta, further missing packets in range} |
| 3896 // 6 nack ranges |
| 3897 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
| 3898 // 0 revived packets. |
| 3899 0x00, |
| 3900 }; |
| 3901 |
| 3902 scoped_ptr<QuicPacket> data( |
| 3903 framer_.BuildDataPacket(header, frames, 37u).packet); |
| 3904 ASSERT_TRUE(data != NULL); |
| 3905 // Expect 1 byte unused since at least 2 bytes are needed to fit more nacks. |
| 3906 EXPECT_EQ(36u, data->length()); |
| 3907 test::CompareCharArraysWithHexError("constructed packet", |
| 3908 data->data(), data->length(), |
| 3909 AsChars(packet), arraysize(packet)); |
| 3910 } |
| 3911 |
3725 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketTCP) { | 3912 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketTCP) { |
3726 QuicPacketHeader header; | 3913 QuicPacketHeader header; |
3727 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 3914 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
3728 header.public_header.reset_flag = false; | 3915 header.public_header.reset_flag = false; |
3729 header.public_header.version_flag = false; | 3916 header.public_header.version_flag = false; |
3730 header.fec_flag = false; | 3917 header.fec_flag = false; |
3731 header.entropy_flag = false; | 3918 header.entropy_flag = false; |
3732 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 3919 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
3733 header.fec_group = 0; | 3920 header.fec_group = 0; |
3734 | 3921 |
(...skipping 728 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4463 QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false, | 4650 QuicPacket::NewDataPacket(AsChars(packet), arraysize(packet), false, |
4464 PACKET_8BYTE_CONNECTION_ID, kIncludeVersion, | 4651 PACKET_8BYTE_CONNECTION_ID, kIncludeVersion, |
4465 PACKET_6BYTE_SEQUENCE_NUMBER)); | 4652 PACKET_6BYTE_SEQUENCE_NUMBER)); |
4466 scoped_ptr<QuicEncryptedPacket> encrypted( | 4653 scoped_ptr<QuicEncryptedPacket> encrypted( |
4467 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); | 4654 framer_.EncryptPacket(ENCRYPTION_NONE, sequence_number, *raw)); |
4468 | 4655 |
4469 ASSERT_TRUE(encrypted.get() != NULL); | 4656 ASSERT_TRUE(encrypted.get() != NULL); |
4470 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); | 4657 EXPECT_TRUE(CheckEncryption(sequence_number, raw.get())); |
4471 } | 4658 } |
4472 | 4659 |
4473 TEST_P(QuicFramerTest, Truncation) { | 4660 TEST_P(QuicFramerTest, AckTruncationLargePacket) { |
4474 if (framer_.version() <= QUIC_VERSION_15) { | 4661 if (framer_.version() <= QUIC_VERSION_15) { |
4475 return; | 4662 return; |
4476 } | 4663 } |
4477 QuicPacketHeader header; | 4664 QuicPacketHeader header; |
4478 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 4665 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
4479 header.public_header.reset_flag = false; | 4666 header.public_header.reset_flag = false; |
4480 header.public_header.version_flag = false; | 4667 header.public_header.version_flag = false; |
4481 header.fec_flag = false; | 4668 header.fec_flag = false; |
4482 header.entropy_flag = false; | 4669 header.entropy_flag = false; |
4483 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 4670 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
4484 header.fec_group = 0; | 4671 header.fec_group = 0; |
4485 | 4672 |
4486 QuicAckFrame ack_frame; | 4673 // Create a packet with just the ack. |
4487 ack_frame.received_info.largest_observed = 601; | 4674 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u); |
4488 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; i += 2) { | |
4489 ack_frame.received_info.missing_packets.insert(i); | |
4490 } | |
4491 | |
4492 // Create a packet with just the ack | |
4493 QuicFrame frame; | 4675 QuicFrame frame; |
4494 frame.type = ACK_FRAME; | 4676 frame.type = ACK_FRAME; |
4495 frame.ack_frame = &ack_frame; | 4677 frame.ack_frame = &ack_frame; |
4496 QuicFrames frames; | 4678 QuicFrames frames; |
4497 frames.push_back(frame); | 4679 frames.push_back(frame); |
4498 | 4680 |
| 4681 // Build an ack packet with truncation due to limit in number of nack ranges. |
4499 scoped_ptr<QuicPacket> raw_ack_packet( | 4682 scoped_ptr<QuicPacket> raw_ack_packet( |
4500 framer_.BuildUnsizedDataPacket(header, frames).packet); | 4683 framer_.BuildDataPacket(header, frames, kMaxPacketSize).packet); |
4501 ASSERT_TRUE(raw_ack_packet != NULL); | 4684 ASSERT_TRUE(raw_ack_packet != NULL); |
4502 | |
4503 scoped_ptr<QuicEncryptedPacket> ack_packet( | 4685 scoped_ptr<QuicEncryptedPacket> ack_packet( |
4504 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, | 4686 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, |
4505 *raw_ack_packet)); | 4687 *raw_ack_packet)); |
4506 | 4688 // Now make sure we can turn our ack packet back into an ack frame. |
4507 // Now make sure we can turn our ack packet back into an ack frame | |
4508 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); | 4689 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); |
4509 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 4690 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
4510 const QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; | 4691 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; |
4511 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated); | 4692 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated); |
4512 EXPECT_EQ(510u, processed_ack_frame.received_info.largest_observed); | 4693 EXPECT_EQ(510u, processed_ack_frame.received_info.largest_observed); |
4513 ASSERT_EQ(255u, processed_ack_frame.received_info.missing_packets.size()); | 4694 ASSERT_EQ(255u, processed_ack_frame.received_info.missing_packets.size()); |
4514 SequenceNumberSet::const_iterator missing_iter = | 4695 SequenceNumberSet::const_iterator missing_iter = |
4515 processed_ack_frame.received_info.missing_packets.begin(); | 4696 processed_ack_frame.received_info.missing_packets.begin(); |
4516 EXPECT_EQ(1u, *missing_iter); | 4697 EXPECT_EQ(1u, *missing_iter); |
4517 SequenceNumberSet::const_reverse_iterator last_missing_iter = | 4698 SequenceNumberSet::const_reverse_iterator last_missing_iter = |
4518 processed_ack_frame.received_info.missing_packets.rbegin(); | 4699 processed_ack_frame.received_info.missing_packets.rbegin(); |
4519 EXPECT_EQ(509u, *last_missing_iter); | 4700 EXPECT_EQ(509u, *last_missing_iter); |
4520 } | 4701 } |
4521 | 4702 |
| 4703 TEST_P(QuicFramerTest, AckTruncationSmallPacket) { |
| 4704 if (framer_.version() <= QUIC_VERSION_15) { |
| 4705 return; |
| 4706 } |
| 4707 QuicPacketHeader header; |
| 4708 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
| 4709 header.public_header.reset_flag = false; |
| 4710 header.public_header.version_flag = false; |
| 4711 header.fec_flag = false; |
| 4712 header.entropy_flag = false; |
| 4713 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
| 4714 header.fec_group = 0; |
| 4715 |
| 4716 // Create a packet with just the ack. |
| 4717 QuicAckFrame ack_frame = MakeAckFrameWithNackRanges(300, 0u); |
| 4718 QuicFrame frame; |
| 4719 frame.type = ACK_FRAME; |
| 4720 frame.ack_frame = &ack_frame; |
| 4721 QuicFrames frames; |
| 4722 frames.push_back(frame); |
| 4723 |
| 4724 // Build an ack packet with truncation due to limit in number of nack ranges. |
| 4725 scoped_ptr<QuicPacket> raw_ack_packet( |
| 4726 framer_.BuildDataPacket(header, frames, 500).packet); |
| 4727 ASSERT_TRUE(raw_ack_packet != NULL); |
| 4728 scoped_ptr<QuicEncryptedPacket> ack_packet( |
| 4729 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, |
| 4730 *raw_ack_packet)); |
| 4731 // Now make sure we can turn our ack packet back into an ack frame. |
| 4732 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); |
| 4733 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 4734 QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; |
| 4735 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated); |
| 4736 EXPECT_EQ(476u, processed_ack_frame.received_info.largest_observed); |
| 4737 ASSERT_EQ(238u, processed_ack_frame.received_info.missing_packets.size()); |
| 4738 SequenceNumberSet::const_iterator missing_iter = |
| 4739 processed_ack_frame.received_info.missing_packets.begin(); |
| 4740 EXPECT_EQ(1u, *missing_iter); |
| 4741 SequenceNumberSet::const_reverse_iterator last_missing_iter = |
| 4742 processed_ack_frame.received_info.missing_packets.rbegin(); |
| 4743 EXPECT_EQ(475u, *last_missing_iter); |
| 4744 } |
| 4745 |
4522 TEST_P(QuicFramerTest, Truncation15) { | 4746 TEST_P(QuicFramerTest, Truncation15) { |
4523 if (framer_.version() > QUIC_VERSION_15) { | 4747 if (framer_.version() > QUIC_VERSION_15) { |
4524 return; | 4748 return; |
4525 } | 4749 } |
4526 QuicPacketHeader header; | 4750 QuicPacketHeader header; |
4527 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); | 4751 header.public_header.connection_id = GG_UINT64_C(0xFEDCBA9876543210); |
4528 header.public_header.reset_flag = false; | 4752 header.public_header.reset_flag = false; |
4529 header.public_header.version_flag = false; | 4753 header.public_header.version_flag = false; |
4530 header.fec_flag = false; | 4754 header.fec_flag = false; |
4531 header.entropy_flag = false; | 4755 header.entropy_flag = false; |
4532 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 4756 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
4533 header.fec_group = 0; | 4757 header.fec_group = 0; |
4534 | 4758 |
4535 QuicAckFrame ack_frame; | 4759 QuicAckFrame ack_frame; |
4536 ack_frame.received_info.largest_observed = 601; | 4760 ack_frame.received_info.largest_observed = 601; |
4537 ack_frame.sent_info.least_unacked = header.packet_sequence_number - 1; | 4761 ack_frame.sent_info.least_unacked = header.packet_sequence_number - 1; |
4538 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; i += 2) { | 4762 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; i += 2) { |
4539 ack_frame.received_info.missing_packets.insert(i); | 4763 ack_frame.received_info.missing_packets.insert(i); |
4540 } | 4764 } |
4541 | 4765 |
4542 // Create a packet with just the ack | 4766 // Create a packet with just the ack. |
4543 QuicFrame frame; | 4767 QuicFrame frame; |
4544 frame.type = ACK_FRAME; | 4768 frame.type = ACK_FRAME; |
4545 frame.ack_frame = &ack_frame; | 4769 frame.ack_frame = &ack_frame; |
4546 QuicFrames frames; | 4770 QuicFrames frames; |
4547 frames.push_back(frame); | 4771 frames.push_back(frame); |
4548 | 4772 |
4549 scoped_ptr<QuicPacket> raw_ack_packet( | 4773 scoped_ptr<QuicPacket> raw_ack_packet( |
4550 framer_.BuildUnsizedDataPacket(header, frames).packet); | 4774 framer_.BuildUnsizedDataPacket(header, frames).packet); |
4551 ASSERT_TRUE(raw_ack_packet != NULL); | 4775 ASSERT_TRUE(raw_ack_packet != NULL); |
4552 | 4776 |
4553 scoped_ptr<QuicEncryptedPacket> ack_packet( | 4777 scoped_ptr<QuicEncryptedPacket> ack_packet( |
4554 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, | 4778 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, |
4555 *raw_ack_packet)); | 4779 *raw_ack_packet)); |
4556 | 4780 |
4557 // Now make sure we can turn our ack packet back into an ack frame | 4781 // Now make sure we can turn our ack packet back into an ack frame. |
4558 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); | 4782 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); |
4559 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 4783 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
4560 const QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; | 4784 const QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; |
4561 EXPECT_EQ(header.packet_sequence_number - 1, | 4785 EXPECT_EQ(header.packet_sequence_number - 1, |
4562 processed_ack_frame.sent_info.least_unacked); | 4786 processed_ack_frame.sent_info.least_unacked); |
4563 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated); | 4787 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated); |
4564 EXPECT_EQ(510u, processed_ack_frame.received_info.largest_observed); | 4788 EXPECT_EQ(510u, processed_ack_frame.received_info.largest_observed); |
4565 ASSERT_EQ(255u, processed_ack_frame.received_info.missing_packets.size()); | 4789 ASSERT_EQ(255u, processed_ack_frame.received_info.missing_packets.size()); |
4566 SequenceNumberSet::const_iterator missing_iter = | 4790 SequenceNumberSet::const_iterator missing_iter = |
4567 processed_ack_frame.received_info.missing_packets.begin(); | 4791 processed_ack_frame.received_info.missing_packets.begin(); |
(...skipping 13 matching lines...) Expand all Loading... |
4581 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 4805 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
4582 header.fec_group = 0; | 4806 header.fec_group = 0; |
4583 | 4807 |
4584 QuicAckFrame ack_frame; | 4808 QuicAckFrame ack_frame; |
4585 ack_frame.received_info.largest_observed = 201; | 4809 ack_frame.received_info.largest_observed = 201; |
4586 ack_frame.sent_info.least_unacked = header.packet_sequence_number - 2; | 4810 ack_frame.sent_info.least_unacked = header.packet_sequence_number - 2; |
4587 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; ++i) { | 4811 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; ++i) { |
4588 ack_frame.received_info.missing_packets.insert(i); | 4812 ack_frame.received_info.missing_packets.insert(i); |
4589 } | 4813 } |
4590 | 4814 |
4591 // Create a packet with just the ack | 4815 // Create a packet with just the ack. |
4592 QuicFrame frame; | 4816 QuicFrame frame; |
4593 frame.type = ACK_FRAME; | 4817 frame.type = ACK_FRAME; |
4594 frame.ack_frame = &ack_frame; | 4818 frame.ack_frame = &ack_frame; |
4595 QuicFrames frames; | 4819 QuicFrames frames; |
4596 frames.push_back(frame); | 4820 frames.push_back(frame); |
4597 | 4821 |
4598 scoped_ptr<QuicPacket> raw_ack_packet( | 4822 scoped_ptr<QuicPacket> raw_ack_packet( |
4599 framer_.BuildUnsizedDataPacket(header, frames).packet); | 4823 framer_.BuildUnsizedDataPacket(header, frames).packet); |
4600 ASSERT_TRUE(raw_ack_packet != NULL); | 4824 ASSERT_TRUE(raw_ack_packet != NULL); |
4601 | 4825 |
4602 scoped_ptr<QuicEncryptedPacket> ack_packet( | 4826 scoped_ptr<QuicEncryptedPacket> ack_packet( |
4603 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, | 4827 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, |
4604 *raw_ack_packet)); | 4828 *raw_ack_packet)); |
4605 | 4829 |
4606 // Now make sure we can turn our ack packet back into an ack frame | 4830 // Now make sure we can turn our ack packet back into an ack frame. |
4607 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); | 4831 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); |
4608 | 4832 |
4609 // Test for clean truncation of the ack by comparing the length of the | 4833 // Test for clean truncation of the ack by comparing the length of the |
4610 // original packets to the re-serialized packets. | 4834 // original packets to the re-serialized packets. |
4611 frames.clear(); | 4835 frames.clear(); |
4612 frame.type = ACK_FRAME; | 4836 frame.type = ACK_FRAME; |
4613 frame.ack_frame = visitor_.ack_frames_[0]; | 4837 frame.ack_frame = visitor_.ack_frames_[0]; |
4614 frames.push_back(frame); | 4838 frames.push_back(frame); |
4615 | 4839 |
4616 size_t original_raw_length = raw_ack_packet->length(); | 4840 size_t original_raw_length = raw_ack_packet->length(); |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4748 EXPECT_CALL(visitor, OnPacketComplete()); | 4972 EXPECT_CALL(visitor, OnPacketComplete()); |
4749 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); | 4973 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); |
4750 | 4974 |
4751 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 4975 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
4752 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 4976 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
4753 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 4977 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
4754 } | 4978 } |
4755 | 4979 |
4756 } // namespace test | 4980 } // namespace test |
4757 } // namespace net | 4981 } // namespace net |
OLD | NEW |