| // Copyright (c) 2019 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "quic/qbone/platform/tcp_packet.h" | |
| #include <netinet/ip6.h> | |
| #include <cstdint> | |
| #include "absl/strings/string_view.h" | |
| #include "quic/platform/api/quic_test.h" | |
| #include "common/quiche_text_utils.h" | |
| namespace quic { | |
| namespace { | |
| // clang-format off | |
| constexpr uint8_t kReferenceTCPSYNPacket[] = { | |
| // START IPv6 Header | |
| // IPv6 with zero ToS and flow label | |
| 0x60, 0x00, 0x00, 0x00, | |
| // Payload is 40 bytes | |
| 0x00, 0x28, | |
| // Next header is TCP (6) | |
| 0x06, | |
| // Hop limit is 64 | |
| 0x40, | |
| // Source address of ::1 | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, | |
| // Destination address of ::1 | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, | |
| // END IPv6 Header | |
| // START TCPv6 Header | |
| // Source port | |
| 0xac, 0x1e, | |
| // Destination port | |
| 0x27, 0x0f, | |
| // Sequence number | |
| 0x4b, 0x01, 0xe8, 0x99, | |
| // Acknowledgement Sequence number, | |
| 0x00, 0x00, 0x00, 0x00, | |
| // Offset | |
| 0xa0, | |
| // Flags | |
| 0x02, | |
| // Window | |
| 0xaa, 0xaa, | |
| // Checksum | |
| 0x2e, 0x21, | |
| // Urgent | |
| 0x00, 0x00, | |
| // END TCPv6 Header | |
| // Options | |
| 0x02, 0x04, 0xff, 0xc4, 0x04, 0x02, 0x08, 0x0a, | |
| 0x1b, 0xb8, 0x52, 0xa1, 0x00, 0x00, 0x00, 0x00, | |
| 0x01, 0x03, 0x03, 0x07, | |
| }; | |
| constexpr uint8_t kReferenceTCPRSTPacket[] = { | |
| // START IPv6 Header | |
| // IPv6 with zero ToS and flow label | |
| 0x60, 0x00, 0x00, 0x00, | |
| // Payload is 20 bytes | |
| 0x00, 0x14, | |
| // Next header is TCP (6) | |
| 0x06, | |
| // Hop limit is 64 | |
| 0x40, | |
| // Source address of ::1 | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, | |
| // Destination address of ::1 | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, | |
| // END IPv6 Header | |
| // START TCPv6 Header | |
| // Source port | |
| 0x27, 0x0f, | |
| // Destination port | |
| 0xac, 0x1e, | |
| // Sequence number | |
| 0x00, 0x00, 0x00, 0x00, | |
| // Acknowledgement Sequence number, | |
| 0x4b, 0x01, 0xe8, 0x9a, | |
| // Offset | |
| 0x50, | |
| // Flags | |
| 0x14, | |
| // Window | |
| 0x00, 0x00, | |
| // Checksum | |
| 0xa9, 0x05, | |
| // Urgent | |
| 0x00, 0x00, | |
| // END TCPv6 Header | |
| }; | |
| // clang-format on | |
| } // namespace | |
| TEST(TcpPacketTest, CreatedPacketMatchesReference) { | |
| absl::string_view syn = | |
| absl::string_view(reinterpret_cast<const char*>(kReferenceTCPSYNPacket), | |
| sizeof(kReferenceTCPSYNPacket)); | |
| absl::string_view expected_packet = | |
| absl::string_view(reinterpret_cast<const char*>(kReferenceTCPRSTPacket), | |
| sizeof(kReferenceTCPRSTPacket)); | |
| CreateTcpResetPacket(syn, [&expected_packet](absl::string_view packet) { | |
| QUIC_LOG(INFO) << quiche::QuicheTextUtils::HexDump(packet); | |
| ASSERT_EQ(packet, expected_packet); | |
| }); | |
| } | |
| } // namespace quic |