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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 return GetPrivateFlagsOffset(PACKET_8BYTE_GUID, include_version) + | 87 return GetPrivateFlagsOffset(PACKET_8BYTE_GUID, include_version) + |
88 kPrivateFlagsSize; | 88 kPrivateFlagsSize; |
89 } | 89 } |
90 | 90 |
91 size_t GetFecGroupOffset(bool include_version, | 91 size_t GetFecGroupOffset(bool include_version, |
92 QuicSequenceNumberLength sequence_number_length) { | 92 QuicSequenceNumberLength sequence_number_length) { |
93 return GetPrivateFlagsOffset(include_version, sequence_number_length) + | 93 return GetPrivateFlagsOffset(include_version, sequence_number_length) + |
94 kPrivateFlagsSize; | 94 kPrivateFlagsSize; |
95 } | 95 } |
96 | 96 |
| 97 // Index into the message tag of the public reset packet. |
| 98 // Public resets always have full guids. |
| 99 const size_t kPublicResetPacketMessageTagOffset = |
| 100 kGuidOffset + PACKET_8BYTE_GUID; |
| 101 |
| 102 // TODO(wtc): remove this when we drop support for QUIC_VERSION_13. |
97 // Index into the nonce proof of the public reset packet. | 103 // Index into the nonce proof of the public reset packet. |
98 // Public resets always have full guids. | 104 // Public resets always have full guids. |
99 const size_t kPublicResetPacketNonceProofOffset = | 105 const size_t kPublicResetPacketNonceProofOffset = |
100 kGuidOffset + PACKET_8BYTE_GUID; | 106 kGuidOffset + PACKET_8BYTE_GUID; |
101 | 107 |
| 108 // TODO(wtc): remove this when we drop support for QUIC_VERSION_13. |
102 // Index into the rejected sequence number of the public reset packet. | 109 // Index into the rejected sequence number of the public reset packet. |
103 const size_t kPublicResetPacketRejectedSequenceNumberOffset = | 110 const size_t kPublicResetPacketRejectedSequenceNumberOffset = |
104 kPublicResetPacketNonceProofOffset + kPublicResetNonceSize; | 111 kPublicResetPacketNonceProofOffset + kPublicResetNonceSize; |
105 | 112 |
106 // TODO(wtc): remove this when we drop support for QUIC_VERSION_13. | |
107 // Size of the old-style public reset packet. | |
108 const size_t kPublicResetPacketOldSize = | |
109 kPublicResetPacketRejectedSequenceNumberOffset + | |
110 PACKET_6BYTE_SEQUENCE_NUMBER; | |
111 | |
112 class TestEncrypter : public QuicEncrypter { | 113 class TestEncrypter : public QuicEncrypter { |
113 public: | 114 public: |
114 virtual ~TestEncrypter() {} | 115 virtual ~TestEncrypter() {} |
115 virtual bool SetKey(StringPiece key) OVERRIDE { | 116 virtual bool SetKey(StringPiece key) OVERRIDE { |
116 return true; | 117 return true; |
117 } | 118 } |
118 virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE { | 119 virtual bool SetNoncePrefix(StringPiece nonce_prefix) OVERRIDE { |
119 return true; | 120 return true; |
120 } | 121 } |
121 virtual bool Encrypt(StringPiece nonce, | 122 virtual bool Encrypt(StringPiece nonce, |
(...skipping 1527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1649 | 1650 |
1650 ASSERT_EQ(1u, visitor_.stream_frames_.size()); | 1651 ASSERT_EQ(1u, visitor_.stream_frames_.size()); |
1651 EXPECT_EQ(0u, visitor_.ack_frames_.size()); | 1652 EXPECT_EQ(0u, visitor_.ack_frames_.size()); |
1652 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.stream_frames_[0]->stream_id); | 1653 EXPECT_EQ(GG_UINT64_C(0x01020304), visitor_.stream_frames_[0]->stream_id); |
1653 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); | 1654 EXPECT_TRUE(visitor_.stream_frames_[0]->fin); |
1654 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), | 1655 EXPECT_EQ(GG_UINT64_C(0xBA98FEDC32107654), |
1655 visitor_.stream_frames_[0]->offset); | 1656 visitor_.stream_frames_[0]->offset); |
1656 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); | 1657 CheckStreamFrameData("hello world!", visitor_.stream_frames_[0]); |
1657 } | 1658 } |
1658 | 1659 |
1659 TEST_P(QuicFramerTest, AckFrame) { | 1660 TEST_P(QuicFramerTest, AckFrameV14) { |
| 1661 if (framer_.version() > QUIC_VERSION_14) { |
| 1662 return; |
| 1663 } |
| 1664 |
1660 unsigned char packet[] = { | 1665 unsigned char packet[] = { |
1661 // public flags (8 byte guid) | 1666 // public flags (8 byte guid) |
1662 0x3C, | 1667 0x3C, |
1663 // guid | 1668 // guid |
1664 0x10, 0x32, 0x54, 0x76, | 1669 0x10, 0x32, 0x54, 0x76, |
1665 0x98, 0xBA, 0xDC, 0xFE, | 1670 0x98, 0xBA, 0xDC, 0xFE, |
1666 // packet sequence number | 1671 // packet sequence number |
1667 0xA8, 0x9A, 0x78, 0x56, | 1672 0xA8, 0x9A, 0x78, 0x56, |
1668 0x34, 0x12, | 1673 0x34, 0x12, |
1669 // private flags (entropy) | 1674 // private flags (entropy) |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1748 expected_error = "Unable to read missing sequence number range."; | 1753 expected_error = "Unable to read missing sequence number range."; |
1749 } | 1754 } |
1750 CheckProcessingFails( | 1755 CheckProcessingFails( |
1751 packet, | 1756 packet, |
1752 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, | 1757 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
1753 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 1758 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
1754 expected_error, QUIC_INVALID_ACK_DATA); | 1759 expected_error, QUIC_INVALID_ACK_DATA); |
1755 } | 1760 } |
1756 } | 1761 } |
1757 | 1762 |
| 1763 TEST_P(QuicFramerTest, AckFrame) { |
| 1764 if (framer_.version() <= QUIC_VERSION_14) { |
| 1765 return; |
| 1766 } |
| 1767 |
| 1768 unsigned char packet[] = { |
| 1769 // public flags (8 byte guid) |
| 1770 0x3C, |
| 1771 // guid |
| 1772 0x10, 0x32, 0x54, 0x76, |
| 1773 0x98, 0xBA, 0xDC, 0xFE, |
| 1774 // packet sequence number |
| 1775 0xA8, 0x9A, 0x78, 0x56, |
| 1776 0x34, 0x12, |
| 1777 // private flags (entropy) |
| 1778 0x01, |
| 1779 |
| 1780 // frame type (ack frame) |
| 1781 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
| 1782 0x6C, |
| 1783 // entropy hash of sent packets till least awaiting - 1. |
| 1784 0xAB, |
| 1785 // least packet sequence number awaiting an ack, delta from sequence number. |
| 1786 0x08, 0x00, 0x00, 0x00, |
| 1787 0x00, 0x00, |
| 1788 // entropy hash of all received packets. |
| 1789 0xBA, |
| 1790 // largest observed packet sequence number |
| 1791 0xBF, 0x9A, 0x78, 0x56, |
| 1792 0x34, 0x12, |
| 1793 // Zero delta time. |
| 1794 0x0, 0x0, |
| 1795 // num missing packets |
| 1796 0x01, |
| 1797 // missing packet delta |
| 1798 0x01, |
| 1799 // 0 more missing packets in range. |
| 1800 0x00, |
| 1801 // Number of revived packets. |
| 1802 0x00, |
| 1803 }; |
| 1804 |
| 1805 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1806 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 1807 |
| 1808 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 1809 ASSERT_TRUE(visitor_.header_.get()); |
| 1810 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
| 1811 |
| 1812 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
| 1813 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 1814 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; |
| 1815 EXPECT_EQ(0xAB, frame.sent_info.entropy_hash); |
| 1816 EXPECT_EQ(0xBA, frame.received_info.entropy_hash); |
| 1817 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); |
| 1818 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); |
| 1819 SequenceNumberSet::const_iterator missing_iter = |
| 1820 frame.received_info.missing_packets.begin(); |
| 1821 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); |
| 1822 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame.sent_info.least_unacked); |
| 1823 |
| 1824 const size_t kSentEntropyOffset = kQuicFrameTypeSize; |
| 1825 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; |
| 1826 const size_t kReceivedEntropyOffset = kLeastUnackedOffset + |
| 1827 PACKET_6BYTE_SEQUENCE_NUMBER; |
| 1828 const size_t kLargestObservedOffset = kReceivedEntropyOffset + |
| 1829 kQuicEntropyHashSize; |
| 1830 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + |
| 1831 PACKET_6BYTE_SEQUENCE_NUMBER; |
| 1832 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + |
| 1833 kQuicDeltaTimeLargestObservedSize; |
| 1834 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + |
| 1835 kNumberOfMissingPacketsSize; |
| 1836 const size_t kMissingPacketsRange = kMissingPacketsOffset + |
| 1837 PACKET_1BYTE_SEQUENCE_NUMBER; |
| 1838 const size_t kRevivedPacketsLength = kMissingPacketsRange + |
| 1839 PACKET_1BYTE_SEQUENCE_NUMBER; |
| 1840 // Now test framing boundaries |
| 1841 const size_t ack_frame_size = kRevivedPacketsLength + |
| 1842 PACKET_1BYTE_SEQUENCE_NUMBER; |
| 1843 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { |
| 1844 string expected_error; |
| 1845 if (i < kLeastUnackedOffset) { |
| 1846 expected_error = "Unable to read entropy hash for sent packets."; |
| 1847 } else if (i < kReceivedEntropyOffset) { |
| 1848 expected_error = "Unable to read least unacked delta."; |
| 1849 } else if (i < kLargestObservedOffset) { |
| 1850 expected_error = "Unable to read entropy hash for received packets."; |
| 1851 } else if (i < kMissingDeltaTimeOffset) { |
| 1852 expected_error = "Unable to read largest observed."; |
| 1853 } else if (i < kNumMissingPacketOffset) { |
| 1854 expected_error = "Unable to read delta time largest observed."; |
| 1855 } else if (i < kMissingPacketsOffset) { |
| 1856 expected_error = "Unable to read num missing packet ranges."; |
| 1857 } else if (i < kMissingPacketsRange) { |
| 1858 expected_error = "Unable to read missing sequence number delta."; |
| 1859 } else if (i < kRevivedPacketsLength) { |
| 1860 expected_error = "Unable to read missing sequence number range."; |
| 1861 } else { |
| 1862 expected_error = "Unable to read num revived packets."; |
| 1863 } |
| 1864 CheckProcessingFails( |
| 1865 packet, |
| 1866 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 1867 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
| 1868 expected_error, QUIC_INVALID_ACK_DATA); |
| 1869 } |
| 1870 } |
| 1871 |
| 1872 TEST_P(QuicFramerTest, AckFrameRevivedPackets) { |
| 1873 if (framer_.version() <= QUIC_VERSION_14) { |
| 1874 return; |
| 1875 } |
| 1876 |
| 1877 unsigned char packet[] = { |
| 1878 // public flags (8 byte guid) |
| 1879 0x3C, |
| 1880 // guid |
| 1881 0x10, 0x32, 0x54, 0x76, |
| 1882 0x98, 0xBA, 0xDC, 0xFE, |
| 1883 // packet sequence number |
| 1884 0xA8, 0x9A, 0x78, 0x56, |
| 1885 0x34, 0x12, |
| 1886 // private flags (entropy) |
| 1887 0x01, |
| 1888 |
| 1889 // frame type (ack frame) |
| 1890 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
| 1891 0x6C, |
| 1892 // entropy hash of sent packets till least awaiting - 1. |
| 1893 0xAB, |
| 1894 // least packet sequence number awaiting an ack, delta from sequence number. |
| 1895 0x08, 0x00, 0x00, 0x00, |
| 1896 0x00, 0x00, |
| 1897 // entropy hash of all received packets. |
| 1898 0xBA, |
| 1899 // largest observed packet sequence number |
| 1900 0xBF, 0x9A, 0x78, 0x56, |
| 1901 0x34, 0x12, |
| 1902 // Zero delta time. |
| 1903 0x0, 0x0, |
| 1904 // num missing packets |
| 1905 0x01, |
| 1906 // missing packet delta |
| 1907 0x01, |
| 1908 // 0 more missing packets in range. |
| 1909 0x00, |
| 1910 // Number of revived packets. |
| 1911 0x01, |
| 1912 // Revived packet sequence number. |
| 1913 0xBE, 0x9A, 0x78, 0x56, |
| 1914 0x34, 0x12, |
| 1915 }; |
| 1916 |
| 1917 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 1918 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 1919 |
| 1920 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 1921 ASSERT_TRUE(visitor_.header_.get()); |
| 1922 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
| 1923 |
| 1924 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
| 1925 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 1926 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; |
| 1927 EXPECT_EQ(0xAB, frame.sent_info.entropy_hash); |
| 1928 EXPECT_EQ(0xBA, frame.received_info.entropy_hash); |
| 1929 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), frame.received_info.largest_observed); |
| 1930 ASSERT_EQ(1u, frame.received_info.missing_packets.size()); |
| 1931 SequenceNumberSet::const_iterator missing_iter = |
| 1932 frame.received_info.missing_packets.begin(); |
| 1933 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *missing_iter); |
| 1934 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame.sent_info.least_unacked); |
| 1935 |
| 1936 const size_t kSentEntropyOffset = kQuicFrameTypeSize; |
| 1937 const size_t kLeastUnackedOffset = kSentEntropyOffset + kQuicEntropyHashSize; |
| 1938 const size_t kReceivedEntropyOffset = kLeastUnackedOffset + |
| 1939 PACKET_6BYTE_SEQUENCE_NUMBER; |
| 1940 const size_t kLargestObservedOffset = kReceivedEntropyOffset + |
| 1941 kQuicEntropyHashSize; |
| 1942 const size_t kMissingDeltaTimeOffset = kLargestObservedOffset + |
| 1943 PACKET_6BYTE_SEQUENCE_NUMBER; |
| 1944 const size_t kNumMissingPacketOffset = kMissingDeltaTimeOffset + |
| 1945 kQuicDeltaTimeLargestObservedSize; |
| 1946 const size_t kMissingPacketsOffset = kNumMissingPacketOffset + |
| 1947 kNumberOfMissingPacketsSize; |
| 1948 const size_t kMissingPacketsRange = kMissingPacketsOffset + |
| 1949 PACKET_1BYTE_SEQUENCE_NUMBER; |
| 1950 const size_t kRevivedPacketsLength = kMissingPacketsRange + |
| 1951 PACKET_1BYTE_SEQUENCE_NUMBER; |
| 1952 const size_t kRevivedPacketSequenceNumberLength = kRevivedPacketsLength + |
| 1953 PACKET_1BYTE_SEQUENCE_NUMBER; |
| 1954 // Now test framing boundaries |
| 1955 const size_t ack_frame_size = kRevivedPacketSequenceNumberLength + |
| 1956 PACKET_6BYTE_SEQUENCE_NUMBER; |
| 1957 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { |
| 1958 string expected_error; |
| 1959 if (i < kLeastUnackedOffset) { |
| 1960 expected_error = "Unable to read entropy hash for sent packets."; |
| 1961 } else if (i < kReceivedEntropyOffset) { |
| 1962 expected_error = "Unable to read least unacked delta."; |
| 1963 } else if (i < kLargestObservedOffset) { |
| 1964 expected_error = "Unable to read entropy hash for received packets."; |
| 1965 } else if (i < kMissingDeltaTimeOffset) { |
| 1966 expected_error = "Unable to read largest observed."; |
| 1967 } else if (i < kNumMissingPacketOffset) { |
| 1968 expected_error = "Unable to read delta time largest observed."; |
| 1969 } else if (i < kMissingPacketsOffset) { |
| 1970 expected_error = "Unable to read num missing packet ranges."; |
| 1971 } else if (i < kMissingPacketsRange) { |
| 1972 expected_error = "Unable to read missing sequence number delta."; |
| 1973 } else if (i < kRevivedPacketsLength) { |
| 1974 expected_error = "Unable to read missing sequence number range."; |
| 1975 } else if (i < kRevivedPacketSequenceNumberLength) { |
| 1976 expected_error = "Unable to read num revived packets."; |
| 1977 } else { |
| 1978 expected_error = "Unable to read revived packet."; |
| 1979 } |
| 1980 CheckProcessingFails( |
| 1981 packet, |
| 1982 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 1983 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
| 1984 expected_error, QUIC_INVALID_ACK_DATA); |
| 1985 } |
| 1986 } |
| 1987 |
1758 TEST_P(QuicFramerTest, AckFrameNoNacks) { | 1988 TEST_P(QuicFramerTest, AckFrameNoNacks) { |
1759 unsigned char packet[] = { | 1989 unsigned char packet[] = { |
1760 // public flags (8 byte guid) | 1990 // public flags (8 byte guid) |
1761 0x3C, | 1991 0x3C, |
1762 // guid | 1992 // guid |
1763 0x10, 0x32, 0x54, 0x76, | 1993 0x10, 0x32, 0x54, 0x76, |
1764 0x98, 0xBA, 0xDC, 0xFE, | 1994 0x98, 0xBA, 0xDC, 0xFE, |
1765 // packet sequence number | 1995 // packet sequence number |
1766 0xA8, 0x9A, 0x78, 0x56, | 1996 0xA8, 0x9A, 0x78, 0x56, |
1767 0x34, 0x12, | 1997 0x34, 0x12, |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1808 scoped_ptr<QuicPacket> data( | 2038 scoped_ptr<QuicPacket> data( |
1809 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet); | 2039 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet); |
1810 ASSERT_TRUE(data != NULL); | 2040 ASSERT_TRUE(data != NULL); |
1811 | 2041 |
1812 test::CompareCharArraysWithHexError("constructed packet", | 2042 test::CompareCharArraysWithHexError("constructed packet", |
1813 data->data(), data->length(), | 2043 data->data(), data->length(), |
1814 AsChars(packet), arraysize(packet)); | 2044 AsChars(packet), arraysize(packet)); |
1815 } | 2045 } |
1816 | 2046 |
1817 TEST_P(QuicFramerTest, AckFrame500Nacks) { | 2047 TEST_P(QuicFramerTest, AckFrame500Nacks) { |
| 2048 if (framer_.version() <= QUIC_VERSION_14) { |
| 2049 return; |
| 2050 } |
1818 unsigned char packet[] = { | 2051 unsigned char packet[] = { |
1819 // public flags (8 byte guid) | 2052 // public flags (8 byte guid) |
1820 0x3C, | 2053 0x3C, |
1821 // guid | 2054 // guid |
1822 0x10, 0x32, 0x54, 0x76, | 2055 0x10, 0x32, 0x54, 0x76, |
1823 0x98, 0xBA, 0xDC, 0xFE, | 2056 0x98, 0xBA, 0xDC, 0xFE, |
1824 // packet sequence number | 2057 // packet sequence number |
1825 0xA8, 0x9A, 0x78, 0x56, | 2058 0xA8, 0x9A, 0x78, 0x56, |
1826 0x34, 0x12, | 2059 0x34, 0x12, |
1827 // private flags (entropy) | 2060 // private flags (entropy) |
(...skipping 18 matching lines...) Expand all Loading... |
1846 0x02, | 2079 0x02, |
1847 // missing packet delta | 2080 // missing packet delta |
1848 0x01, | 2081 0x01, |
1849 // 243 more missing packets in range. | 2082 // 243 more missing packets in range. |
1850 // The ranges are listed in this order so the re-constructed packet matches. | 2083 // The ranges are listed in this order so the re-constructed packet matches. |
1851 0xF3, | 2084 0xF3, |
1852 // No gap between ranges | 2085 // No gap between ranges |
1853 0x00, | 2086 0x00, |
1854 // 255 more missing packets in range. | 2087 // 255 more missing packets in range. |
1855 0xFF, | 2088 0xFF, |
| 2089 // No revived packets. |
| 2090 0x00, |
1856 }; | 2091 }; |
1857 | 2092 |
1858 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2093 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
1859 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2094 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
1860 | 2095 |
1861 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2096 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
1862 ASSERT_TRUE(visitor_.header_.get()); | 2097 ASSERT_TRUE(visitor_.header_.get()); |
1863 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); | 2098 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
1864 | 2099 |
1865 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 2100 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
1866 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 2101 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
1867 QuicAckFrame* frame = visitor_.ack_frames_[0]; | 2102 QuicAckFrame* frame = visitor_.ack_frames_[0]; |
1868 EXPECT_EQ(0xAB, frame->sent_info.entropy_hash); | 2103 EXPECT_EQ(0xAB, frame->sent_info.entropy_hash); |
1869 EXPECT_EQ(0xBA, frame->received_info.entropy_hash); | 2104 EXPECT_EQ(0xBA, frame->received_info.entropy_hash); |
1870 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), | 2105 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), |
1871 frame->received_info.largest_observed); | 2106 frame->received_info.largest_observed); |
| 2107 EXPECT_EQ(0u, frame->received_info.revived_packets.size()); |
1872 ASSERT_EQ(500u, frame->received_info.missing_packets.size()); | 2108 ASSERT_EQ(500u, frame->received_info.missing_packets.size()); |
1873 SequenceNumberSet::const_iterator first_missing_iter = | 2109 SequenceNumberSet::const_iterator first_missing_iter = |
1874 frame->received_info.missing_packets.begin(); | 2110 frame->received_info.missing_packets.begin(); |
1875 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE) - 499, *first_missing_iter); | 2111 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE) - 499, *first_missing_iter); |
1876 SequenceNumberSet::const_reverse_iterator last_missing_iter = | 2112 SequenceNumberSet::const_reverse_iterator last_missing_iter = |
1877 frame->received_info.missing_packets.rbegin(); | 2113 frame->received_info.missing_packets.rbegin(); |
1878 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *last_missing_iter); | 2114 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *last_missing_iter); |
1879 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame->sent_info.least_unacked); | 2115 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame->sent_info.least_unacked); |
1880 | 2116 |
1881 // Verify that the packet re-serializes identically. | 2117 // Verify that the packet re-serializes identically. |
1882 QuicFrames frames; | 2118 QuicFrames frames; |
1883 frames.push_back(QuicFrame(frame)); | 2119 frames.push_back(QuicFrame(frame)); |
1884 scoped_ptr<QuicPacket> data( | 2120 scoped_ptr<QuicPacket> data( |
1885 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet); | 2121 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet); |
1886 ASSERT_TRUE(data != NULL); | 2122 ASSERT_TRUE(data != NULL); |
1887 | 2123 |
1888 test::CompareCharArraysWithHexError("constructed packet", | 2124 test::CompareCharArraysWithHexError("constructed packet", |
1889 data->data(), data->length(), | 2125 data->data(), data->length(), |
1890 AsChars(packet), arraysize(packet)); | 2126 AsChars(packet), arraysize(packet)); |
1891 } | 2127 } |
1892 | 2128 |
1893 TEST_P(QuicFramerTest, CongestionFeedbackFrameTCP) { | 2129 TEST_P(QuicFramerTest, AckFrame500NacksV14) { |
| 2130 if (framer_.version() > QUIC_VERSION_14) { |
| 2131 return; |
| 2132 } |
1894 unsigned char packet[] = { | 2133 unsigned char packet[] = { |
1895 // public flags (8 byte guid) | 2134 // public flags (8 byte guid) |
1896 0x3C, | 2135 0x3C, |
1897 // guid | 2136 // guid |
1898 0x10, 0x32, 0x54, 0x76, | 2137 0x10, 0x32, 0x54, 0x76, |
1899 0x98, 0xBA, 0xDC, 0xFE, | 2138 0x98, 0xBA, 0xDC, 0xFE, |
1900 // packet sequence number | 2139 // packet sequence number |
| 2140 0xA8, 0x9A, 0x78, 0x56, |
| 2141 0x34, 0x12, |
| 2142 // private flags (entropy) |
| 2143 0x01, |
| 2144 |
| 2145 // frame type (ack frame) |
| 2146 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
| 2147 0x6C, |
| 2148 // entropy hash of sent packets till least awaiting - 1. |
| 2149 0xAB, |
| 2150 // least packet sequence number awaiting an ack, delta from sequence number. |
| 2151 0x08, 0x00, 0x00, 0x00, |
| 2152 0x00, 0x00, |
| 2153 // entropy hash of all received packets. |
| 2154 0xBA, |
| 2155 // largest observed packet sequence number |
| 2156 0xBF, 0x9A, 0x78, 0x56, |
| 2157 0x34, 0x12, |
| 2158 // Zero delta time. |
| 2159 0x0, 0x0, |
| 2160 // num missing packet ranges |
| 2161 0x02, |
| 2162 // missing packet delta |
| 2163 0x01, |
| 2164 // 243 more missing packets in range. |
| 2165 // The ranges are listed in this order so the re-constructed packet matches. |
| 2166 0xF3, |
| 2167 // No gap between ranges |
| 2168 0x00, |
| 2169 // 255 more missing packets in range. |
| 2170 0xFF, |
| 2171 }; |
| 2172 |
| 2173 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 2174 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 2175 |
| 2176 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2177 ASSERT_TRUE(visitor_.header_.get()); |
| 2178 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
| 2179 |
| 2180 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
| 2181 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
| 2182 QuicAckFrame* frame = visitor_.ack_frames_[0]; |
| 2183 EXPECT_EQ(0xAB, frame->sent_info.entropy_hash); |
| 2184 EXPECT_EQ(0xBA, frame->received_info.entropy_hash); |
| 2185 EXPECT_EQ(GG_UINT64_C(0x0123456789ABF), |
| 2186 frame->received_info.largest_observed); |
| 2187 ASSERT_EQ(500u, frame->received_info.missing_packets.size()); |
| 2188 SequenceNumberSet::const_iterator first_missing_iter = |
| 2189 frame->received_info.missing_packets.begin(); |
| 2190 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE) - 499, *first_missing_iter); |
| 2191 SequenceNumberSet::const_reverse_iterator last_missing_iter = |
| 2192 frame->received_info.missing_packets.rbegin(); |
| 2193 EXPECT_EQ(GG_UINT64_C(0x0123456789ABE), *last_missing_iter); |
| 2194 EXPECT_EQ(GG_UINT64_C(0x0123456789AA0), frame->sent_info.least_unacked); |
| 2195 |
| 2196 // Verify that the packet re-serializes identically. |
| 2197 QuicFrames frames; |
| 2198 frames.push_back(QuicFrame(frame)); |
| 2199 scoped_ptr<QuicPacket> data( |
| 2200 framer_.BuildUnsizedDataPacket(*visitor_.header_, frames).packet); |
| 2201 ASSERT_TRUE(data != NULL); |
| 2202 |
| 2203 test::CompareCharArraysWithHexError("constructed packet", |
| 2204 data->data(), data->length(), |
| 2205 AsChars(packet), arraysize(packet)); |
| 2206 } |
| 2207 |
| 2208 TEST_P(QuicFramerTest, CongestionFeedbackFrameTCP) { |
| 2209 if (framer_.version() <= QUIC_VERSION_14) { |
| 2210 return; |
| 2211 } |
| 2212 unsigned char packet[] = { |
| 2213 // public flags (8 byte guid) |
| 2214 0x3C, |
| 2215 // guid |
| 2216 0x10, 0x32, 0x54, 0x76, |
| 2217 0x98, 0xBA, 0xDC, 0xFE, |
| 2218 // packet sequence number |
| 2219 0xBC, 0x9A, 0x78, 0x56, |
| 2220 0x34, 0x12, |
| 2221 // private flags |
| 2222 0x00, |
| 2223 |
| 2224 // frame type (congestion feedback frame) |
| 2225 0x20, |
| 2226 // congestion feedback type (tcp) |
| 2227 0x00, |
| 2228 // ack_frame.feedback.tcp.receive_window |
| 2229 0x03, 0x04, |
| 2230 }; |
| 2231 |
| 2232 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 2233 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 2234 |
| 2235 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2236 ASSERT_TRUE(visitor_.header_.get()); |
| 2237 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
| 2238 |
| 2239 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
| 2240 ASSERT_EQ(1u, visitor_.congestion_feedback_frames_.size()); |
| 2241 const QuicCongestionFeedbackFrame& frame = |
| 2242 *visitor_.congestion_feedback_frames_[0]; |
| 2243 ASSERT_EQ(kTCP, frame.type); |
| 2244 EXPECT_EQ(0x4030u, frame.tcp.receive_window); |
| 2245 |
| 2246 // Now test framing boundaries |
| 2247 for (size_t i = kQuicFrameTypeSize; i < 4; ++i) { |
| 2248 string expected_error; |
| 2249 if (i < 2) { |
| 2250 expected_error = "Unable to read congestion feedback type."; |
| 2251 } else if (i < 4) { |
| 2252 expected_error = "Unable to read receive window."; |
| 2253 } |
| 2254 CheckProcessingFails( |
| 2255 packet, |
| 2256 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 2257 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
| 2258 expected_error, QUIC_INVALID_CONGESTION_FEEDBACK_DATA); |
| 2259 } |
| 2260 } |
| 2261 |
| 2262 TEST_P(QuicFramerTest, CongestionFeedbackFrameTCPV14) { |
| 2263 if (framer_.version() > QUIC_VERSION_14) { |
| 2264 return; |
| 2265 } |
| 2266 unsigned char packet[] = { |
| 2267 // public flags (8 byte guid) |
| 2268 0x3C, |
| 2269 // guid |
| 2270 0x10, 0x32, 0x54, 0x76, |
| 2271 0x98, 0xBA, 0xDC, 0xFE, |
| 2272 // packet sequence number |
1901 0xBC, 0x9A, 0x78, 0x56, | 2273 0xBC, 0x9A, 0x78, 0x56, |
1902 0x34, 0x12, | 2274 0x34, 0x12, |
1903 // private flags | 2275 // private flags |
1904 0x00, | 2276 0x00, |
1905 | 2277 |
1906 // frame type (congestion feedback frame) | 2278 // frame type (congestion feedback frame) |
1907 0x20, | 2279 0x20, |
1908 // congestion feedback type (tcp) | 2280 // congestion feedback type (tcp) |
1909 0x00, | 2281 0x00, |
1910 // ack_frame.feedback.tcp.accumulated_number_of_lost_packets | 2282 // ack_frame.feedback.tcp.accumulated_number_of_lost_packets |
(...skipping 28 matching lines...) Expand all Loading... |
1939 } | 2311 } |
1940 CheckProcessingFails( | 2312 CheckProcessingFails( |
1941 packet, | 2313 packet, |
1942 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, | 2314 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
1943 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), | 2315 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
1944 expected_error, QUIC_INVALID_CONGESTION_FEEDBACK_DATA); | 2316 expected_error, QUIC_INVALID_CONGESTION_FEEDBACK_DATA); |
1945 } | 2317 } |
1946 } | 2318 } |
1947 | 2319 |
1948 TEST_P(QuicFramerTest, CongestionFeedbackFrameInterArrival) { | 2320 TEST_P(QuicFramerTest, CongestionFeedbackFrameInterArrival) { |
| 2321 if (framer_.version() <= QUIC_VERSION_14) { |
| 2322 return; |
| 2323 } |
1949 unsigned char packet[] = { | 2324 unsigned char packet[] = { |
1950 // public flags (8 byte guid) | 2325 // public flags (8 byte guid) |
1951 0x3C, | 2326 0x3C, |
| 2327 // guid |
| 2328 0x10, 0x32, 0x54, 0x76, |
| 2329 0x98, 0xBA, 0xDC, 0xFE, |
| 2330 // packet sequence number |
| 2331 0xBC, 0x9A, 0x78, 0x56, |
| 2332 0x34, 0x12, |
| 2333 // private flags |
| 2334 0x00, |
| 2335 |
| 2336 // frame type (congestion feedback frame) |
| 2337 0x20, |
| 2338 // congestion feedback type (inter arrival) |
| 2339 0x01, |
| 2340 // num received packets |
| 2341 0x03, |
| 2342 // lowest sequence number |
| 2343 0xBA, 0x9A, 0x78, 0x56, |
| 2344 0x34, 0x12, |
| 2345 // receive time |
| 2346 0x87, 0x96, 0xA5, 0xB4, |
| 2347 0xC3, 0xD2, 0xE1, 0x07, |
| 2348 // sequence delta |
| 2349 0x01, 0x00, |
| 2350 // time delta |
| 2351 0x01, 0x00, 0x00, 0x00, |
| 2352 // sequence delta (skip one packet) |
| 2353 0x03, 0x00, |
| 2354 // time delta |
| 2355 0x02, 0x00, 0x00, 0x00, |
| 2356 }; |
| 2357 |
| 2358 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
| 2359 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
| 2360 |
| 2361 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
| 2362 ASSERT_TRUE(visitor_.header_.get()); |
| 2363 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion)); |
| 2364 |
| 2365 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
| 2366 ASSERT_EQ(1u, visitor_.congestion_feedback_frames_.size()); |
| 2367 const QuicCongestionFeedbackFrame& frame = |
| 2368 *visitor_.congestion_feedback_frames_[0]; |
| 2369 ASSERT_EQ(kInterArrival, frame.type); |
| 2370 ASSERT_EQ(3u, frame.inter_arrival.received_packet_times.size()); |
| 2371 TimeMap::const_iterator iter = |
| 2372 frame.inter_arrival.received_packet_times.begin(); |
| 2373 EXPECT_EQ(GG_UINT64_C(0x0123456789ABA), iter->first); |
| 2374 EXPECT_EQ(GG_INT64_C(0x07E1D2C3B4A59687), |
| 2375 iter->second.Subtract(start_).ToMicroseconds()); |
| 2376 ++iter; |
| 2377 EXPECT_EQ(GG_UINT64_C(0x0123456789ABB), iter->first); |
| 2378 EXPECT_EQ(GG_INT64_C(0x07E1D2C3B4A59688), |
| 2379 iter->second.Subtract(start_).ToMicroseconds()); |
| 2380 ++iter; |
| 2381 EXPECT_EQ(GG_UINT64_C(0x0123456789ABD), iter->first); |
| 2382 EXPECT_EQ(GG_INT64_C(0x07E1D2C3B4A59689), |
| 2383 iter->second.Subtract(start_).ToMicroseconds()); |
| 2384 |
| 2385 // Now test framing boundaries |
| 2386 for (size_t i = kQuicFrameTypeSize; i < 29; ++i) { |
| 2387 string expected_error; |
| 2388 if (i < 2) { |
| 2389 expected_error = "Unable to read congestion feedback type."; |
| 2390 } else if (i < 3) { |
| 2391 expected_error = "Unable to read num received packets."; |
| 2392 } else if (i < 9) { |
| 2393 expected_error = "Unable to read smallest received."; |
| 2394 } else if (i < 17) { |
| 2395 expected_error = "Unable to read time received."; |
| 2396 } else if (i < 19) { |
| 2397 expected_error = "Unable to read sequence delta in received packets."; |
| 2398 } else if (i < 23) { |
| 2399 expected_error = "Unable to read time delta in received packets."; |
| 2400 } else if (i < 25) { |
| 2401 expected_error = "Unable to read sequence delta in received packets."; |
| 2402 } else if (i < 29) { |
| 2403 expected_error = "Unable to read time delta in received packets."; |
| 2404 } |
| 2405 CheckProcessingFails( |
| 2406 packet, |
| 2407 i + GetPacketHeaderSize(PACKET_8BYTE_GUID, !kIncludeVersion, |
| 2408 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP), |
| 2409 expected_error, QUIC_INVALID_CONGESTION_FEEDBACK_DATA); |
| 2410 } |
| 2411 } |
| 2412 |
| 2413 TEST_P(QuicFramerTest, CongestionFeedbackFrameInterArrivalV14) { |
| 2414 if (framer_.version() > QUIC_VERSION_14) { |
| 2415 return; |
| 2416 } |
| 2417 unsigned char packet[] = { |
| 2418 // public flags (8 byte guid) |
| 2419 0x3C, |
1952 // guid | 2420 // guid |
1953 0x10, 0x32, 0x54, 0x76, | 2421 0x10, 0x32, 0x54, 0x76, |
1954 0x98, 0xBA, 0xDC, 0xFE, | 2422 0x98, 0xBA, 0xDC, 0xFE, |
1955 // packet sequence number | 2423 // packet sequence number |
1956 0xBC, 0x9A, 0x78, 0x56, | 2424 0xBC, 0x9A, 0x78, 0x56, |
1957 0x34, 0x12, | 2425 0x34, 0x12, |
1958 // private flags | 2426 // private flags |
1959 0x00, | 2427 0x00, |
1960 | 2428 |
1961 // frame type (congestion feedback frame) | 2429 // frame type (congestion feedback frame) |
(...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2526 visitor_.public_reset_packet_->client_address.address().empty()); | 2994 visitor_.public_reset_packet_->client_address.address().empty()); |
2527 | 2995 |
2528 // Now test framing boundaries | 2996 // Now test framing boundaries |
2529 for (size_t i = 0; i < arraysize(packet); ++i) { | 2997 for (size_t i = 0; i < arraysize(packet); ++i) { |
2530 string expected_error; | 2998 string expected_error; |
2531 DLOG(INFO) << "iteration: " << i; | 2999 DLOG(INFO) << "iteration: " << i; |
2532 if (i < kGuidOffset) { | 3000 if (i < kGuidOffset) { |
2533 expected_error = "Unable to read public flags."; | 3001 expected_error = "Unable to read public flags."; |
2534 CheckProcessingFails(packet, i, expected_error, | 3002 CheckProcessingFails(packet, i, expected_error, |
2535 QUIC_INVALID_PACKET_HEADER); | 3003 QUIC_INVALID_PACKET_HEADER); |
2536 } else if (i < kPublicResetPacketNonceProofOffset) { | 3004 } else if (i < kPublicResetPacketMessageTagOffset) { |
2537 expected_error = "Unable to read GUID."; | 3005 expected_error = "Unable to read GUID."; |
2538 CheckProcessingFails(packet, i, expected_error, | 3006 CheckProcessingFails(packet, i, expected_error, |
2539 QUIC_INVALID_PACKET_HEADER); | 3007 QUIC_INVALID_PACKET_HEADER); |
2540 } else if (i < kPublicResetPacketRejectedSequenceNumberOffset) { | |
2541 expected_error = "Unable to read nonce proof."; | |
2542 CheckProcessingFails(packet, i, expected_error, | |
2543 QUIC_INVALID_PUBLIC_RST_PACKET); | |
2544 } else if (i < kPublicResetPacketOldSize) { | |
2545 expected_error = "Unable to read rejected sequence number."; | |
2546 CheckProcessingFails(packet, i, expected_error, | |
2547 QUIC_INVALID_PUBLIC_RST_PACKET); | |
2548 } else if (i == kPublicResetPacketOldSize) { | |
2549 // This looks like an old public reset packet, so there won't be an | |
2550 // error. | |
2551 } else { | 3008 } else { |
2552 expected_error = "Unable to read reset message."; | 3009 expected_error = "Unable to read reset message."; |
2553 CheckProcessingFails(packet, i, expected_error, | 3010 CheckProcessingFails(packet, i, expected_error, |
2554 QUIC_INVALID_PUBLIC_RST_PACKET); | 3011 QUIC_INVALID_PUBLIC_RST_PACKET); |
2555 } | 3012 } |
2556 } | 3013 } |
2557 } | 3014 } |
2558 | 3015 |
| 3016 TEST_P(QuicFramerTest, PublicResetPacketWithTrailingJunk) { |
| 3017 unsigned char packet[] = { |
| 3018 // public flags (public reset, 8 byte guid) |
| 3019 0x0E, |
| 3020 // guid |
| 3021 0x10, 0x32, 0x54, 0x76, |
| 3022 0x98, 0xBA, 0xDC, 0xFE, |
| 3023 // message tag (kPRST) |
| 3024 'P', 'R', 'S', 'T', |
| 3025 // num_entries (2) + padding |
| 3026 0x02, 0x00, 0x00, 0x00, |
| 3027 // tag kRNON |
| 3028 'R', 'N', 'O', 'N', |
| 3029 // end offset 8 |
| 3030 0x08, 0x00, 0x00, 0x00, |
| 3031 // tag kRSEQ |
| 3032 'R', 'S', 'E', 'Q', |
| 3033 // end offset 16 |
| 3034 0x10, 0x00, 0x00, 0x00, |
| 3035 // nonce proof |
| 3036 0x89, 0x67, 0x45, 0x23, |
| 3037 0x01, 0xEF, 0xCD, 0xAB, |
| 3038 // rejected sequence number |
| 3039 0xBC, 0x9A, 0x78, 0x56, |
| 3040 0x34, 0x12, 0x00, 0x00, |
| 3041 // trailing junk |
| 3042 'j', 'u', 'n', 'k', |
| 3043 }; |
| 3044 |
| 3045 string expected_error = "Unable to read reset message."; |
| 3046 CheckProcessingFails(packet, arraysize(packet), expected_error, |
| 3047 QUIC_INVALID_PUBLIC_RST_PACKET); |
| 3048 } |
| 3049 |
2559 TEST_P(QuicFramerTest, PublicResetPacketWithClientAddress) { | 3050 TEST_P(QuicFramerTest, PublicResetPacketWithClientAddress) { |
2560 unsigned char packet[] = { | 3051 unsigned char packet[] = { |
2561 // public flags (public reset, 8 byte guid) | 3052 // public flags (public reset, 8 byte guid) |
2562 0x0E, | 3053 0x0E, |
2563 // guid | 3054 // guid |
2564 0x10, 0x32, 0x54, 0x76, | 3055 0x10, 0x32, 0x54, 0x76, |
2565 0x98, 0xBA, 0xDC, 0xFE, | 3056 0x98, 0xBA, 0xDC, 0xFE, |
2566 // message tag (kPRST) | 3057 // message tag (kPRST) |
2567 'P', 'R', 'S', 'T', | 3058 'P', 'R', 'S', 'T', |
2568 // num_entries (3) + padding | 3059 // num_entries (3) + padding |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2609 EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port()); | 3100 EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port()); |
2610 | 3101 |
2611 // Now test framing boundaries | 3102 // Now test framing boundaries |
2612 for (size_t i = 0; i < arraysize(packet); ++i) { | 3103 for (size_t i = 0; i < arraysize(packet); ++i) { |
2613 string expected_error; | 3104 string expected_error; |
2614 DLOG(INFO) << "iteration: " << i; | 3105 DLOG(INFO) << "iteration: " << i; |
2615 if (i < kGuidOffset) { | 3106 if (i < kGuidOffset) { |
2616 expected_error = "Unable to read public flags."; | 3107 expected_error = "Unable to read public flags."; |
2617 CheckProcessingFails(packet, i, expected_error, | 3108 CheckProcessingFails(packet, i, expected_error, |
2618 QUIC_INVALID_PACKET_HEADER); | 3109 QUIC_INVALID_PACKET_HEADER); |
2619 } else if (i < kPublicResetPacketNonceProofOffset) { | 3110 } else if (i < kPublicResetPacketMessageTagOffset) { |
2620 expected_error = "Unable to read GUID."; | 3111 expected_error = "Unable to read GUID."; |
2621 CheckProcessingFails(packet, i, expected_error, | 3112 CheckProcessingFails(packet, i, expected_error, |
2622 QUIC_INVALID_PACKET_HEADER); | 3113 QUIC_INVALID_PACKET_HEADER); |
2623 } else if (i < kPublicResetPacketRejectedSequenceNumberOffset) { | |
2624 expected_error = "Unable to read nonce proof."; | |
2625 CheckProcessingFails(packet, i, expected_error, | |
2626 QUIC_INVALID_PUBLIC_RST_PACKET); | |
2627 } else if (i < kPublicResetPacketOldSize) { | |
2628 expected_error = "Unable to read rejected sequence number."; | |
2629 CheckProcessingFails(packet, i, expected_error, | |
2630 QUIC_INVALID_PUBLIC_RST_PACKET); | |
2631 } else if (i == kPublicResetPacketOldSize) { | |
2632 // This looks like an old public reset packet, so there won't be an | |
2633 // error. | |
2634 } else { | 3114 } else { |
2635 expected_error = "Unable to read reset message."; | 3115 expected_error = "Unable to read reset message."; |
2636 CheckProcessingFails(packet, i, expected_error, | 3116 CheckProcessingFails(packet, i, expected_error, |
2637 QUIC_INVALID_PUBLIC_RST_PACKET); | 3117 QUIC_INVALID_PUBLIC_RST_PACKET); |
2638 } | 3118 } |
2639 } | 3119 } |
2640 } | 3120 } |
2641 | 3121 |
2642 // TODO(wtc): remove this test when we drop support for QUIC_VERSION_13. | 3122 // TODO(wtc): remove this test when we drop support for QUIC_VERSION_13. |
2643 TEST_P(QuicFramerTest, PublicResetPacketOld) { | 3123 TEST_P(QuicFramerTest, PublicResetPacketOld) { |
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3084 versions.push_back(GetParam()); | 3564 versions.push_back(GetParam()); |
3085 scoped_ptr<QuicEncryptedPacket> data( | 3565 scoped_ptr<QuicEncryptedPacket> data( |
3086 framer_.BuildVersionNegotiationPacket(header, versions)); | 3566 framer_.BuildVersionNegotiationPacket(header, versions)); |
3087 | 3567 |
3088 test::CompareCharArraysWithHexError("constructed packet", | 3568 test::CompareCharArraysWithHexError("constructed packet", |
3089 data->data(), data->length(), | 3569 data->data(), data->length(), |
3090 AsChars(packet), arraysize(packet)); | 3570 AsChars(packet), arraysize(packet)); |
3091 } | 3571 } |
3092 | 3572 |
3093 TEST_P(QuicFramerTest, BuildAckFramePacket) { | 3573 TEST_P(QuicFramerTest, BuildAckFramePacket) { |
| 3574 if (version_ <= QUIC_VERSION_14) { |
| 3575 return; |
| 3576 } |
3094 QuicPacketHeader header; | 3577 QuicPacketHeader header; |
3095 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); | 3578 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
3096 header.public_header.reset_flag = false; | 3579 header.public_header.reset_flag = false; |
| 3580 header.public_header.version_flag = false; |
| 3581 header.fec_flag = false; |
| 3582 header.entropy_flag = true; |
| 3583 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); |
| 3584 header.fec_group = 0; |
| 3585 |
| 3586 QuicAckFrame ack_frame; |
| 3587 ack_frame.received_info.entropy_hash = 0x43; |
| 3588 ack_frame.received_info.largest_observed = GG_UINT64_C(0x770123456789ABF); |
| 3589 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero(); |
| 3590 ack_frame.received_info.missing_packets.insert( |
| 3591 GG_UINT64_C(0x770123456789ABE)); |
| 3592 ack_frame.sent_info.entropy_hash = 0x14; |
| 3593 ack_frame.sent_info.least_unacked = GG_UINT64_C(0x770123456789AA0); |
| 3594 |
| 3595 QuicFrames frames; |
| 3596 frames.push_back(QuicFrame(&ack_frame)); |
| 3597 |
| 3598 unsigned char packet[] = { |
| 3599 // public flags (8 byte guid) |
| 3600 0x3C, |
| 3601 // guid |
| 3602 0x10, 0x32, 0x54, 0x76, |
| 3603 0x98, 0xBA, 0xDC, 0xFE, |
| 3604 // packet sequence number |
| 3605 0xA8, 0x9A, 0x78, 0x56, |
| 3606 0x34, 0x12, |
| 3607 // private flags (entropy) |
| 3608 0x01, |
| 3609 |
| 3610 // frame type (ack frame) |
| 3611 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
| 3612 0x6C, |
| 3613 // entropy hash of sent packets till least awaiting - 1. |
| 3614 0x14, |
| 3615 // least packet sequence number awaiting an ack, delta from sequence number. |
| 3616 0x08, 0x00, 0x00, 0x00, |
| 3617 0x00, 0x00, |
| 3618 // entropy hash of all received packets. |
| 3619 0x43, |
| 3620 // largest observed packet sequence number |
| 3621 0xBF, 0x9A, 0x78, 0x56, |
| 3622 0x34, 0x12, |
| 3623 // Zero delta time. |
| 3624 0x0, 0x0, |
| 3625 // num missing packet ranges |
| 3626 0x01, |
| 3627 // missing packet delta |
| 3628 0x01, |
| 3629 // 0 more missing packets in range. |
| 3630 0x00, |
| 3631 // 0 revived packets. |
| 3632 0x00, |
| 3633 }; |
| 3634 |
| 3635 scoped_ptr<QuicPacket> data( |
| 3636 framer_.BuildUnsizedDataPacket(header, frames).packet); |
| 3637 ASSERT_TRUE(data != NULL); |
| 3638 |
| 3639 test::CompareCharArraysWithHexError("constructed packet", |
| 3640 data->data(), data->length(), |
| 3641 AsChars(packet), arraysize(packet)); |
| 3642 } |
| 3643 |
| 3644 TEST_P(QuicFramerTest, BuildAckFramePacketV14) { |
| 3645 if (version_ > QUIC_VERSION_14) { |
| 3646 return; |
| 3647 } |
| 3648 QuicPacketHeader header; |
| 3649 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
| 3650 header.public_header.reset_flag = false; |
3097 header.public_header.version_flag = false; | 3651 header.public_header.version_flag = false; |
3098 header.fec_flag = false; | 3652 header.fec_flag = false; |
3099 header.entropy_flag = true; | 3653 header.entropy_flag = true; |
3100 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); | 3654 header.packet_sequence_number = GG_UINT64_C(0x770123456789AA8); |
3101 header.fec_group = 0; | 3655 header.fec_group = 0; |
3102 | 3656 |
3103 QuicAckFrame ack_frame; | 3657 QuicAckFrame ack_frame; |
3104 ack_frame.received_info.entropy_hash = 0x43; | 3658 ack_frame.received_info.entropy_hash = 0x43; |
3105 ack_frame.received_info.largest_observed = GG_UINT64_C(0x770123456789ABF); | 3659 ack_frame.received_info.largest_observed = GG_UINT64_C(0x770123456789ABF); |
3106 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero(); | 3660 ack_frame.received_info.delta_time_largest_observed = QuicTime::Delta::Zero(); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3150 scoped_ptr<QuicPacket> data( | 3704 scoped_ptr<QuicPacket> data( |
3151 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3705 framer_.BuildUnsizedDataPacket(header, frames).packet); |
3152 ASSERT_TRUE(data != NULL); | 3706 ASSERT_TRUE(data != NULL); |
3153 | 3707 |
3154 test::CompareCharArraysWithHexError("constructed packet", | 3708 test::CompareCharArraysWithHexError("constructed packet", |
3155 data->data(), data->length(), | 3709 data->data(), data->length(), |
3156 AsChars(packet), arraysize(packet)); | 3710 AsChars(packet), arraysize(packet)); |
3157 } | 3711 } |
3158 | 3712 |
3159 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketTCP) { | 3713 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketTCP) { |
| 3714 if (version_ <= QUIC_VERSION_14) { |
| 3715 return; |
| 3716 } |
3160 QuicPacketHeader header; | 3717 QuicPacketHeader header; |
3161 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); | 3718 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
3162 header.public_header.reset_flag = false; | 3719 header.public_header.reset_flag = false; |
| 3720 header.public_header.version_flag = false; |
| 3721 header.fec_flag = false; |
| 3722 header.entropy_flag = false; |
| 3723 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
| 3724 header.fec_group = 0; |
| 3725 |
| 3726 QuicCongestionFeedbackFrame congestion_feedback_frame; |
| 3727 congestion_feedback_frame.type = kTCP; |
| 3728 congestion_feedback_frame.tcp.receive_window = 0x4030; |
| 3729 |
| 3730 QuicFrames frames; |
| 3731 frames.push_back(QuicFrame(&congestion_feedback_frame)); |
| 3732 |
| 3733 unsigned char packet[] = { |
| 3734 // public flags (8 byte guid) |
| 3735 0x3C, |
| 3736 // guid |
| 3737 0x10, 0x32, 0x54, 0x76, |
| 3738 0x98, 0xBA, 0xDC, 0xFE, |
| 3739 // packet sequence number |
| 3740 0xBC, 0x9A, 0x78, 0x56, |
| 3741 0x34, 0x12, |
| 3742 // private flags |
| 3743 0x00, |
| 3744 |
| 3745 // frame type (congestion feedback frame) |
| 3746 0x20, |
| 3747 // congestion feedback type (TCP) |
| 3748 0x00, |
| 3749 // TCP receive window |
| 3750 0x03, 0x04, |
| 3751 }; |
| 3752 |
| 3753 scoped_ptr<QuicPacket> data( |
| 3754 framer_.BuildUnsizedDataPacket(header, frames).packet); |
| 3755 ASSERT_TRUE(data != NULL); |
| 3756 |
| 3757 test::CompareCharArraysWithHexError("constructed packet", |
| 3758 data->data(), data->length(), |
| 3759 AsChars(packet), arraysize(packet)); |
| 3760 } |
| 3761 |
| 3762 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketTCPV14) { |
| 3763 if (version_ > QUIC_VERSION_14) { |
| 3764 return; |
| 3765 } |
| 3766 QuicPacketHeader header; |
| 3767 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
| 3768 header.public_header.reset_flag = false; |
3163 header.public_header.version_flag = false; | 3769 header.public_header.version_flag = false; |
3164 header.fec_flag = false; | 3770 header.fec_flag = false; |
3165 header.entropy_flag = false; | 3771 header.entropy_flag = false; |
3166 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 3772 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
3167 header.fec_group = 0; | 3773 header.fec_group = 0; |
3168 | 3774 |
3169 QuicCongestionFeedbackFrame congestion_feedback_frame; | 3775 QuicCongestionFeedbackFrame congestion_feedback_frame; |
3170 congestion_feedback_frame.type = kTCP; | 3776 congestion_feedback_frame.type = kTCP; |
3171 congestion_feedback_frame.tcp.receive_window = 0x4030; | 3777 congestion_feedback_frame.tcp.receive_window = 0x4030; |
3172 | 3778 |
(...skipping 25 matching lines...) Expand all Loading... |
3198 scoped_ptr<QuicPacket> data( | 3804 scoped_ptr<QuicPacket> data( |
3199 framer_.BuildUnsizedDataPacket(header, frames).packet); | 3805 framer_.BuildUnsizedDataPacket(header, frames).packet); |
3200 ASSERT_TRUE(data != NULL); | 3806 ASSERT_TRUE(data != NULL); |
3201 | 3807 |
3202 test::CompareCharArraysWithHexError("constructed packet", | 3808 test::CompareCharArraysWithHexError("constructed packet", |
3203 data->data(), data->length(), | 3809 data->data(), data->length(), |
3204 AsChars(packet), arraysize(packet)); | 3810 AsChars(packet), arraysize(packet)); |
3205 } | 3811 } |
3206 | 3812 |
3207 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketInterArrival) { | 3813 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketInterArrival) { |
| 3814 if (version_ <= QUIC_VERSION_14) { |
| 3815 return; |
| 3816 } |
3208 QuicPacketHeader header; | 3817 QuicPacketHeader header; |
3209 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); | 3818 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
3210 header.public_header.reset_flag = false; | 3819 header.public_header.reset_flag = false; |
| 3820 header.public_header.version_flag = false; |
| 3821 header.fec_flag = false; |
| 3822 header.entropy_flag = false; |
| 3823 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
| 3824 header.fec_group = 0; |
| 3825 |
| 3826 QuicCongestionFeedbackFrame frame; |
| 3827 frame.type = kInterArrival; |
| 3828 frame.inter_arrival.received_packet_times.insert( |
| 3829 make_pair(GG_UINT64_C(0x0123456789ABA), |
| 3830 start_.Add(QuicTime::Delta::FromMicroseconds( |
| 3831 GG_UINT64_C(0x07E1D2C3B4A59687))))); |
| 3832 frame.inter_arrival.received_packet_times.insert( |
| 3833 make_pair(GG_UINT64_C(0x0123456789ABB), |
| 3834 start_.Add(QuicTime::Delta::FromMicroseconds( |
| 3835 GG_UINT64_C(0x07E1D2C3B4A59688))))); |
| 3836 frame.inter_arrival.received_packet_times.insert( |
| 3837 make_pair(GG_UINT64_C(0x0123456789ABD), |
| 3838 start_.Add(QuicTime::Delta::FromMicroseconds( |
| 3839 GG_UINT64_C(0x07E1D2C3B4A59689))))); |
| 3840 QuicFrames frames; |
| 3841 frames.push_back(QuicFrame(&frame)); |
| 3842 |
| 3843 unsigned char packet[] = { |
| 3844 // public flags (8 byte guid) |
| 3845 0x3C, |
| 3846 // guid |
| 3847 0x10, 0x32, 0x54, 0x76, |
| 3848 0x98, 0xBA, 0xDC, 0xFE, |
| 3849 // packet sequence number |
| 3850 0xBC, 0x9A, 0x78, 0x56, |
| 3851 0x34, 0x12, |
| 3852 // private flags |
| 3853 0x00, |
| 3854 |
| 3855 // frame type (congestion feedback frame) |
| 3856 0x20, |
| 3857 // congestion feedback type (inter arrival) |
| 3858 0x01, |
| 3859 // num received packets |
| 3860 0x03, |
| 3861 // lowest sequence number |
| 3862 0xBA, 0x9A, 0x78, 0x56, |
| 3863 0x34, 0x12, |
| 3864 // receive time |
| 3865 0x87, 0x96, 0xA5, 0xB4, |
| 3866 0xC3, 0xD2, 0xE1, 0x07, |
| 3867 // sequence delta |
| 3868 0x01, 0x00, |
| 3869 // time delta |
| 3870 0x01, 0x00, 0x00, 0x00, |
| 3871 // sequence delta (skip one packet) |
| 3872 0x03, 0x00, |
| 3873 // time delta |
| 3874 0x02, 0x00, 0x00, 0x00, |
| 3875 }; |
| 3876 |
| 3877 scoped_ptr<QuicPacket> data( |
| 3878 framer_.BuildUnsizedDataPacket(header, frames).packet); |
| 3879 ASSERT_TRUE(data != NULL); |
| 3880 |
| 3881 test::CompareCharArraysWithHexError("constructed packet", |
| 3882 data->data(), data->length(), |
| 3883 AsChars(packet), arraysize(packet)); |
| 3884 } |
| 3885 |
| 3886 TEST_P(QuicFramerTest, BuildCongestionFeedbackFramePacketInterArrivalV14) { |
| 3887 if (version_ > QUIC_VERSION_14) { |
| 3888 return; |
| 3889 } |
| 3890 QuicPacketHeader header; |
| 3891 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
| 3892 header.public_header.reset_flag = false; |
3211 header.public_header.version_flag = false; | 3893 header.public_header.version_flag = false; |
3212 header.fec_flag = false; | 3894 header.fec_flag = false; |
3213 header.entropy_flag = false; | 3895 header.entropy_flag = false; |
3214 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 3896 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
3215 header.fec_group = 0; | 3897 header.fec_group = 0; |
3216 | 3898 |
3217 QuicCongestionFeedbackFrame frame; | 3899 QuicCongestionFeedbackFrame frame; |
3218 frame.type = kInterArrival; | 3900 frame.type = kInterArrival; |
3219 frame.inter_arrival.received_packet_times.insert( | 3901 frame.inter_arrival.received_packet_times.insert( |
3220 make_pair(GG_UINT64_C(0x0123456789ABA), | 3902 make_pair(GG_UINT64_C(0x0123456789ABA), |
(...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3893 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); | 4575 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
3894 header.public_header.reset_flag = false; | 4576 header.public_header.reset_flag = false; |
3895 header.public_header.version_flag = false; | 4577 header.public_header.version_flag = false; |
3896 header.fec_flag = false; | 4578 header.fec_flag = false; |
3897 header.entropy_flag = false; | 4579 header.entropy_flag = false; |
3898 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 4580 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
3899 header.fec_group = 0; | 4581 header.fec_group = 0; |
3900 | 4582 |
3901 QuicAckFrame ack_frame; | 4583 QuicAckFrame ack_frame; |
3902 ack_frame.received_info.largest_observed = 601; | 4584 ack_frame.received_info.largest_observed = 601; |
3903 ack_frame.sent_info.least_unacked = 0; | 4585 ack_frame.sent_info.least_unacked = header.packet_sequence_number - 1; |
3904 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; i += 2) { | 4586 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; i += 2) { |
3905 ack_frame.received_info.missing_packets.insert(i); | 4587 ack_frame.received_info.missing_packets.insert(i); |
3906 } | 4588 } |
3907 | 4589 |
3908 // Create a packet with just the ack | 4590 // Create a packet with just the ack |
3909 QuicFrame frame; | 4591 QuicFrame frame; |
3910 frame.type = ACK_FRAME; | 4592 frame.type = ACK_FRAME; |
3911 frame.ack_frame = &ack_frame; | 4593 frame.ack_frame = &ack_frame; |
3912 QuicFrames frames; | 4594 QuicFrames frames; |
3913 frames.push_back(frame); | 4595 frames.push_back(frame); |
3914 | 4596 |
3915 scoped_ptr<QuicPacket> raw_ack_packet( | 4597 scoped_ptr<QuicPacket> raw_ack_packet( |
3916 framer_.BuildUnsizedDataPacket(header, frames).packet); | 4598 framer_.BuildUnsizedDataPacket(header, frames).packet); |
3917 ASSERT_TRUE(raw_ack_packet != NULL); | 4599 ASSERT_TRUE(raw_ack_packet != NULL); |
3918 | 4600 |
3919 scoped_ptr<QuicEncryptedPacket> ack_packet( | 4601 scoped_ptr<QuicEncryptedPacket> ack_packet( |
3920 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, | 4602 framer_.EncryptPacket(ENCRYPTION_NONE, header.packet_sequence_number, |
3921 *raw_ack_packet)); | 4603 *raw_ack_packet)); |
3922 | 4604 |
3923 // Now make sure we can turn our ack packet back into an ack frame | 4605 // Now make sure we can turn our ack packet back into an ack frame |
3924 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); | 4606 ASSERT_TRUE(framer_.ProcessPacket(*ack_packet)); |
3925 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 4607 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
3926 const QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; | 4608 const QuicAckFrame& processed_ack_frame = *visitor_.ack_frames_[0]; |
3927 EXPECT_EQ(0u, processed_ack_frame.sent_info.least_unacked); | 4609 EXPECT_EQ(header.packet_sequence_number - 1, |
| 4610 processed_ack_frame.sent_info.least_unacked); |
3928 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated); | 4611 EXPECT_TRUE(processed_ack_frame.received_info.is_truncated); |
3929 EXPECT_EQ(510u, processed_ack_frame.received_info.largest_observed); | 4612 EXPECT_EQ(510u, processed_ack_frame.received_info.largest_observed); |
3930 ASSERT_EQ(255u, processed_ack_frame.received_info.missing_packets.size()); | 4613 ASSERT_EQ(255u, processed_ack_frame.received_info.missing_packets.size()); |
3931 SequenceNumberSet::const_iterator missing_iter = | 4614 SequenceNumberSet::const_iterator missing_iter = |
3932 processed_ack_frame.received_info.missing_packets.begin(); | 4615 processed_ack_frame.received_info.missing_packets.begin(); |
3933 EXPECT_EQ(1u, *missing_iter); | 4616 EXPECT_EQ(1u, *missing_iter); |
3934 SequenceNumberSet::const_reverse_iterator last_missing_iter = | 4617 SequenceNumberSet::const_reverse_iterator last_missing_iter = |
3935 processed_ack_frame.received_info.missing_packets.rbegin(); | 4618 processed_ack_frame.received_info.missing_packets.rbegin(); |
3936 EXPECT_EQ(509u, *last_missing_iter); | 4619 EXPECT_EQ(509u, *last_missing_iter); |
3937 } | 4620 } |
3938 | 4621 |
3939 TEST_P(QuicFramerTest, CleanTruncation) { | 4622 TEST_P(QuicFramerTest, CleanTruncation) { |
3940 QuicPacketHeader header; | 4623 QuicPacketHeader header; |
3941 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); | 4624 header.public_header.guid = GG_UINT64_C(0xFEDCBA9876543210); |
3942 header.public_header.reset_flag = false; | 4625 header.public_header.reset_flag = false; |
3943 header.public_header.version_flag = false; | 4626 header.public_header.version_flag = false; |
3944 header.fec_flag = false; | 4627 header.fec_flag = false; |
3945 header.entropy_flag = true; | 4628 header.entropy_flag = true; |
3946 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); | 4629 header.packet_sequence_number = GG_UINT64_C(0x123456789ABC); |
3947 header.fec_group = 0; | 4630 header.fec_group = 0; |
3948 | 4631 |
3949 QuicAckFrame ack_frame; | 4632 QuicAckFrame ack_frame; |
3950 ack_frame.received_info.largest_observed = 201; | 4633 ack_frame.received_info.largest_observed = 201; |
3951 ack_frame.sent_info.least_unacked = 0; | 4634 ack_frame.sent_info.least_unacked = header.packet_sequence_number - 2; |
3952 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; ++i) { | 4635 for (uint64 i = 1; i < ack_frame.received_info.largest_observed; ++i) { |
3953 ack_frame.received_info.missing_packets.insert(i); | 4636 ack_frame.received_info.missing_packets.insert(i); |
3954 } | 4637 } |
3955 | 4638 |
3956 // Create a packet with just the ack | 4639 // Create a packet with just the ack |
3957 QuicFrame frame; | 4640 QuicFrame frame; |
3958 frame.type = ACK_FRAME; | 4641 frame.type = ACK_FRAME; |
3959 frame.ack_frame = &ack_frame; | 4642 frame.ack_frame = &ack_frame; |
3960 QuicFrames frames; | 4643 QuicFrames frames; |
3961 frames.push_back(frame); | 4644 frames.push_back(frame); |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4113 EXPECT_CALL(visitor, OnPacketComplete()); | 4796 EXPECT_CALL(visitor, OnPacketComplete()); |
4114 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); | 4797 EXPECT_CALL(visitor, OnUnauthenticatedPublicHeader(_)).WillOnce(Return(true)); |
4115 | 4798 |
4116 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 4799 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
4117 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 4800 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
4118 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 4801 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
4119 } | 4802 } |
4120 | 4803 |
4121 } // namespace test | 4804 } // namespace test |
4122 } // namespace net | 4805 } // namespace net |
OLD | NEW |