blob: c9ada0c77914f9b7d1b4960acff5d64acf26612b [file] [log] [blame]
// 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