arc: Move platform2/arc/network/ to platform2/patchpanel
Next step in the arc-networkd -> patchpanel rename, this patch moves the
location of the code.
BUG=b:151879931
TEST=units,flashed image to atlas
TEST=tasts arc.PlayStore, crostini.LaunchTerminal.download
Change-Id: I1b5cf8d670e1631d46f6449b725395157bf88dde
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform2/+/2115863
Tested-by: Garrick Evans <garrick@chromium.org>
Commit-Queue: Garrick Evans <garrick@chromium.org>
Reviewed-by: Hidehiko Abe <hidehiko@chromium.org>
Reviewed-by: Eric Caruso <ejcaruso@chromium.org>
Reviewed-by: Chirantan Ekbote <chirantan@chromium.org>
Reviewed-by: Hugo Benichi <hugobenichi@google.com>
diff --git a/patchpanel/subnet_test.cc b/patchpanel/subnet_test.cc
new file mode 100644
index 0000000..01e69c5
--- /dev/null
+++ b/patchpanel/subnet_test.cc
@@ -0,0 +1,326 @@
+// Copyright 2018 The Chromium OS 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 "patchpanel/subnet.h"
+
+#include <arpa/inet.h>
+#include <stdint.h>
+
+#include <string>
+#include <utility>
+#include <vector>
+
+#include <base/bind.h>
+#include <base/bind_helpers.h>
+#include <base/strings/string_util.h>
+#include <gtest/gtest.h>
+
+#include "patchpanel/net_util.h"
+
+namespace patchpanel {
+namespace {
+
+constexpr size_t kContainerBaseAddress = Ipv4Addr(100, 115, 92, 192);
+constexpr size_t kVmBaseAddress = Ipv4Addr(100, 115, 92, 24);
+constexpr size_t kPluginBaseAddress = Ipv4Addr(100, 115, 92, 128);
+
+constexpr size_t kContainerSubnetPrefixLength = 28;
+constexpr size_t kVmSubnetPrefixLength = 30;
+constexpr size_t kPluginSubnetPrefixLength = 28;
+
+uint32_t AddOffset(uint32_t base_addr_no, uint32_t offset_ho) {
+ return htonl(ntohl(base_addr_no) + offset_ho);
+}
+
+// kExpectedAvailableCount[i] == AvailableCount() for subnet with prefix_length
+// i.
+constexpr size_t kExpectedAvailableCount[] = {
+ 0xfffffffe, 0x7ffffffe, 0x3ffffffe, 0x1ffffffe, 0xffffffe, 0x7fffffe,
+ 0x3fffffe, 0x1fffffe, 0xfffffe, 0x7ffffe, 0x3ffffe, 0x1ffffe,
+ 0xffffe, 0x7fffe, 0x3fffe, 0x1fffe, 0xfffe, 0x7ffe,
+ 0x3ffe, 0x1ffe, 0xffe, 0x7fe, 0x3fe, 0x1fe,
+ 0xfe, 0x7e, 0x3e, 0x1e, 0xe, 0x6,
+ 0x2, 0x0,
+};
+
+// kExpectedNetmask[i] == Netmask() for subnet with prefix_length i.
+constexpr uint32_t kExpectedNetmask[] = {
+ Ipv4Addr(0, 0, 0, 0), Ipv4Addr(128, 0, 0, 0),
+ Ipv4Addr(192, 0, 0, 0), Ipv4Addr(224, 0, 0, 0),
+ Ipv4Addr(240, 0, 0, 0), Ipv4Addr(248, 0, 0, 0),
+ Ipv4Addr(252, 0, 0, 0), Ipv4Addr(254, 0, 0, 0),
+ Ipv4Addr(255, 0, 0, 0), Ipv4Addr(255, 128, 0, 0),
+ Ipv4Addr(255, 192, 0, 0), Ipv4Addr(255, 224, 0, 0),
+ Ipv4Addr(255, 240, 0, 0), Ipv4Addr(255, 248, 0, 0),
+ Ipv4Addr(255, 252, 0, 0), Ipv4Addr(255, 254, 0, 0),
+ Ipv4Addr(255, 255, 0, 0), Ipv4Addr(255, 255, 128, 0),
+ Ipv4Addr(255, 255, 192, 0), Ipv4Addr(255, 255, 224, 0),
+ Ipv4Addr(255, 255, 240, 0), Ipv4Addr(255, 255, 248, 0),
+ Ipv4Addr(255, 255, 252, 0), Ipv4Addr(255, 255, 254, 0),
+ Ipv4Addr(255, 255, 255, 0), Ipv4Addr(255, 255, 255, 128),
+ Ipv4Addr(255, 255, 255, 192), Ipv4Addr(255, 255, 255, 224),
+ Ipv4Addr(255, 255, 255, 240), Ipv4Addr(255, 255, 255, 248),
+ Ipv4Addr(255, 255, 255, 252), Ipv4Addr(255, 255, 255, 254),
+};
+
+// kExpectedPrefix[i] == Prefix() for subnet with 4 * i offset to
+// |kVmBaseAddress|.
+constexpr uint32_t kExpectedPrefix[] = {
+ Ipv4Addr(100, 115, 92, 24), Ipv4Addr(100, 115, 92, 28),
+ Ipv4Addr(100, 115, 92, 32), Ipv4Addr(100, 115, 92, 36),
+ Ipv4Addr(100, 115, 92, 40), Ipv4Addr(100, 115, 92, 44),
+ Ipv4Addr(100, 115, 92, 48), Ipv4Addr(100, 115, 92, 52),
+ Ipv4Addr(100, 115, 92, 56), Ipv4Addr(100, 115, 92, 60),
+ Ipv4Addr(100, 115, 92, 64), Ipv4Addr(100, 115, 92, 68),
+ Ipv4Addr(100, 115, 92, 72), Ipv4Addr(100, 115, 92, 76),
+ Ipv4Addr(100, 115, 92, 80), Ipv4Addr(100, 115, 92, 84),
+ Ipv4Addr(100, 115, 92, 88), Ipv4Addr(100, 115, 92, 92),
+ Ipv4Addr(100, 115, 92, 96), Ipv4Addr(100, 115, 92, 100),
+ Ipv4Addr(100, 115, 92, 104), Ipv4Addr(100, 115, 92, 108),
+ Ipv4Addr(100, 115, 92, 112), Ipv4Addr(100, 115, 92, 116),
+ Ipv4Addr(100, 115, 92, 120), Ipv4Addr(100, 115, 92, 124),
+ Ipv4Addr(100, 115, 92, 128), Ipv4Addr(100, 115, 92, 132),
+ Ipv4Addr(100, 115, 92, 136), Ipv4Addr(100, 115, 92, 140),
+ Ipv4Addr(100, 115, 92, 144), Ipv4Addr(100, 115, 92, 148),
+};
+
+// kExpectedCidrString[i] == ToCidrString() for subnet with 4 * i offset to
+// |kVmBaseAddress|.
+const char* kExpectedCidrString[] = {
+ "100.115.92.24/30", "100.115.92.28/30", "100.115.92.32/30",
+ "100.115.92.36/30", "100.115.92.40/30", "100.115.92.44/30",
+ "100.115.92.48/30", "100.115.92.52/30", "100.115.92.56/30",
+ "100.115.92.60/30", "100.115.92.64/30", "100.115.92.68/30",
+ "100.115.92.72/30", "100.115.92.76/30", "100.115.92.80/30",
+ "100.115.92.84/30", "100.115.92.88/30", "100.115.92.92/30",
+ "100.115.92.96/30", "100.115.92.100/30", "100.115.92.104/30",
+ "100.115.92.108/30", "100.115.92.112/30", "100.115.92.116/30",
+ "100.115.92.120/30", "100.115.92.124/30", "100.115.92.128/30",
+ "100.115.92.132/30", "100.115.92.136/30", "100.115.92.140/30",
+ "100.115.92.144/30", "100.115.92.148/30",
+};
+
+class VmSubnetTest : public ::testing::TestWithParam<size_t> {};
+class ContainerSubnetTest : public ::testing::TestWithParam<size_t> {};
+class PrefixTest : public ::testing::TestWithParam<size_t> {};
+
+void DoNothing() {}
+
+void SetTrue(bool* value) {
+ *value = true;
+}
+
+} // namespace
+
+TEST_P(VmSubnetTest, Prefix) {
+ size_t index = GetParam();
+ Subnet subnet(AddOffset(kVmBaseAddress, index * 4), kVmSubnetPrefixLength,
+ base::Bind(&DoNothing));
+
+ EXPECT_EQ(kExpectedPrefix[index], subnet.Prefix());
+}
+
+TEST_P(VmSubnetTest, CidrString) {
+ size_t index = GetParam();
+ Subnet subnet(AddOffset(kVmBaseAddress, index * 4), kVmSubnetPrefixLength,
+ base::Bind(&DoNothing));
+
+ EXPECT_EQ(std::string(kExpectedCidrString[index]), subnet.ToCidrString());
+ EXPECT_EQ(kExpectedCidrString[index], subnet.ToCidrString());
+}
+
+TEST_P(VmSubnetTest, AddressAtOffset) {
+ size_t index = GetParam();
+ Subnet subnet(AddOffset(kVmBaseAddress, index * 4), kVmSubnetPrefixLength,
+ base::Bind(&DoNothing));
+
+ for (uint32_t offset = 0; offset < subnet.AvailableCount(); ++offset) {
+ uint32_t address = AddOffset(kVmBaseAddress, index * 4 + offset + 1);
+ EXPECT_EQ(address, subnet.AddressAtOffset(offset));
+ }
+}
+
+INSTANTIATE_TEST_CASE_P(AllValues,
+ VmSubnetTest,
+ ::testing::Range(size_t{0}, size_t{26}));
+
+TEST_P(ContainerSubnetTest, AddressAtOffset) {
+ size_t index = GetParam();
+ Subnet subnet(AddOffset(kContainerBaseAddress, index * 16),
+ kContainerSubnetPrefixLength, base::Bind(&DoNothing));
+
+ for (uint32_t offset = 0; offset < subnet.AvailableCount(); ++offset) {
+ uint32_t address =
+ AddOffset(kContainerBaseAddress, index * 16 + offset + 1);
+ EXPECT_EQ(address, subnet.AddressAtOffset(offset));
+ }
+}
+
+INSTANTIATE_TEST_CASE_P(AllValues,
+ ContainerSubnetTest,
+ ::testing::Range(size_t{1}, size_t{4}));
+
+TEST_P(PrefixTest, AvailableCount) {
+ size_t prefix_length = GetParam();
+
+ Subnet subnet(0, prefix_length, base::Bind(&DoNothing));
+ EXPECT_EQ(kExpectedAvailableCount[prefix_length], subnet.AvailableCount());
+}
+
+TEST_P(PrefixTest, Netmask) {
+ size_t prefix_length = GetParam();
+
+ Subnet subnet(0, prefix_length, base::Bind(&DoNothing));
+ EXPECT_EQ(kExpectedNetmask[prefix_length], subnet.Netmask());
+}
+
+INSTANTIATE_TEST_CASE_P(AllValues,
+ PrefixTest,
+ ::testing::Range(size_t{8}, size_t{32}));
+
+TEST(SubtnetAddress, StringConversion) {
+ Subnet container_subnet(kContainerBaseAddress, kContainerSubnetPrefixLength,
+ base::Bind(&DoNothing));
+ EXPECT_EQ("100.115.92.192/28", container_subnet.ToCidrString());
+ {
+ EXPECT_EQ("100.115.92.193",
+ container_subnet.AllocateAtOffset(0)->ToIPv4String());
+ EXPECT_EQ("100.115.92.194",
+ container_subnet.AllocateAtOffset(1)->ToIPv4String());
+ EXPECT_EQ("100.115.92.205",
+ container_subnet.AllocateAtOffset(12)->ToIPv4String());
+ EXPECT_EQ("100.115.92.206",
+ container_subnet.AllocateAtOffset(13)->ToIPv4String());
+ }
+ {
+ EXPECT_EQ("100.115.92.193/28",
+ container_subnet.AllocateAtOffset(0)->ToCidrString());
+ EXPECT_EQ("100.115.92.194/28",
+ container_subnet.AllocateAtOffset(1)->ToCidrString());
+ EXPECT_EQ("100.115.92.205/28",
+ container_subnet.AllocateAtOffset(12)->ToCidrString());
+ EXPECT_EQ("100.115.92.206/28",
+ container_subnet.AllocateAtOffset(13)->ToCidrString());
+ }
+
+ Subnet vm_subnet(kVmBaseAddress, kVmSubnetPrefixLength,
+ base::Bind(&DoNothing));
+ EXPECT_EQ("100.115.92.24/30", vm_subnet.ToCidrString());
+ {
+ EXPECT_EQ("100.115.92.25", vm_subnet.AllocateAtOffset(0)->ToIPv4String());
+ EXPECT_EQ("100.115.92.26", vm_subnet.AllocateAtOffset(1)->ToIPv4String());
+ }
+ {
+ EXPECT_EQ("100.115.92.25/30",
+ vm_subnet.AllocateAtOffset(0)->ToCidrString());
+ EXPECT_EQ("100.115.92.26/30",
+ vm_subnet.AllocateAtOffset(1)->ToCidrString());
+ }
+
+ Subnet plugin_subnet(kPluginBaseAddress, kPluginSubnetPrefixLength,
+ base::Bind(&DoNothing));
+ EXPECT_EQ("100.115.92.128/28", plugin_subnet.ToCidrString());
+ {
+ EXPECT_EQ("100.115.92.129",
+ plugin_subnet.AllocateAtOffset(0)->ToIPv4String());
+ EXPECT_EQ("100.115.92.130",
+ plugin_subnet.AllocateAtOffset(1)->ToIPv4String());
+ EXPECT_EQ("100.115.92.141",
+ plugin_subnet.AllocateAtOffset(12)->ToIPv4String());
+ EXPECT_EQ("100.115.92.142",
+ plugin_subnet.AllocateAtOffset(13)->ToIPv4String());
+ }
+ {
+ EXPECT_EQ("100.115.92.129/28",
+ plugin_subnet.AllocateAtOffset(0)->ToCidrString());
+ EXPECT_EQ("100.115.92.130/28",
+ plugin_subnet.AllocateAtOffset(1)->ToCidrString());
+ EXPECT_EQ("100.115.92.141/28",
+ plugin_subnet.AllocateAtOffset(12)->ToCidrString());
+ EXPECT_EQ("100.115.92.142/28",
+ plugin_subnet.AllocateAtOffset(13)->ToCidrString());
+ }
+}
+
+// Tests that the Subnet runs the provided cleanup callback when it gets
+// destroyed.
+TEST(Subnet, Cleanup) {
+ bool called = false;
+
+ { Subnet subnet(0, 24, base::Bind(&SetTrue, &called)); }
+
+ EXPECT_TRUE(called);
+}
+
+// Tests that the subnet rejects attempts to allocate addresses outside its
+// range.
+TEST(PluginSubnet, OutOfBounds) {
+ Subnet subnet(kPluginBaseAddress, kPluginSubnetPrefixLength,
+ base::DoNothing());
+
+ EXPECT_FALSE(subnet.Allocate(htonl(ntohl(kPluginBaseAddress) - 1)));
+ EXPECT_FALSE(subnet.Allocate(kPluginBaseAddress));
+ EXPECT_FALSE(subnet.Allocate(AddOffset(
+ kPluginBaseAddress, (1ull << (32 - kPluginSubnetPrefixLength)) - 1)));
+ EXPECT_FALSE(subnet.Allocate(AddOffset(
+ kPluginBaseAddress, (1ull << (32 - kPluginSubnetPrefixLength)))));
+}
+
+// Tests that the subnet rejects attempts to allocate the same address twice.
+TEST(PluginSubnet, DuplicateAddress) {
+ Subnet subnet(kPluginBaseAddress, kPluginSubnetPrefixLength,
+ base::DoNothing());
+
+ auto addr = subnet.Allocate(AddOffset(kPluginBaseAddress, 1));
+ EXPECT_TRUE(addr);
+ EXPECT_FALSE(subnet.Allocate(AddOffset(kPluginBaseAddress, 1)));
+}
+
+// Tests that the subnet allows allocating all addresses in the subnet's range.
+TEST(PluginSubnet, Allocate) {
+ Subnet subnet(kPluginBaseAddress, kPluginSubnetPrefixLength,
+ base::DoNothing());
+
+ std::vector<std::unique_ptr<SubnetAddress>> addrs;
+ addrs.reserve(subnet.AvailableCount());
+
+ for (size_t offset = 0; offset < subnet.AvailableCount(); ++offset) {
+ // Offset by one since the network id is not allocatable.
+ auto addr = subnet.Allocate(AddOffset(kPluginBaseAddress, offset + 1));
+ EXPECT_TRUE(addr);
+ EXPECT_EQ(AddOffset(kPluginBaseAddress, offset + 1), addr->Address());
+ addrs.emplace_back(std::move(addr));
+ }
+}
+// Tests that the subnet allows allocating all addresses in the subnet's range
+// using an offset.
+TEST(PluginSubnet, AllocateAtOffset) {
+ Subnet subnet(kPluginBaseAddress, kPluginSubnetPrefixLength,
+ base::DoNothing());
+
+ std::vector<std::unique_ptr<SubnetAddress>> addrs;
+ addrs.reserve(subnet.AvailableCount());
+
+ for (size_t offset = 0; offset < subnet.AvailableCount(); ++offset) {
+ auto addr = subnet.AllocateAtOffset(offset);
+ EXPECT_TRUE(addr);
+ EXPECT_EQ(AddOffset(kPluginBaseAddress, offset + 1), addr->Address());
+ addrs.emplace_back(std::move(addr));
+ }
+}
+
+// Tests that the subnet frees addresses when they are destroyed.
+TEST(PluginSubnet, Free) {
+ Subnet subnet(kPluginBaseAddress, kPluginSubnetPrefixLength,
+ base::DoNothing());
+
+ {
+ auto addr = subnet.Allocate(AddOffset(kPluginBaseAddress, 1));
+ EXPECT_TRUE(addr);
+ }
+
+ EXPECT_TRUE(subnet.Allocate(AddOffset(kPluginBaseAddress, 1)));
+}
+
+} // namespace patchpanel