| // 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 "quiche/quic/qbone/platform/tcp_packet.h" |
| |
| #include <netinet/ip6.h> |
| |
| #include <cstdint> |
| |
| #include "absl/strings/string_view.h" |
| #include "quiche/quic/platform/api/quic_test.h" |
| #include "quiche/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 |