blob: 0254cbbaec695f77e1bc16bfb4f169a82506363e [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
Jie Jiange970cc22024-06-12 07:03:1012#include <chromeos/net-base/ip_address_utils.h>
13#include <chromeos/net-base/ipv4_address.h>
14#include <chromeos/net-base/ipv6_address.h>
15#include <chromeos/net-base/mock_process_manager.h>
16#include <chromeos/net-base/process_manager.h>
17#include <chromeos/net-base/technology.h>
naoyatezuka02db5c12023-08-23 01:46:1118#include <gmock/gmock.h>
19#include <gtest/gtest.h>
naoyatezuka02db5c12023-08-23 01:46:1120
naoyatezukaca02c502023-09-05 06:53:4321#include "patchpanel/datapath.h"
22#include "patchpanel/fake_system.h"
naoyatezukac8ebb462023-09-21 10:52:3323#include "patchpanel/iptables.h"
naoyatezukaca02c502023-09-05 06:53:4324#include "patchpanel/mock_datapath.h"
naoyatezuka02db5c12023-08-23 01:46:1125#include "patchpanel/shill_client.h"
naoyatezukaca02c502023-09-05 06:53:4326#include "patchpanel/system.h"
naoyatezuka02db5c12023-08-23 01:46:1127
28using testing::_;
naoyatezukaca02c502023-09-05 06:53:4329using testing::Eq;
naoyatezuka02db5c12023-08-23 01:46:1130using testing::Exactly;
31using testing::Invoke;
naoyatezukaca02c502023-09-05 06:53:4332using testing::IsEmpty;
33using testing::Return;
34using testing::StrEq;
naoyatezuka02db5c12023-08-23 01:46:1135
36namespace patchpanel {
37namespace {
38
39MATCHER_P(ShillDeviceHasInterfaceName, expected_ifname, "") {
40 return arg.ifname == expected_ifname;
41}
42
naoyatezukaca02c502023-09-05 06:53:4343MATCHER_P(CIDRHasPrefix, expected_prefix_str, "") {
44 return net_base::IPv6CIDR::CreateFromCIDRString(expected_prefix_str)
45 ->InSameSubnetWith(arg.address());
46}
47
48MATCHER_P(AddressHasPrefix, expected_prefix_str, "") {
49 return net_base::IPv6CIDR::CreateFromCIDRString(expected_prefix_str)
50 ->InSameSubnetWith(arg);
51}
52
naoyatezuka02db5c12023-08-23 01:46:1153class ClatServiceUnderTest : public ClatService {
54 public:
naoyatezukaca02c502023-09-05 06:53:4355 ClatServiceUnderTest(Datapath* datapath,
Chih-Yu Huangf4449c22023-12-13 06:31:1656 net_base::ProcessManager* process_manager,
naoyatezukaca02c502023-09-05 06:53:4357 System* system)
58 : ClatService(datapath, process_manager, system) {
naoyatezuka02db5c12023-08-23 01:46:1159 ON_CALL(*this, StartClat(_))
60 .WillByDefault(
61 (Invoke(this, &ClatServiceUnderTest::SetClatRunningDeviceForTest)));
naoyatezuka6e778df2023-09-01 00:44:0062 ON_CALL(*this, StopClat(true))
naoyatezuka02db5c12023-08-23 01:46:1163 .WillByDefault(
64 Invoke(this, &ClatServiceUnderTest::ResetClatRunningDeviceForTest));
naoyatezuka6e778df2023-09-01 00:44:0065 Enable();
naoyatezuka02db5c12023-08-23 01:46:1166 }
67
68 MOCK_METHOD(void,
69 StartClat,
70 (const ShillClient::Device& shill_device),
71 (override));
72
naoyatezuka6e778df2023-09-01 00:44:0073 MOCK_METHOD(void, StopClat, (bool clear_running_device), (override));
naoyatezuka02db5c12023-08-23 01:46:1174};
75
76constexpr char kIPv4CIDR[] = "10.10.0.2/16";
77constexpr char kIPv6CIDR[] = "2001:db8::1/64";
78
79ShillClient::Device MakeFakeShillDevice(const std::string& ifname,
80 int ifindex) {
81 ShillClient::Device dev;
Chih-Yu Huang8194a032024-04-22 06:35:5582 dev.technology = net_base::Technology::kEthernet;
naoyatezuka02db5c12023-08-23 01:46:1183 dev.ifindex = ifindex;
84 dev.ifname = ifname;
85
86 return dev;
87}
88
89ShillClient::Device MakeFakeIPv4OnlyShillDevice(
90 const std::string& ifname,
91 int ifindex = 1,
92 const char ipv4_cidr[] = kIPv4CIDR) {
93 ShillClient::Device dev = MakeFakeShillDevice(ifname, ifindex);
94 dev.ipconfig.ipv4_cidr = net_base::IPv4CIDR::CreateFromCIDRString(ipv4_cidr);
95
96 return dev;
97}
98
99ShillClient::Device MakeFakeIPv6OnlyShillDevice(
100 const std::string& ifname,
101 int ifindex = 1,
102 const char ipv6_cidr[] = kIPv6CIDR) {
103 ShillClient::Device dev = MakeFakeShillDevice(ifname, ifindex);
104 dev.ipconfig.ipv6_cidr = net_base::IPv6CIDR::CreateFromCIDRString(ipv6_cidr);
105
106 return dev;
107}
108
109ShillClient::Device MakeFakeDualStackShillDevice(
110 const std::string& ifname,
111 int ifindex = 1,
112 const char ipv4_cidr[] = kIPv4CIDR,
113 const char ipv6_cidr[] = kIPv6CIDR) {
114 ShillClient::Device dev = MakeFakeShillDevice(ifname, ifindex);
115 dev.ipconfig.ipv4_cidr = net_base::IPv4CIDR::CreateFromCIDRString(ipv4_cidr);
116 dev.ipconfig.ipv6_cidr = net_base::IPv6CIDR::CreateFromCIDRString(ipv6_cidr);
117
118 return dev;
naoyatezuka02db5c12023-08-23 01:46:11119} // namespace
120
naoyatezukaca02c502023-09-05 06:53:43121class ClatServiceTest : public ::testing::Test {
122 protected:
123 void SetUp() override {
124 target_ = std::make_unique<ClatServiceUnderTest>(
125 &datapath_, &process_manager_, &system_);
126 }
127 MockDatapath datapath_ = MockDatapath();
Chih-Yu Huangf4449c22023-12-13 06:31:16128 net_base::MockProcessManager process_manager_ =
129 net_base::MockProcessManager();
naoyatezukaca02c502023-09-05 06:53:43130 FakeSystem system_ = FakeSystem();
131 std::unique_ptr<ClatServiceUnderTest> target_;
132};
133
naoyatezuka02db5c12023-08-23 01:46:11134// TODO(b/278970851): Merge tests for OnShillDefaultLogicalDeviceChanged into a
135// single test with a testcase data array.
naoyatezukaca02c502023-09-05 06:53:43136TEST_F(ClatServiceTest, ChangeFromIPv4DeviceToIPv6OnlyDevice) {
naoyatezuka02db5c12023-08-23 01:46:11137 const auto v4only_dev = MakeFakeIPv4OnlyShillDevice("v4only", 1);
138 const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2);
139
naoyatezukaca02c502023-09-05 06:53:43140 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("v6only")));
141 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, &v4only_dev);
naoyatezuka02db5c12023-08-23 01:46:11142}
143
naoyatezukaca02c502023-09-05 06:53:43144TEST_F(ClatServiceTest, ChangeFromIPv6OnlyDeviceToIPv4Device) {
naoyatezuka02db5c12023-08-23 01:46:11145 const auto v4only_dev = MakeFakeIPv4OnlyShillDevice("v4only", 1);
146 const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2);
147
naoyatezukaca02c502023-09-05 06:53:43148 // Start CLAT on the new_device.
149 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11150
naoyatezukaca02c502023-09-05 06:53:43151 EXPECT_CALL(*target_, StopClat(true));
152 target_->OnShillDefaultLogicalDeviceChanged(&v4only_dev, &v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11153}
154
naoyatezukaca02c502023-09-05 06:53:43155TEST_F(ClatServiceTest, ChangeFromIPv6OnlyDeviceToAnother) {
naoyatezuka02db5c12023-08-23 01:46:11156 const auto new_v6only_dev =
157 MakeFakeIPv6OnlyShillDevice("new_v6only", 1, "1020:db8::1/64");
158 const auto prev_v6only_dev =
159 MakeFakeIPv6OnlyShillDevice("prev_v6only", 1, "2001:db8::2/64");
160
naoyatezukaca02c502023-09-05 06:53:43161 // Start CLAT on the new_device.
162 target_->OnShillDefaultLogicalDeviceChanged(&prev_v6only_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11163
naoyatezukaca02c502023-09-05 06:53:43164 EXPECT_CALL(*target_, StopClat(true));
165 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("new_v6only")));
naoyatezuka02db5c12023-08-23 01:46:11166
naoyatezukaca02c502023-09-05 06:53:43167 target_->OnShillDefaultLogicalDeviceChanged(&new_v6only_dev,
168 &prev_v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11169}
170
naoyatezukaca02c502023-09-05 06:53:43171TEST_F(ClatServiceTest, ChangeFromDualStackDeviceToIPv4OnlyDevice) {
naoyatezuka02db5c12023-08-23 01:46:11172 const auto dual_dev = MakeFakeDualStackShillDevice("dual_dev", 1);
173 const auto v4only_dev = MakeFakeIPv4OnlyShillDevice("v4only", 2);
174
naoyatezukaca02c502023-09-05 06:53:43175 target_->OnShillDefaultLogicalDeviceChanged(&dual_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11176
naoyatezukaca02c502023-09-05 06:53:43177 EXPECT_CALL(*target_, StopClat(_)).Times(Exactly(0));
178 EXPECT_CALL(*target_, StartClat(_)).Times(Exactly(0));
179 target_->OnShillDefaultLogicalDeviceChanged(&v4only_dev, &dual_dev);
naoyatezuka02db5c12023-08-23 01:46:11180}
181
naoyatezukaca02c502023-09-05 06:53:43182TEST_F(ClatServiceTest, ChangeFromIPv4OnlyDeviceToDualStackDevice) {
naoyatezuka02db5c12023-08-23 01:46:11183 const auto dual_dev = MakeFakeDualStackShillDevice("dual_dev", 1);
184 const auto v4only_dev = MakeFakeIPv4OnlyShillDevice("v4only", 2);
185
naoyatezukaca02c502023-09-05 06:53:43186 target_->OnShillDefaultLogicalDeviceChanged(&v4only_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11187
naoyatezukaca02c502023-09-05 06:53:43188 EXPECT_CALL(*target_, StopClat(_)).Times(Exactly(0));
189 EXPECT_CALL(*target_, StartClat(_)).Times(Exactly(0));
190 target_->OnShillDefaultLogicalDeviceChanged(&dual_dev, &v4only_dev);
naoyatezuka02db5c12023-08-23 01:46:11191}
192
naoyatezukaca02c502023-09-05 06:53:43193TEST_F(ClatServiceTest, ChangeFromDualStackDeviceToIPv6OnlyDevice) {
naoyatezuka02db5c12023-08-23 01:46:11194 const auto dual_dev = MakeFakeDualStackShillDevice("dual_dev", 1);
195 const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2);
196
naoyatezukaca02c502023-09-05 06:53:43197 target_->OnShillDefaultLogicalDeviceChanged(&dual_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11198
naoyatezukaca02c502023-09-05 06:53:43199 EXPECT_CALL(*target_, StopClat(_)).Times(Exactly(0));
200 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("v6only")));
201 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, &dual_dev);
naoyatezuka02db5c12023-08-23 01:46:11202}
203
naoyatezukaca02c502023-09-05 06:53:43204TEST_F(ClatServiceTest, ChangeFromIPv6OnlyDeviceToDualStackDevice) {
naoyatezuka02db5c12023-08-23 01:46:11205 const auto dual_dev = MakeFakeDualStackShillDevice("dual_dev", 1);
206 const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2);
207
naoyatezukaca02c502023-09-05 06:53:43208 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11209
naoyatezukaca02c502023-09-05 06:53:43210 EXPECT_CALL(*target_, StopClat(true));
211 EXPECT_CALL(*target_, StartClat(_)).Times(Exactly(0));
212 target_->OnShillDefaultLogicalDeviceChanged(&dual_dev, &v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11213}
214
naoyatezukaca02c502023-09-05 06:53:43215TEST_F(ClatServiceTest, ChangeFromDualStackDeviceToAnother) {
naoyatezuka02db5c12023-08-23 01:46:11216 const auto new_v6only_dev = MakeFakeDualStackShillDevice(
217 "new_dual_dev", 1, "10.10.0.2/24", "1020:db8::1/64");
218
219 const auto prev_v6only_dev = MakeFakeDualStackShillDevice(
220 "prev_dual_dev", 2, "10.20.0.2/24", "2001:db8::1/64");
221
naoyatezukaca02c502023-09-05 06:53:43222 target_->OnShillDefaultLogicalDeviceChanged(&prev_v6only_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11223
naoyatezukaca02c502023-09-05 06:53:43224 EXPECT_CALL(*target_, StopClat(_)).Times(Exactly(0));
225 EXPECT_CALL(*target_, StartClat(_)).Times(Exactly(0));
226 target_->OnShillDefaultLogicalDeviceChanged(&new_v6only_dev,
227 &prev_v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11228}
229
naoyatezukaca02c502023-09-05 06:53:43230TEST_F(ClatServiceTest, ChangeFromNonExstingDeviceToExistingDevice) {
naoyatezuka02db5c12023-08-23 01:46:11231 const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only");
232
naoyatezukaca02c502023-09-05 06:53:43233 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("v6only")));
234 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11235}
236
naoyatezukaca02c502023-09-05 06:53:43237TEST_F(ClatServiceTest, ChangeFromExstingDeviceToNonExistingDevice) {
naoyatezuka02db5c12023-08-23 01:46:11238 const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only");
239
naoyatezukaca02c502023-09-05 06:53:43240 // Start CLAT on the new_device.
241 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11242
naoyatezukaca02c502023-09-05 06:53:43243 EXPECT_CALL(*target_, StopClat(true));
244 EXPECT_CALL(*target_, StartClat(_)).Times(Exactly(0));
245 target_->OnShillDefaultLogicalDeviceChanged(nullptr, &v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11246}
247
naoyatezukaca02c502023-09-05 06:53:43248TEST_F(ClatServiceTest,
249 DefaultDeviceChangeWhileClatIsRunningOnDifferentDevice) {
naoyatezuka02db5c12023-08-23 01:46:11250 const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 1);
251 const auto prev_v6only_dev =
252 MakeFakeIPv6OnlyShillDevice("new_v6only", 2, "1020:db8::1/64");
253 const auto new_v6only_dev =
254 MakeFakeIPv6OnlyShillDevice("prev_v6only", 3, "1030:db8::1/64");
255
naoyatezukaca02c502023-09-05 06:53:43256 // Start CLAT on device "v6only_dev1".
257 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11258
259 // Unexpectedly the default logical device changes from an device different
260 // from v6only_dev1 to another.
naoyatezukaca02c502023-09-05 06:53:43261 EXPECT_CALL(*target_, StopClat(true));
262 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("new_v6only")));
263 target_->OnShillDefaultLogicalDeviceChanged(&prev_v6only_dev,
264 &prev_v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11265}
266
naoyatezukaca02c502023-09-05 06:53:43267TEST_F(ClatServiceTest, NewDefaultDeviceIsTheSameWithClatDevice) {
naoyatezuka02db5c12023-08-23 01:46:11268 const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 1);
269 const auto dual_dev = MakeFakeDualStackShillDevice("dual", 2);
270
naoyatezukaca02c502023-09-05 06:53:43271 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr);
naoyatezuka02db5c12023-08-23 01:46:11272
naoyatezukaca02c502023-09-05 06:53:43273 EXPECT_CALL(*target_, StopClat(_)).Times(Exactly(0));
274 EXPECT_CALL(*target_, StartClat(_)).Times(Exactly(0));
275 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, &dual_dev);
naoyatezuka02db5c12023-08-23 01:46:11276}
277
naoyatezukaca02c502023-09-05 06:53:43278TEST_F(ClatServiceTest,
279 ChangeFromDualStackDeviceToIPv6OnlyDeviceWhileDisabled) {
naoyatezuka6e778df2023-09-01 00:44:00280 const auto dual_dev = MakeFakeDualStackShillDevice("dual", 1);
281 const auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2);
282
naoyatezukaca02c502023-09-05 06:53:43283 target_->OnShillDefaultLogicalDeviceChanged(&dual_dev, nullptr);
naoyatezuka6e778df2023-09-01 00:44:00284
naoyatezukaca02c502023-09-05 06:53:43285 EXPECT_CALL(*target_, StopClat(false));
286 target_->Disable();
naoyatezuka6e778df2023-09-01 00:44:00287
naoyatezukaca02c502023-09-05 06:53:43288 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("v6only")));
289 target_->OnShillDefaultLogicalDeviceChanged(&v6only_dev, &dual_dev);
naoyatezuka6e778df2023-09-01 00:44:00290
291 // The default logical device is IPv6-only, so CLAT starts immdiately after
292 // it's enabled.
naoyatezukaca02c502023-09-05 06:53:43293 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("v6only")));
294 target_->Enable();
naoyatezuka6e778df2023-09-01 00:44:00295}
296
naoyatezukaca02c502023-09-05 06:53:43297TEST_F(ClatServiceTest, IPv6OnlyDeviceGetIPv4Address) {
naoyatezuka02db5c12023-08-23 01:46:11298 auto default_logical_device = MakeFakeIPv6OnlyShillDevice("v6only");
299
naoyatezukaca02c502023-09-05 06:53:43300 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("v6only")));
301 target_->OnDefaultLogicalDeviceIPConfigChanged(default_logical_device);
naoyatezuka02db5c12023-08-23 01:46:11302
303 // The default logical device gets IPv4 address because of IPConfig changes.
304 default_logical_device.ipconfig.ipv4_cidr =
305 net_base::IPv4CIDR::CreateFromCIDRString(kIPv4CIDR);
306
naoyatezukaca02c502023-09-05 06:53:43307 EXPECT_CALL(*target_, StopClat(true));
308 target_->OnDefaultLogicalDeviceIPConfigChanged(default_logical_device);
naoyatezuka02db5c12023-08-23 01:46:11309}
310
naoyatezukaca02c502023-09-05 06:53:43311TEST_F(ClatServiceTest, DeviceLoseIPv4Address) {
naoyatezuka02db5c12023-08-23 01:46:11312 auto default_logical_device = MakeFakeDualStackShillDevice("dual_stack", 1);
313
naoyatezuka02db5c12023-08-23 01:46:11314 // The default logical device loses IPv4 address because of IPConfig changes.
315 default_logical_device.ipconfig.ipv4_cidr.reset();
316
naoyatezukaca02c502023-09-05 06:53:43317 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("dual_stack")));
318 target_->OnDefaultLogicalDeviceIPConfigChanged(default_logical_device);
naoyatezuka02db5c12023-08-23 01:46:11319}
320
naoyatezukaca02c502023-09-05 06:53:43321TEST_F(ClatServiceTest, IPConfigChangeWithoutIPv6AddressChange) {
naoyatezuka02db5c12023-08-23 01:46:11322 auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only");
323 v6only_dev.ipconfig.ipv4_dns_addresses = std::vector<std::string>{"8.8.8.8"};
324
naoyatezukaca02c502023-09-05 06:53:43325 target_->OnDefaultLogicalDeviceIPConfigChanged(v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11326
327 v6only_dev.ipconfig.ipv4_dns_addresses = std::vector<std::string>{"1.1.1.1"};
328
329 // This change has nothing with CLAT.
naoyatezukaca02c502023-09-05 06:53:43330 EXPECT_CALL(*target_, StopClat(_)).Times(Exactly(0));
331 EXPECT_CALL(*target_, StartClat(_)).Times(Exactly(0));
332 target_->OnDefaultLogicalDeviceIPConfigChanged(v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11333}
334
naoyatezukaca02c502023-09-05 06:53:43335TEST_F(ClatServiceTest, IPv6AddressChangeInTheSamePrefix) {
naoyatezuka02db5c12023-08-23 01:46:11336 auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 1, "2001:db8::1/64");
337
naoyatezukaca02c502023-09-05 06:53:43338 target_->OnDefaultLogicalDeviceIPConfigChanged(v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11339
340 v6only_dev.ipconfig.ipv6_cidr =
341 net_base::IPv6CIDR::CreateFromCIDRString("2001:db8::2/64");
342
343 // Even the new IPn6 address of the default logical device has the same prefix
344 // as the old one, CLAT needs to be reconfigured because the new address
345 // conflict with the IPv6 address used by CLAT.
naoyatezukaca02c502023-09-05 06:53:43346 EXPECT_CALL(*target_, StopClat(true));
347 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("v6only")));
348 target_->OnDefaultLogicalDeviceIPConfigChanged(v6only_dev);
naoyatezuka02db5c12023-08-23 01:46:11349}
350
naoyatezukaca02c502023-09-05 06:53:43351TEST_F(ClatServiceTest, EnabledAfterGettingIPv4AddressWhileDisabled) {
naoyatezuka6e778df2023-09-01 00:44:00352 auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only");
353
naoyatezukaca02c502023-09-05 06:53:43354 target_->OnDefaultLogicalDeviceIPConfigChanged(v6only_dev);
naoyatezuka6e778df2023-09-01 00:44:00355
naoyatezukaca02c502023-09-05 06:53:43356 EXPECT_CALL(*target_, StopClat(false));
357 target_->Disable();
naoyatezuka6e778df2023-09-01 00:44:00358
359 v6only_dev.ipconfig.ipv4_cidr =
360 net_base::IPv4CIDR::CreateFromCIDRString(kIPv4CIDR);
361
naoyatezukaca02c502023-09-05 06:53:43362 EXPECT_CALL(*target_, StopClat(true));
363 target_->OnDefaultLogicalDeviceIPConfigChanged(v6only_dev);
naoyatezuka6e778df2023-09-01 00:44:00364
naoyatezukaca02c502023-09-05 06:53:43365 EXPECT_CALL(*target_, StartClat(_)).Times(Exactly(0));
366 target_->Enable();
naoyatezuka6e778df2023-09-01 00:44:00367}
368
naoyatezukaca02c502023-09-05 06:53:43369TEST_F(ClatServiceTest, EnabledAfterBecomingIPv6OnlyWhileDisabled) {
naoyatezuka6e778df2023-09-01 00:44:00370 auto dual_dev = MakeFakeDualStackShillDevice("dual");
371
naoyatezukaca02c502023-09-05 06:53:43372 target_->OnDefaultLogicalDeviceIPConfigChanged(dual_dev);
naoyatezuka6e778df2023-09-01 00:44:00373
naoyatezukaca02c502023-09-05 06:53:43374 EXPECT_CALL(*target_, StopClat(false));
375 target_->Disable();
naoyatezuka6e778df2023-09-01 00:44:00376
377 dual_dev.ipconfig.ipv4_cidr.reset();
378
naoyatezukaca02c502023-09-05 06:53:43379 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("dual")));
380 target_->OnDefaultLogicalDeviceIPConfigChanged(dual_dev);
naoyatezuka6e778df2023-09-01 00:44:00381
382 // The default logical device is IPv6-only, so CLAT starts immdiately after
383 // it's enabled.
naoyatezukaca02c502023-09-05 06:53:43384 EXPECT_CALL(*target_, StartClat(ShillDeviceHasInterfaceName("dual")));
385 target_->Enable();
naoyatezuka6e778df2023-09-01 00:44:00386}
387
naoyatezukaca02c502023-09-05 06:53:43388TEST_F(ClatServiceTest, VerifyStartAndStopClat) {
389 ClatService target(&datapath_, &process_manager_, &system_);
390 target.Enable();
391
392 auto v4only_dev = MakeFakeIPv4OnlyShillDevice("v4only", 1);
393 auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2);
394
395 target.OnShillDefaultLogicalDeviceChanged(&v4only_dev, nullptr);
396
naoyatezuka71a3b772023-09-29 06:40:13397 EXPECT_CALL(system_, WriteConfigFile).WillOnce(Return(true));
naoyatezukaca02c502023-09-05 06:53:43398 EXPECT_CALL(
399 datapath_,
400 AddTunTap(StrEq("tun_nat64"), Eq(std::nullopt),
401 net_base::IPv4CIDR::CreateFromCIDRString("192.0.0.1/29"),
402 IsEmpty(), DeviceMode::kTun))
403 .WillOnce(Return("tun_nat64"));
naoyatezukac8ebb462023-09-21 10:52:33404 EXPECT_CALL(datapath_,
405 ModifyClatAcceptRules(Iptables::Command::kA, StrEq("tun_nat64")))
406 .WillOnce(Return(true));
naoyatezukaca02c502023-09-05 06:53:43407 EXPECT_CALL(datapath_, AddIPv6HostRoute(StrEq("tun_nat64"),
408 CIDRHasPrefix("2001:db8::/64"),
409 Eq(std::nullopt)))
410 .WillOnce(Return(true));
411 EXPECT_CALL(
412 datapath_,
413 AddIPv6NeighborProxy(StrEq("v6only"), AddressHasPrefix("2001:db8::/64")))
414 .WillOnce(Return(true));
415 EXPECT_CALL(datapath_, AddIPv4RouteToTable(StrEq("tun_nat64"),
416 net_base::IPv4CIDR(), 249))
417 .WillOnce(Return(true));
418 // StartClat() is called.
419 target.OnShillDefaultLogicalDeviceChanged(&v6only_dev, &v4only_dev);
420
421 EXPECT_CALL(datapath_, DeleteIPv4RouteFromTable(StrEq("tun_nat64"),
422 net_base::IPv4CIDR(), 249));
423 EXPECT_CALL(datapath_,
424 RemoveIPv6NeighborProxy(StrEq("v6only"),
425 AddressHasPrefix("2001:db8::/64")));
naoyatezukac8ebb462023-09-21 10:52:33426 EXPECT_CALL(datapath_,
427 ModifyClatAcceptRules(Iptables::Command::kD, StrEq("tun_nat64")));
naoyatezukaca02c502023-09-05 06:53:43428 EXPECT_CALL(datapath_, RemoveIPv6HostRoute(CIDRHasPrefix("2001:db8::/64")));
429 EXPECT_CALL(datapath_, RemoveTunTap(StrEq("tun_nat64"), DeviceMode::kTun));
430 // StopClat() is called.
431 target.OnShillDefaultLogicalDeviceChanged(&v4only_dev, &v6only_dev);
432}
433
naoyatezuka71a3b772023-09-29 06:40:13434TEST_F(ClatServiceTest, CleanUpDatapathWhenDisabled) {
435 ClatService target(&datapath_, &process_manager_, &system_);
436 target.Enable();
437
438 auto v6only_dev = MakeFakeIPv6OnlyShillDevice("v6only", 2);
439 ON_CALL(system_, WriteConfigFile).WillByDefault(Return(true));
440 ON_CALL(datapath_, AddTunTap).WillByDefault(Return("tun_nat64"));
441 ON_CALL(datapath_, ModifyClatAcceptRules).WillByDefault(Return(true));
442 ON_CALL(datapath_, AddIPv6HostRoute).WillByDefault(Return(true));
443 ON_CALL(datapath_, AddIPv6NeighborProxy).WillByDefault(Return(true));
444 ON_CALL(datapath_, AddIPv4RouteToTable).WillByDefault(Return(true));
445 // Start CLAT.
446 target.OnShillDefaultLogicalDeviceChanged(&v6only_dev, nullptr);
447
448 EXPECT_CALL(datapath_, DeleteIPv4RouteFromTable(StrEq("tun_nat64"),
449 net_base::IPv4CIDR(), 249));
450 EXPECT_CALL(datapath_,
451 RemoveIPv6NeighborProxy(StrEq("v6only"),
452 AddressHasPrefix("2001:db8::/64")));
453 EXPECT_CALL(datapath_,
454 ModifyClatAcceptRules(Iptables::Command::kD, StrEq("tun_nat64")));
455 EXPECT_CALL(datapath_, RemoveIPv6HostRoute(CIDRHasPrefix("2001:db8::/64")));
456 EXPECT_CALL(datapath_, RemoveTunTap(StrEq("tun_nat64"), DeviceMode::kTun));
457 target.Disable();
458}
459
naoyatezukaca02c502023-09-05 06:53:43460} // namespace
naoyatezuka02db5c12023-08-23 01:46:11461} // namespace patchpanel