OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/core/quic_framer.h" | 5 #include "net/quic/core/quic_framer.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cstdint> | 8 #include <cstdint> |
9 #include <map> | 9 #include <map> |
10 #include <memory> | 10 #include <memory> |
(...skipping 21 matching lines...) Expand all Loading... |
32 | 32 |
33 namespace net { | 33 namespace net { |
34 namespace test { | 34 namespace test { |
35 | 35 |
36 const QuicPacketNumber kEpoch = UINT64_C(1) << 48; | 36 const QuicPacketNumber kEpoch = UINT64_C(1) << 48; |
37 const QuicPacketNumber kMask = kEpoch - 1; | 37 const QuicPacketNumber kMask = kEpoch - 1; |
38 | 38 |
39 // Use fields in which each byte is distinct to ensure that every byte is | 39 // Use fields in which each byte is distinct to ensure that every byte is |
40 // framed correctly. The values are otherwise arbitrary. | 40 // framed correctly. The values are otherwise arbitrary. |
41 const QuicConnectionId kConnectionId = UINT64_C(0xFEDCBA9876543210); | 41 const QuicConnectionId kConnectionId = UINT64_C(0xFEDCBA9876543210); |
42 const QuicPathId kPathId = 0x42; | |
43 const QuicPacketNumber kPacketNumber = UINT64_C(0x123456789ABC); | 42 const QuicPacketNumber kPacketNumber = UINT64_C(0x123456789ABC); |
44 const QuicPacketNumber kSmallLargestObserved = UINT16_C(0x1234); | 43 const QuicPacketNumber kSmallLargestObserved = UINT16_C(0x1234); |
45 const QuicPacketNumber kSmallMissingPacket = UINT16_C(0x1233); | 44 const QuicPacketNumber kSmallMissingPacket = UINT16_C(0x1233); |
46 const QuicPacketNumber kLeastUnacked = UINT64_C(0x0123456789AA0); | 45 const QuicPacketNumber kLeastUnacked = UINT64_C(0x0123456789AA0); |
47 const QuicStreamId kStreamId = UINT64_C(0x01020304); | 46 const QuicStreamId kStreamId = UINT64_C(0x01020304); |
48 const QuicStreamOffset kStreamOffset = UINT64_C(0xBA98FEDC32107654); | 47 const QuicStreamOffset kStreamOffset = UINT64_C(0xBA98FEDC32107654); |
49 const QuicPublicResetNonceProof kNonceProof = UINT64_C(0xABCDEF0123456789); | 48 const QuicPublicResetNonceProof kNonceProof = UINT64_C(0xABCDEF0123456789); |
50 | 49 |
51 // Index into the connection_id offset in the header. | 50 // Index into the connection_id offset in the header. |
52 const size_t kConnectionIdOffset = kPublicFlagsSize; | 51 const size_t kConnectionIdOffset = kPublicFlagsSize; |
(...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
754 expected_error = "Unable to read ConnectionId."; | 753 expected_error = "Unable to read ConnectionId."; |
755 } else if (i < GetPacketNumberOffset(kIncludeVersion, !kIncludePathId)) { | 754 } else if (i < GetPacketNumberOffset(kIncludeVersion, !kIncludePathId)) { |
756 expected_error = "Unable to read protocol version."; | 755 expected_error = "Unable to read protocol version."; |
757 } else { | 756 } else { |
758 expected_error = "Unable to read packet number."; | 757 expected_error = "Unable to read packet number."; |
759 } | 758 } |
760 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); | 759 CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER); |
761 } | 760 } |
762 } | 761 } |
763 | 762 |
764 TEST_P(QuicFramerTest, PacketHeaderWithPathChange) { | |
765 // Packet 1 from path 0x42. | |
766 // clang-format off | |
767 unsigned char packet1[] = { | |
768 // public flags (version) | |
769 0x78, | |
770 // connection_id | |
771 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
772 // path_id | |
773 0x42, | |
774 // packet number | |
775 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
776 }; | |
777 // clang-format on | |
778 | |
779 EXPECT_EQ(0u, QuicFramerPeer::GetLastPacketNumber(&framer_)); | |
780 EXPECT_EQ(kInvalidPathId, QuicFramerPeer::GetLastPathId(&framer_)); | |
781 QuicEncryptedPacket encrypted1(AsChars(packet1), arraysize(packet1), false); | |
782 EXPECT_FALSE(framer_.ProcessPacket(encrypted1)); | |
783 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | |
784 ASSERT_TRUE(visitor_.header_.get()); | |
785 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); | |
786 EXPECT_EQ(kPathId, visitor_.header_->path_id); | |
787 EXPECT_EQ(kPacketNumber, visitor_.header_->packet_number); | |
788 EXPECT_EQ(kPacketNumber, QuicFramerPeer::GetLastPacketNumber(&framer_)); | |
789 EXPECT_EQ(kPathId, QuicFramerPeer::GetLastPathId(&framer_)); | |
790 | |
791 // Packet 2 from default path. | |
792 // clang-format off | |
793 unsigned char packet2[] = { | |
794 // public flags (version) | |
795 0x78, | |
796 // connection_id | |
797 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
798 // path_id | |
799 0x00, | |
800 // packet number | |
801 0xCC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
802 }; | |
803 // clang-format on | |
804 | |
805 QuicEncryptedPacket encrypted2(AsChars(packet2), arraysize(packet2), false); | |
806 EXPECT_FALSE(framer_.ProcessPacket(encrypted2)); | |
807 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | |
808 ASSERT_TRUE(visitor_.header_.get()); | |
809 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); | |
810 EXPECT_EQ(kDefaultPathId, visitor_.header_->path_id); | |
811 EXPECT_EQ(kPacketNumber + 16, visitor_.header_->packet_number); | |
812 EXPECT_EQ(kPacketNumber + 16, QuicFramerPeer::GetLastPacketNumber(&framer_)); | |
813 EXPECT_EQ(kDefaultPathId, QuicFramerPeer::GetLastPathId(&framer_)); | |
814 | |
815 // Packet 3 from path 0x42. | |
816 // clang-format off | |
817 unsigned char packet3[] = { | |
818 // public flags (version) | |
819 0x78, | |
820 // connection_id | |
821 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
822 // path_id | |
823 0x42, | |
824 // packet number | |
825 0xBD, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
826 }; | |
827 // clang-format on | |
828 | |
829 QuicEncryptedPacket encrypted3(AsChars(packet3), arraysize(packet3), false); | |
830 EXPECT_FALSE(framer_.ProcessPacket(encrypted3)); | |
831 EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error()); | |
832 ASSERT_TRUE(visitor_.header_.get()); | |
833 EXPECT_EQ(kConnectionId, visitor_.header_->public_header.connection_id); | |
834 EXPECT_EQ(kPathId, visitor_.header_->path_id); | |
835 EXPECT_EQ(kPacketNumber + 1, visitor_.header_->packet_number); | |
836 EXPECT_EQ(kPacketNumber + 1, QuicFramerPeer::GetLastPacketNumber(&framer_)); | |
837 EXPECT_EQ(kPathId, QuicFramerPeer::GetLastPathId(&framer_)); | |
838 } | |
839 | |
840 TEST_P(QuicFramerTest, ReceivedPacketOnClosedPath) { | |
841 // Packet 1 from path 0x42. | |
842 // clang-format off | |
843 unsigned char packet[] = { | |
844 // public flags (version) | |
845 0x78, | |
846 // connection_id | |
847 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
848 // path_id | |
849 0x42, | |
850 // packet number | |
851 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
852 // private flags | |
853 0x00, | |
854 }; | |
855 // clang-format on | |
856 | |
857 framer_.OnPathClosed(kPathId); | |
858 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
859 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | |
860 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
861 EXPECT_EQ(0u, QuicFramerPeer::GetLastPacketNumber(&framer_)); | |
862 EXPECT_EQ(kInvalidPathId, QuicFramerPeer::GetLastPathId(&framer_)); | |
863 } | |
864 | |
865 TEST_P(QuicFramerTest, PacketHeaderWith4BytePacketNumber) { | 763 TEST_P(QuicFramerTest, PacketHeaderWith4BytePacketNumber) { |
866 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2); | 764 QuicFramerPeer::SetLargestPacketNumber(&framer_, kPacketNumber - 2); |
867 | 765 |
868 // clang-format off | 766 // clang-format off |
869 unsigned char packet[] = { | 767 unsigned char packet[] = { |
870 // public flags (8 byte connection_id and 4 byte packet number) | 768 // public flags (8 byte connection_id and 4 byte packet number) |
871 0x28, | 769 0x28, |
872 // connection_id | 770 // connection_id |
873 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 771 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
874 // packet number | 772 // packet number |
(...skipping 2922 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3797 'o', ' ', 'w', 'o', | 3695 'o', ' ', 'w', 'o', |
3798 'r', 'l', 'd', '!', | 3696 'r', 'l', 'd', '!', |
3799 }; | 3697 }; |
3800 // clang-format on | 3698 // clang-format on |
3801 | 3699 |
3802 QuicFramerFuzzFunc(packet, arraysize(packet)); | 3700 QuicFramerFuzzFunc(packet, arraysize(packet)); |
3803 } | 3701 } |
3804 | 3702 |
3805 } // namespace test | 3703 } // namespace test |
3806 } // namespace net | 3704 } // namespace net |
OLD | NEW |