blob: ede700804f62ca5ef71a5bfdf020c31c2aaa3173 [file] [log] [blame]
naoyatezuka02db5c12023-08-23 01:46:111// Copyright 2023 The ChromiumOS Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "patchpanel/clat_service.h"
6
naoyatezukaca02c502023-09-05 06:53:437#include <memory>
naoyatezuka02db5c12023-08-23 01:46:118#include <optional>
9#include <string>
10#include <vector>
11
12#include <gmock/gmock.h>
13#include <gtest/gtest.h>
14#include <net-base/ip_address_utils.h>
15#include <net-base/ipv4_address.h>
16#include <net-base/ipv6_address.h>
naoyatezukaca02c502023-09-05 06:53:4317#include <shill/net/mock_process_manager.h>
18#include <shill/net/process_manager.h>
naoyatezuka02db5c12023-08-23 01:46:1119
naoyatezukaca02c502023-09-05 06:53:4320#include "patchpanel/datapath.h"
21#include "patchpanel/fake_system.h"
naoyatezukac8ebb462023-09-21 10:52:3322#include "patchpanel/iptables.h"
naoyatezukaca02c502023-09-05 06:53:4323#include "patchpanel/mock_datapath.h"
naoyatezuka02db5c12023-08-23 01:46:1124#include "patchpanel/shill_client.h"
naoyatezukaca02c502023-09-05 06:53:4325#include "patchpanel/system.h"
naoyatezuka02db5c12023-08-23 01:46:1126
27using testing::_;
naoyatezukaca02c502023-09-05 06:53:4328using testing::Eq;
naoyatezuka02db5c12023-08-23 01:46:1129using testing::Exactly;
30using testing::Invoke;
naoyatezukaca02c502023-09-05 06:53:4331using testing::IsEmpty;
32using testing::Return;
33using testing::StrEq;
naoyatezuka02db5c12023-08-23 01:46:1134
35namespace patchpanel {
36namespace {
37
38MATCHER_P(ShillDeviceHasInterfaceName, expected_ifname, "") {
39 return arg.ifname == expected_ifname;
40}
41
naoyatezukaca02c502023-09-05 06:53:4342MATCHER_P(CIDRHasPrefix, expected_prefix_str, "") {
43 return net_base::IPv6CIDR::CreateFromCIDRString(expected_prefix_str)
44 ->InSameSubnetWith(arg.address());
45}
46
47MATCHER_P(AddressHasPrefix, expected_prefix_str, "") {
48 return net_base::IPv6CIDR::CreateFromCIDRString(expected_prefix_str)
49 ->InSameSubnetWith(arg);
50}
51
naoyatezuka02db5c12023-08-23 01:46:1152class ClatServiceUnderTest : public ClatService {
53 public:
naoyatezukaca02c502023-09-05 06:53:4354 ClatServiceUnderTest(Datapath* datapath,
55 shill::ProcessManager* process_manager,
56 System* system)
57 : ClatService(datapath, process_manager, system) {
naoyatezuka02db5c12023-08-23 01:46:1158 ON_CALL(*this, StartClat(_))
59 .WillByDefault(
60 (Invoke(this, &ClatServiceUnderTest::SetClatRunningDeviceForTest)));
naoyatezuka6e778df2023-09-01 00:44:0061 ON_CALL(*this, StopClat(true))
naoyatezuka02db5c12023-08-23 01:46:1162 .WillByDefault(
63 Invoke(this, &ClatServiceUnderTest::ResetClatRunningDeviceForTest));
naoyatezuka6e778df2023-09-01 00:44:0064 Enable();
naoyatezuka02db5c12023-08-23 01:46:1165 }
66
67 MOCK_METHOD(void,
68 StartClat,
69 (const ShillClient::Device& shill_device),
70 (override));
71
naoyatezuka6e778df2023-09-01 00:44:0072 MOCK_METHOD(void, StopClat, (bool clear_running_device), (override));
naoyatezuka02db5c12023-08-23 01:46:1173};
74
75constexpr char kIPv4CIDR[] = "10.10.0.2/16";
76constexpr char kIPv6CIDR[] = "2001:db8::1/64";
77
78ShillClient::Device MakeFakeShillDevice(const std::string& ifname,
79 int ifindex) {
80 ShillClient::Device dev;
81 dev.type = ShillClient::Device::Type::kEthernet;
82 dev.ifindex = ifindex;
83 dev.ifname = ifname;
84
85 return dev;
86}
87
88ShillClient::Device MakeFakeIPv4OnlyShillDevice(
89 const std::string& ifname,
90 int ifindex = 1,
91 const char ipv4_cidr[] = kIPv4CIDR) {
92 ShillClient::Device dev = MakeFakeShillDevice(ifname, ifindex);
93 dev.ipconfig.ipv4_cidr = net_base::IPv4CIDR::CreateFromCIDRString(ipv4_cidr);
94
95 return dev;
96}
97
98ShillClient::Device MakeFakeIPv6OnlyShillDevice(
99 const std::string& ifname,
100 int ifindex = 1,
101 const char ipv6_cidr[] = kIPv6CIDR) {
102 ShillClient::Device dev = MakeFakeShillDevice(ifname, ifindex);
103 dev.ipconfig.ipv6_cidr = net_base::IPv6CIDR::CreateFromCIDRString(ipv6_cidr);
104
105 return dev;
106}
107
108ShillClient::Device MakeFakeDualStackShillDevice(
109 const std::string& ifname,
110 int ifindex = 1,
111 const char ipv4_cidr[] = kIPv4CIDR,
112 const char ipv6_cidr[] = kIPv6CIDR) {
113 ShillClient::Device dev = MakeFakeShillDevice(ifname, ifindex);
114 dev.ipconfig.ipv4_cidr = net_base::IPv4CIDR::CreateFromCIDRString(ipv4_cidr);
115 dev.ipconfig.ipv6_cidr = net_base::IPv6CIDR::CreateFromCIDRString(ipv6_cidr);
116
117 return dev;
naoyatezuka02db5c12023-08-23 01:46:11118} // namespace
119
naoyatezukaca02c502023-09-05 06:53:43120class ClatServiceTest : public ::testing::Test {
121 protected:
122 void SetUp() override {
123 target_ = std::make_unique<ClatServiceUnderTest>(
124 &datapath_, &process_manager_, &system_);
125 }
126 MockDatapath datapath_ = MockDatapath();
127 shill::MockProcessManager process_manager_ = shill::MockProcessManager();
128 FakeSystem system_ = FakeSystem();
129 std::unique_ptr<ClatServiceUnderTest> target_;
130};
131
naoyatezuka02db5c12023-08-23 01:46:11132// TODO(b/278970851): Merge tests for OnShillDefaultLogicalDeviceChanged into a
133// single test with a testcase data array.
naoyatezukaca02c502023-09-05 06:53:43134TEST_F(ClatServiceTest, ChangeFromIPv4DeviceToIPv6OnlyDevice) {
naoyatezuka02db5c12023-08-23 01:46:11135 const auto v4only_dev = MakeFakeIPv4OnlyShillDevice("v4only", 1);
136 const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2);
137
naoyatezukaca02c502023-09-05 06:53:43138 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("v6only")));
139 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, &v4only_dev);
naoyatezuka02db5c12023-08-23 01:46:11140}
141
naoyatezukaca02c502023-09-05 06:53:43142TEST_F(ClatServiceTest, ChangeFromIPv6OnlyDeviceToIPv4Device) {
naoyatezuka02db5c12023-08-23 01:46:11143 const auto v4only_dev = MakeFakeIPv4OnlyShillDevice("v4only", 1);
144 const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2);
145
naoyatezukaca02c502023-09-05 06:53:43146 // Start CLAT on the new_device.
147 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11148
naoyatezukaca02c502023-09-05 06:53:43149 EXPECT_CALL(*target_, StopClat(true));
150 target_->OnShillDefaultLogicalDeviceChanged(&v4only_dev, &v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11151}
152
naoyatezukaca02c502023-09-05 06:53:43153TEST_F(ClatServiceTest, ChangeFromIPv6OnlyDeviceToAnother) {
naoyatezuka02db5c12023-08-23 01:46:11154 const auto new_v6only_dev =
155 MakeFakeIPv6OnlyShillDevice("new_v6only", 1, "1020:db8::1/64");
156 const auto prev_v6only_dev =
157 MakeFakeIPv6OnlyShillDevice("prev_v6only", 1, "2001:db8::2/64");
158
naoyatezukaca02c502023-09-05 06:53:43159 // Start CLAT on the new_device.
160 target_->OnShillDefaultLogicalDeviceChanged(&prev_v6only_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11161
naoyatezukaca02c502023-09-05 06:53:43162 EXPECT_CALL(*target_, StopClat(true));
163 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("new_v6only")));
naoyatezuka02db5c12023-08-23 01:46:11164
naoyatezukaca02c502023-09-05 06:53:43165 target_->OnShillDefaultLogicalDeviceChanged(&new_v6only_dev,
166 &prev_v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11167}
168
naoyatezukaca02c502023-09-05 06:53:43169TEST_F(ClatServiceTest, ChangeFromDualStackDeviceToIPv4OnlyDevice) {
naoyatezuka02db5c12023-08-23 01:46:11170 const auto dual_dev = MakeFakeDualStackShillDevice("dual_dev", 1);
171 const auto v4only_dev = MakeFakeIPv4OnlyShillDevice("v4only", 2);
172
naoyatezukaca02c502023-09-05 06:53:43173 target_->OnShillDefaultLogicalDeviceChanged(&dual_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11174
naoyatezukaca02c502023-09-05 06:53:43175 EXPECT_CALL(*target_, StopClat(_)).Times(Exactly(0));
176 EXPECT_CALL(*target_, StartClat(_)).Times(Exactly(0));
177 target_->OnShillDefaultLogicalDeviceChanged(&v4only_dev, &dual_dev);
naoyatezuka02db5c12023-08-23 01:46:11178}
179
naoyatezukaca02c502023-09-05 06:53:43180TEST_F(ClatServiceTest, ChangeFromIPv4OnlyDeviceToDualStackDevice) {
naoyatezuka02db5c12023-08-23 01:46:11181 const auto dual_dev = MakeFakeDualStackShillDevice("dual_dev", 1);
182 const auto v4only_dev = MakeFakeIPv4OnlyShillDevice("v4only", 2);
183
naoyatezukaca02c502023-09-05 06:53:43184 target_->OnShillDefaultLogicalDeviceChanged(&v4only_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11185
naoyatezukaca02c502023-09-05 06:53:43186 EXPECT_CALL(*target_, StopClat(_)).Times(Exactly(0));
187 EXPECT_CALL(*target_, StartClat(_)).Times(Exactly(0));
188 target_->OnShillDefaultLogicalDeviceChanged(&dual_dev, &v4only_dev);
naoyatezuka02db5c12023-08-23 01:46:11189}
190
naoyatezukaca02c502023-09-05 06:53:43191TEST_F(ClatServiceTest, ChangeFromDualStackDeviceToIPv6OnlyDevice) {
naoyatezuka02db5c12023-08-23 01:46:11192 const auto dual_dev = MakeFakeDualStackShillDevice("dual_dev", 1);
193 const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2);
194
naoyatezukaca02c502023-09-05 06:53:43195 target_->OnShillDefaultLogicalDeviceChanged(&dual_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11196
naoyatezukaca02c502023-09-05 06:53:43197 EXPECT_CALL(*target_, StopClat(_)).Times(Exactly(0));
198 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("v6only")));
199 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, &dual_dev);
naoyatezuka02db5c12023-08-23 01:46:11200}
201
naoyatezukaca02c502023-09-05 06:53:43202TEST_F(ClatServiceTest, ChangeFromIPv6OnlyDeviceToDualStackDevice) {
naoyatezuka02db5c12023-08-23 01:46:11203 const auto dual_dev = MakeFakeDualStackShillDevice("dual_dev", 1);
204 const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2);
205
naoyatezukaca02c502023-09-05 06:53:43206 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11207
naoyatezukaca02c502023-09-05 06:53:43208 EXPECT_CALL(*target_, StopClat(true));
209 EXPECT_CALL(*target_, StartClat(_)).Times(Exactly(0));
210 target_->OnShillDefaultLogicalDeviceChanged(&dual_dev, &v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11211}
212
naoyatezukaca02c502023-09-05 06:53:43213TEST_F(ClatServiceTest, ChangeFromDualStackDeviceToAnother) {
naoyatezuka02db5c12023-08-23 01:46:11214 const auto new_v6only_dev = MakeFakeDualStackShillDevice(
215 "new_dual_dev", 1, "10.10.0.2/24", "1020:db8::1/64");
216
217 const auto prev_v6only_dev = MakeFakeDualStackShillDevice(
218 "prev_dual_dev", 2, "10.20.0.2/24", "2001:db8::1/64");
219
naoyatezukaca02c502023-09-05 06:53:43220 target_->OnShillDefaultLogicalDeviceChanged(&prev_v6only_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11221
naoyatezukaca02c502023-09-05 06:53:43222 EXPECT_CALL(*target_, StopClat(_)).Times(Exactly(0));
223 EXPECT_CALL(*target_, StartClat(_)).Times(Exactly(0));
224 target_->OnShillDefaultLogicalDeviceChanged(&new_v6only_dev,
225 &prev_v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11226}
227
naoyatezukaca02c502023-09-05 06:53:43228TEST_F(ClatServiceTest, ChangeFromNonExstingDeviceToExistingDevice) {
naoyatezuka02db5c12023-08-23 01:46:11229 const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only");
230
naoyatezukaca02c502023-09-05 06:53:43231 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("v6only")));
232 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11233}
234
naoyatezukaca02c502023-09-05 06:53:43235TEST_F(ClatServiceTest, ChangeFromExstingDeviceToNonExistingDevice) {
naoyatezuka02db5c12023-08-23 01:46:11236 const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only");
237
naoyatezukaca02c502023-09-05 06:53:43238 // Start CLAT on the new_device.
239 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11240
naoyatezukaca02c502023-09-05 06:53:43241 EXPECT_CALL(*target_, StopClat(true));
242 EXPECT_CALL(*target_, StartClat(_)).Times(Exactly(0));
243 target_->OnShillDefaultLogicalDeviceChanged(nullptr, &v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11244}
245
naoyatezukaca02c502023-09-05 06:53:43246TEST_F(ClatServiceTest,
247 DefaultDeviceChangeWhileClatIsRunningOnDifferentDevice) {
naoyatezuka02db5c12023-08-23 01:46:11248 const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 1);
249 const auto prev_v6only_dev =
250 MakeFakeIPv6OnlyShillDevice("new_v6only", 2, "1020:db8::1/64");
251 const auto new_v6only_dev =
252 MakeFakeIPv6OnlyShillDevice("prev_v6only", 3, "1030:db8::1/64");
253
naoyatezukaca02c502023-09-05 06:53:43254 // Start CLAT on device "v6only_dev1".
255 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11256
257 // Unexpectedly the default logical device changes from an device different
258 // from v6only_dev1 to another.
naoyatezukaca02c502023-09-05 06:53:43259 EXPECT_CALL(*target_, StopClat(true));
260 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("new_v6only")));
261 target_->OnShillDefaultLogicalDeviceChanged(&prev_v6only_dev,
262 &prev_v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11263}
264
naoyatezukaca02c502023-09-05 06:53:43265TEST_F(ClatServiceTest, NewDefaultDeviceIsTheSameWithClatDevice) {
naoyatezuka02db5c12023-08-23 01:46:11266 const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 1);
267 const auto dual_dev = MakeFakeDualStackShillDevice("dual", 2);
268
naoyatezukaca02c502023-09-05 06:53:43269 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11270
naoyatezukaca02c502023-09-05 06:53:43271 EXPECT_CALL(*target_, StopClat(_)).Times(Exactly(0));
272 EXPECT_CALL(*target_, StartClat(_)).Times(Exactly(0));
273 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, &dual_dev);
naoyatezuka02db5c12023-08-23 01:46:11274}
275
naoyatezukaca02c502023-09-05 06:53:43276TEST_F(ClatServiceTest,
277 ChangeFromDualStackDeviceToIPv6OnlyDeviceWhileDisabled) {
naoyatezuka6e778df2023-09-01 00:44:00278 const auto dual_dev = MakeFakeDualStackShillDevice("dual", 1);
279 const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2);
280
naoyatezukaca02c502023-09-05 06:53:43281 target_->OnShillDefaultLogicalDeviceChanged(&dual_dev, nullptr);
naoyatezuka6e778df2023-09-01 00:44:00282
naoyatezukaca02c502023-09-05 06:53:43283 EXPECT_CALL(*target_, StopClat(false));
284 target_->Disable();
naoyatezuka6e778df2023-09-01 00:44:00285
naoyatezukaca02c502023-09-05 06:53:43286 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("v6only")));
287 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, &dual_dev);
naoyatezuka6e778df2023-09-01 00:44:00288
289 // The default logical device is IPv6-only, so CLAT starts immdiately after
290 // it's enabled.
naoyatezukaca02c502023-09-05 06:53:43291 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("v6only")));
292 target_->Enable();
naoyatezuka6e778df2023-09-01 00:44:00293}
294
naoyatezukaca02c502023-09-05 06:53:43295TEST_F(ClatServiceTest, IPv6OnlyDeviceGetIPv4Address) {
naoyatezuka02db5c12023-08-23 01:46:11296 auto default_logical_device = MakeFakeIPv6OnlyShillDevice("v6only");
297
naoyatezukaca02c502023-09-05 06:53:43298 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("v6only")));
299 target_->OnDefaultLogicalDeviceIPConfigChanged(default_logical_device);
naoyatezuka02db5c12023-08-23 01:46:11300
301 // The default logical device gets IPv4 address because of IPConfig changes.
302 default_logical_device.ipconfig.ipv4_cidr =
303 net_base::IPv4CIDR::CreateFromCIDRString(kIPv4CIDR);
304
naoyatezukaca02c502023-09-05 06:53:43305 EXPECT_CALL(*target_, StopClat(true));
306 target_->OnDefaultLogicalDeviceIPConfigChanged(default_logical_device);
naoyatezuka02db5c12023-08-23 01:46:11307}
308
naoyatezukaca02c502023-09-05 06:53:43309TEST_F(ClatServiceTest, DeviceLoseIPv4Address) {
naoyatezuka02db5c12023-08-23 01:46:11310 auto default_logical_device = MakeFakeDualStackShillDevice("dual_stack", 1);
311
naoyatezuka02db5c12023-08-23 01:46:11312 // The default logical device loses IPv4 address because of IPConfig changes.
313 default_logical_device.ipconfig.ipv4_cidr.reset();
314
naoyatezukaca02c502023-09-05 06:53:43315 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("dual_stack")));
316 target_->OnDefaultLogicalDeviceIPConfigChanged(default_logical_device);
naoyatezuka02db5c12023-08-23 01:46:11317}
318
naoyatezukaca02c502023-09-05 06:53:43319TEST_F(ClatServiceTest, IPConfigChangeWithoutIPv6AddressChange) {
naoyatezuka02db5c12023-08-23 01:46:11320 auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only");
321 v6only_dev.ipconfig.ipv4_dns_addresses = std::vector<std::string>{"8.8.8.8"};
322
naoyatezukaca02c502023-09-05 06:53:43323 target_->OnDefaultLogicalDeviceIPConfigChanged(v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11324
325 v6only_dev.ipconfig.ipv4_dns_addresses = std::vector<std::string>{"1.1.1.1"};
326
327 // This change has nothing with CLAT.
naoyatezukaca02c502023-09-05 06:53:43328 EXPECT_CALL(*target_, StopClat(_)).Times(Exactly(0));
329 EXPECT_CALL(*target_, StartClat(_)).Times(Exactly(0));
330 target_->OnDefaultLogicalDeviceIPConfigChanged(v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11331}
332
naoyatezukaca02c502023-09-05 06:53:43333TEST_F(ClatServiceTest, IPv6AddressChangeInTheSamePrefix) {
naoyatezuka02db5c12023-08-23 01:46:11334 auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 1, "2001:db8::1/64");
335
naoyatezukaca02c502023-09-05 06:53:43336 target_->OnDefaultLogicalDeviceIPConfigChanged(v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11337
338 v6only_dev.ipconfig.ipv6_cidr =
339 net_base::IPv6CIDR::CreateFromCIDRString("2001:db8::2/64");
340
341 // Even the new IPn6 address of the default logical device has the same prefix
342 // as the old one, CLAT needs to be reconfigured because the new address
343 // conflict with the IPv6 address used by CLAT.
naoyatezukaca02c502023-09-05 06:53:43344 EXPECT_CALL(*target_, StopClat(true));
345 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("v6only")));
346 target_->OnDefaultLogicalDeviceIPConfigChanged(v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11347}
348
naoyatezukaca02c502023-09-05 06:53:43349TEST_F(ClatServiceTest, EnabledAfterGettingIPv4AddressWhileDisabled) {
naoyatezuka6e778df2023-09-01 00:44:00350 auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only");
351
naoyatezukaca02c502023-09-05 06:53:43352 target_->OnDefaultLogicalDeviceIPConfigChanged(v6only_dev);
naoyatezuka6e778df2023-09-01 00:44:00353
naoyatezukaca02c502023-09-05 06:53:43354 EXPECT_CALL(*target_, StopClat(false));
355 target_->Disable();
naoyatezuka6e778df2023-09-01 00:44:00356
357 v6only_dev.ipconfig.ipv4_cidr =
358 net_base::IPv4CIDR::CreateFromCIDRString(kIPv4CIDR);
359
naoyatezukaca02c502023-09-05 06:53:43360 EXPECT_CALL(*target_, StopClat(true));
361 target_->OnDefaultLogicalDeviceIPConfigChanged(v6only_dev);
naoyatezuka6e778df2023-09-01 00:44:00362
naoyatezukaca02c502023-09-05 06:53:43363 EXPECT_CALL(*target_, StartClat(_)).Times(Exactly(0));
364 target_->Enable();
naoyatezuka6e778df2023-09-01 00:44:00365}
366
naoyatezukaca02c502023-09-05 06:53:43367TEST_F(ClatServiceTest, EnabledAfterBecomingIPv6OnlyWhileDisabled) {
naoyatezuka6e778df2023-09-01 00:44:00368 auto dual_dev = MakeFakeDualStackShillDevice("dual");
369
naoyatezukaca02c502023-09-05 06:53:43370 target_->OnDefaultLogicalDeviceIPConfigChanged(dual_dev);
naoyatezuka6e778df2023-09-01 00:44:00371
naoyatezukaca02c502023-09-05 06:53:43372 EXPECT_CALL(*target_, StopClat(false));
373 target_->Disable();
naoyatezuka6e778df2023-09-01 00:44:00374
375 dual_dev.ipconfig.ipv4_cidr.reset();
376
naoyatezukaca02c502023-09-05 06:53:43377 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("dual")));
378 target_->OnDefaultLogicalDeviceIPConfigChanged(dual_dev);
naoyatezuka6e778df2023-09-01 00:44:00379
380 // The default logical device is IPv6-only, so CLAT starts immdiately after
381 // it's enabled.
naoyatezukaca02c502023-09-05 06:53:43382 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("dual")));
383 target_->Enable();
naoyatezuka6e778df2023-09-01 00:44:00384}
385
naoyatezukaca02c502023-09-05 06:53:43386TEST_F(ClatServiceTest, VerifyStartAndStopClat) {
387 ClatService target(&datapath_, &process_manager_, &system_);
388 target.Enable();
389
390 auto v4only_dev = MakeFakeIPv4OnlyShillDevice("v4only", 1);
391 auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2);
392
393 target.OnShillDefaultLogicalDeviceChanged(&v4only_dev, nullptr);
394
395 EXPECT_CALL(system_, WriteConfigFile(_, _)).WillOnce(Return(true));
396 EXPECT_CALL(
397 datapath_,
398 AddTunTap(StrEq("tun_nat64"), Eq(std::nullopt),
399 net_base::IPv4CIDR::CreateFromCIDRString("192.0.0.1/29"),
400 IsEmpty(), DeviceMode::kTun))
401 .WillOnce(Return("tun_nat64"));
naoyatezukac8ebb462023-09-21 10:52:33402 EXPECT_CALL(datapath_,
403 ModifyClatAcceptRules(Iptables::Command::kA, StrEq("tun_nat64")))
404 .WillOnce(Return(true));
naoyatezukaca02c502023-09-05 06:53:43405 EXPECT_CALL(datapath_, AddIPv6HostRoute(StrEq("tun_nat64"),
406 CIDRHasPrefix("2001:db8::/64"),
407 Eq(std::nullopt)))
408 .WillOnce(Return(true));
409 EXPECT_CALL(
410 datapath_,
411 AddIPv6NeighborProxy(StrEq("v6only"), AddressHasPrefix("2001:db8::/64")))
412 .WillOnce(Return(true));
413 EXPECT_CALL(datapath_, AddIPv4RouteToTable(StrEq("tun_nat64"),
414 net_base::IPv4CIDR(), 249))
415 .WillOnce(Return(true));
416 // StartClat() is called.
417 target.OnShillDefaultLogicalDeviceChanged(&v6only_dev, &v4only_dev);
418
419 EXPECT_CALL(datapath_, DeleteIPv4RouteFromTable(StrEq("tun_nat64"),
420 net_base::IPv4CIDR(), 249));
421 EXPECT_CALL(datapath_,
422 RemoveIPv6NeighborProxy(StrEq("v6only"),
423 AddressHasPrefix("2001:db8::/64")));
naoyatezukac8ebb462023-09-21 10:52:33424 EXPECT_CALL(datapath_,
425 ModifyClatAcceptRules(Iptables::Command::kD, StrEq("tun_nat64")));
naoyatezukaca02c502023-09-05 06:53:43426 EXPECT_CALL(datapath_, RemoveIPv6HostRoute(CIDRHasPrefix("2001:db8::/64")));
427 EXPECT_CALL(datapath_, RemoveTunTap(StrEq("tun_nat64"), DeviceMode::kTun));
428 // StopClat() is called.
429 target.OnShillDefaultLogicalDeviceChanged(&v4only_dev, &v6only_dev);
430}
431
432} // namespace
naoyatezuka02db5c12023-08-23 01:46:11433} // namespace patchpanel