blob: bc1e73935860e11cfc06c04317270cde87081998 [file] [log] [blame]
Lorenzo Colitti89faa342016-02-26 11:38:47 +09001/*
2 * Copyright 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 * binder_test.cpp - unit tests for netd binder RPCs.
17 */
18
Robin Leeb8087362016-03-30 18:43:08 +010019#include <cerrno>
Luke Huang528af602018-08-29 19:06:05 +080020#include <chrono>
Robin Leeb8087362016-03-30 18:43:08 +010021#include <cinttypes>
Luke Huang528af602018-08-29 19:06:05 +080022#include <condition_variable>
Lorenzo Colitti89faa342016-02-26 11:38:47 +090023#include <cstdint>
Lorenzo Colittidedd2712016-03-22 12:36:29 +090024#include <cstdlib>
Bernie Innocenti196f1b82019-05-20 16:34:16 +090025#include <iostream>
Luke Huang528af602018-08-29 19:06:05 +080026#include <mutex>
Taras Antoshchuk35987de2021-09-21 17:45:15 +020027#include <numeric>
Lorenzo Colitti23554ba2020-11-05 01:43:46 +090028#include <regex>
Lorenzo Colitti563d98b2016-04-24 13:13:14 +090029#include <set>
Lorenzo Colitti23554ba2020-11-05 01:43:46 +090030#include <string>
Lorenzo Colitti89faa342016-02-26 11:38:47 +090031#include <vector>
32
Luke Huangf7782042018-08-08 13:13:04 +080033#include <dirent.h>
Lorenzo Colitti755faa92016-07-27 22:10:49 +090034#include <fcntl.h>
Erik Klinecc4f2732016-08-03 11:24:27 +090035#include <ifaddrs.h>
Lorenzo Colitti755faa92016-07-27 22:10:49 +090036#include <linux/if.h>
37#include <linux/if_tun.h>
Lorenzo Colitti8363bf42020-05-29 21:37:09 +090038#include <net/ethernet.h>
Benedict Wonga450e722018-05-07 10:29:02 -070039#include <net/if.h>
Luke Huangf7782042018-08-08 13:13:04 +080040#include <netdb.h>
41#include <netinet/in.h>
Lorenzo Colitti1b213742020-03-27 17:50:19 +090042#include <netinet/tcp.h>
Ben Schwartze7601812017-04-28 16:38:29 -040043#include <openssl/base64.h>
Luke Huangf7782042018-08-08 13:13:04 +080044#include <sys/socket.h>
45#include <sys/types.h>
Lorenzo Colitti563d98b2016-04-24 13:13:14 +090046
Luke Huang531f5d32018-08-03 15:19:05 +080047#include <android-base/file.h>
Lorenzo Colitti8363bf42020-05-29 21:37:09 +090048#include <android-base/format.h>
Erik Klinecc4f2732016-08-03 11:24:27 +090049#include <android-base/macros.h>
Lorenzo Colitti1b213742020-03-27 17:50:19 +090050#include <android-base/scopeguard.h>
Lorenzo Colitti89faa342016-02-26 11:38:47 +090051#include <android-base/stringprintf.h>
Lorenzo Colittidedd2712016-03-22 12:36:29 +090052#include <android-base/strings.h>
Chiachang Wang00fc62f2019-12-04 20:38:26 +080053#include <android/multinetwork.h>
Luke Huang2ff8b342019-04-30 15:33:33 +080054#include <binder/IPCThreadState.h>
Chenbo Feng48eaed32018-12-26 17:40:21 -080055#include <bpf/BpfMap.h>
Chenbo Feng837ddfc2018-05-08 13:45:08 -070056#include <bpf/BpfUtils.h>
Luke Huang2ff8b342019-04-30 15:33:33 +080057#include <com/android/internal/net/BnOemNetdUnsolicitedEventListener.h>
58#include <com/android/internal/net/IOemNetd.h>
Robin Leeb8087362016-03-30 18:43:08 +010059#include <cutils/multiuser.h>
Lorenzo Colitti89faa342016-02-26 11:38:47 +090060#include <gtest/gtest.h>
Lorenzo Colitti755faa92016-07-27 22:10:49 +090061#include <netutils/ifc.h>
Lorenzo Colitti23554ba2020-11-05 01:43:46 +090062#include <utils/Errors.h>
Luke Huangd2861982019-05-17 19:47:28 +080063#include "Fwmark.h"
Nathan Harold21299f72018-03-16 20:13:03 -070064#include "InterfaceController.h"
Luke Huangd2861982019-05-17 19:47:28 +080065#include "NetdClient.h"
Lorenzo Colitti89faa342016-02-26 11:38:47 +090066#include "NetdConstants.h"
Chiachang Wang00fc62f2019-12-04 20:38:26 +080067#include "NetworkController.h"
Ken Chen69839af2021-01-05 22:48:32 +080068#include "RouteController.h"
Lorenzo Colitti1b213742020-03-27 17:50:19 +090069#include "SockDiag.h"
Luke Huang528af602018-08-29 19:06:05 +080070#include "TestUnsolService.h"
Nathan Harold21299f72018-03-16 20:13:03 -070071#include "XfrmController.h"
Lorenzo Colitti89faa342016-02-26 11:38:47 +090072#include "android/net/INetd.h"
paulhu72742952022-02-09 21:24:09 +080073#include "android/net/mdns/aidl/BnMDnsEventListener.h"
74#include "android/net/mdns/aidl/DiscoveryInfo.h"
75#include "android/net/mdns/aidl/GetAddressInfo.h"
76#include "android/net/mdns/aidl/IMDns.h"
77#include "android/net/mdns/aidl/RegistrationInfo.h"
78#include "android/net/mdns/aidl/ResolutionInfo.h"
Lorenzo Colitti89faa342016-02-26 11:38:47 +090079#include "binder/IServiceManager.h"
Luke Huang25599322019-06-14 00:34:05 +080080#include "netdutils/InternetAddresses.h"
Mike Yue7e332f2019-03-13 17:15:48 +080081#include "netdutils/Stopwatch.h"
Nathan Harold21299f72018-03-16 20:13:03 -070082#include "netdutils/Syscalls.h"
waynema5851b032021-11-24 17:08:25 +080083#include "netdutils/Utils.h"
Luke Huangd2861982019-05-17 19:47:28 +080084#include "netid_client.h" // NETID_UNSET
Ken Chencf082a32022-01-15 10:58:55 +080085#include "nettestutils/DumpService.h"
Lorenzo Colitti758bccc2019-06-26 22:12:35 +090086#include "test_utils.h"
Mike Yu5ae61542018-10-19 22:11:43 +080087#include "tun_interface.h"
Lorenzo Colitti89faa342016-02-26 11:38:47 +090088
Lorenzo Colitti5c68b9c2017-08-10 18:50:10 +090089#define IP6TABLES_PATH "/system/bin/ip6tables"
90#define IPTABLES_PATH "/system/bin/iptables"
Luke Huang0051a622018-07-23 20:30:16 +080091#define RAW_TABLE "raw"
92#define MANGLE_TABLE "mangle"
Luke Huang531f5d32018-08-03 15:19:05 +080093#define FILTER_TABLE "filter"
Luke Huang19b49c52018-10-22 12:12:05 +090094#define NAT_TABLE "nat"
Lorenzo Colitti755faa92016-07-27 22:10:49 +090095
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +090096namespace binder = android::binder;
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +090097
98using android::IBinder;
99using android::IServiceManager;
100using android::sp;
101using android::String16;
102using android::String8;
103using android::base::Join;
Lorenzo Colitti1b213742020-03-27 17:50:19 +0900104using android::base::make_scope_guard;
Luke Huang531f5d32018-08-03 15:19:05 +0800105using android::base::ReadFileToString;
Lorenzo Colittiaff28792017-09-26 17:46:18 +0900106using android::base::StartsWith;
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900107using android::base::StringPrintf;
Luke Huang531f5d32018-08-03 15:19:05 +0800108using android::base::Trim;
Bernie Innocentid26a04a2019-10-30 17:15:15 +0900109using android::base::unique_fd;
paulhu72742952022-02-09 21:24:09 +0800110using android::binder::Status;
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900111using android::net::INetd;
Luke Huangf7782042018-08-08 13:13:04 +0800112using android::net::InterfaceConfigurationParcel;
113using android::net::InterfaceController;
Chiachang Wang00fc62f2019-12-04 20:38:26 +0800114using android::net::MarkMaskParcel;
Ken Chenab5f3472021-04-04 11:28:06 +0800115using android::net::NativeNetworkConfig;
116using android::net::NativeNetworkType;
117using android::net::NativeVpnType;
Chiachang Wang2e9443f2022-01-14 22:55:36 +0800118using android::net::RULE_PRIORITY_BYPASSABLE_VPN_LOCAL_EXCLUSION;
119using android::net::RULE_PRIORITY_BYPASSABLE_VPN_NO_LOCAL_EXCLUSION;
Ken Chen7099e2e2021-02-08 00:57:47 +0800120using android::net::RULE_PRIORITY_DEFAULT_NETWORK;
121using android::net::RULE_PRIORITY_EXPLICIT_NETWORK;
Chiachang Wange7bf5f52022-01-17 11:37:39 +0800122using android::net::RULE_PRIORITY_LOCAL_ROUTES;
Ken Chen4ea88462021-05-23 14:56:43 +0800123using android::net::RULE_PRIORITY_OUTPUT_INTERFACE;
Ken Chen7099e2e2021-02-08 00:57:47 +0800124using android::net::RULE_PRIORITY_PROHIBIT_NON_VPN;
Ken Chen69839af2021-01-05 22:48:32 +0800125using android::net::RULE_PRIORITY_SECURE_VPN;
Ken Chen7099e2e2021-02-08 00:57:47 +0800126using android::net::RULE_PRIORITY_TETHERING;
Ken Chen8738e1c2020-11-24 11:38:54 +0800127using android::net::RULE_PRIORITY_UID_DEFAULT_NETWORK;
Ken Chen4e8ef9b2021-03-17 01:57:19 +0800128using android::net::RULE_PRIORITY_UID_DEFAULT_UNREACHABLE;
Ken Chen8738e1c2020-11-24 11:38:54 +0800129using android::net::RULE_PRIORITY_UID_EXPLICIT_NETWORK;
130using android::net::RULE_PRIORITY_UID_IMPLICIT_NETWORK;
chiachangwang776b68c2022-05-17 05:16:16 +0000131using android::net::RULE_PRIORITY_UID_LOCAL_ROUTES;
Ken Chen69839af2021-01-05 22:48:32 +0800132using android::net::RULE_PRIORITY_VPN_FALLTHROUGH;
Lorenzo Colitti1b213742020-03-27 17:50:19 +0900133using android::net::SockDiag;
Lorenzo Colitti182cd3c2020-04-04 00:44:01 +0900134using android::net::TetherOffloadRuleParcel;
Luke Huangcaebcbb2018-09-27 20:37:14 +0800135using android::net::TetherStatsParcel;
Lorenzo Colitti1e299c62017-02-27 17:16:10 +0900136using android::net::TunInterface;
Luke Huang94658ac2018-10-18 19:35:12 +0900137using android::net::UidRangeParcel;
Ken Chen4ea88462021-05-23 14:56:43 +0800138using android::net::UidRanges;
paulhu72742952022-02-09 21:24:09 +0800139using android::net::mdns::aidl::DiscoveryInfo;
140using android::net::mdns::aidl::GetAddressInfo;
141using android::net::mdns::aidl::IMDns;
142using android::net::mdns::aidl::RegistrationInfo;
143using android::net::mdns::aidl::ResolutionInfo;
Ken Chen4ea88462021-05-23 14:56:43 +0800144using android::net::netd::aidl::NativeUidRangeConfig;
waynema5851b032021-11-24 17:08:25 +0800145using android::netdutils::getIfaceNames;
Lorenzo Colitti1b213742020-03-27 17:50:19 +0900146using android::netdutils::IPAddress;
Luke Huang25599322019-06-14 00:34:05 +0800147using android::netdutils::ScopedAddrinfo;
Luke Huangf7782042018-08-08 13:13:04 +0800148using android::netdutils::sSyscalls;
Mike Yue7e332f2019-03-13 17:15:48 +0800149using android::netdutils::Stopwatch;
Robin Leeb8087362016-03-30 18:43:08 +0100150
151static const char* IP_RULE_V4 = "-4";
152static const char* IP_RULE_V6 = "-6";
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900153static const int TEST_NETID1 = 65501;
154static const int TEST_NETID2 = 65502;
Ken Chen8738e1c2020-11-24 11:38:54 +0800155static const int TEST_NETID3 = 65503;
Ken Chen4ea88462021-05-23 14:56:43 +0800156static const int TEST_NETID4 = 65504;
Lorenzo Colitti23554ba2020-11-05 01:43:46 +0900157static const int TEST_DUMP_NETID = 65123;
Lorenzo Colitti1b213742020-03-27 17:50:19 +0900158static const char* DNSMASQ = "dnsmasq";
Chenbo Feng48eaed32018-12-26 17:40:21 -0800159
160// Use maximum reserved appId for applications to avoid conflict with existing
161// uids.
162static const int TEST_UID1 = 99999;
163static const int TEST_UID2 = 99998;
Ken Chen8738e1c2020-11-24 11:38:54 +0800164static const int TEST_UID3 = 99997;
Ken Chen4ea88462021-05-23 14:56:43 +0800165static const int TEST_UID4 = 99996;
166static const int TEST_UID5 = 99995;
167static const int TEST_UID6 = 99994;
Chenbo Feng48eaed32018-12-26 17:40:21 -0800168
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900169constexpr int BASE_UID = AID_USER_OFFSET * 5;
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900170
Benedict Wongb2daefb2017-12-06 22:05:46 -0800171static const std::string NO_SOCKET_ALLOW_RULE("! owner UID match 0-4294967294");
172static const std::string ESP_ALLOW_RULE("esp");
173
Ken Chen8738e1c2020-11-24 11:38:54 +0800174static const in6_addr V6_ADDR = {
175 {// 2001:db8:cafe::8888
176 .u6_addr8 = {0x20, 0x01, 0x0d, 0xb8, 0xca, 0xfe, 0, 0, 0, 0, 0, 0, 0, 0, 0x88, 0x88}}};
177
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +0900178class NetdBinderTest : public ::testing::Test {
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900179 public:
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +0900180 NetdBinderTest() {
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900181 sp<IServiceManager> sm = android::defaultServiceManager();
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900182 sp<IBinder> binder = sm->getService(String16("netd"));
183 if (binder != nullptr) {
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900184 mNetd = android::interface_cast<INetd>(binder);
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900185 }
186 }
187
Lorenzo Colitti755faa92016-07-27 22:10:49 +0900188 void SetUp() override {
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900189 ASSERT_NE(nullptr, mNetd.get());
190 }
191
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900192 void TearDown() override {
193 mNetd->networkDestroy(TEST_NETID1);
194 mNetd->networkDestroy(TEST_NETID2);
Ken Chen8738e1c2020-11-24 11:38:54 +0800195 mNetd->networkDestroy(TEST_NETID3);
Ken Chen4ea88462021-05-23 14:56:43 +0800196 mNetd->networkDestroy(TEST_NETID4);
Luke Huangd2861982019-05-17 19:47:28 +0800197 setNetworkForProcess(NETID_UNSET);
198 // Restore default network
199 if (mStoredDefaultNetwork >= 0) mNetd->networkSetDefault(mStoredDefaultNetwork);
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900200 }
201
Bernie Innocenti6f9fd902018-10-11 20:50:23 +0900202 bool allocateIpSecResources(bool expectOk, int32_t* spi);
Nathan Harold21299f72018-03-16 20:13:03 -0700203
Lorenzo Colitti755faa92016-07-27 22:10:49 +0900204 // Static because setting up the tun interface takes about 40ms.
205 static void SetUpTestCase() {
Lorenzo Colitti1e299c62017-02-27 17:16:10 +0900206 ASSERT_EQ(0, sTun.init());
Luke Huang19b49c52018-10-22 12:12:05 +0900207 ASSERT_EQ(0, sTun2.init());
Ken Chen8738e1c2020-11-24 11:38:54 +0800208 ASSERT_EQ(0, sTun3.init());
Ken Chen4ea88462021-05-23 14:56:43 +0800209 ASSERT_EQ(0, sTun4.init());
Lorenzo Colitti1e299c62017-02-27 17:16:10 +0900210 ASSERT_LE(sTun.name().size(), static_cast<size_t>(IFNAMSIZ));
Luke Huang19b49c52018-10-22 12:12:05 +0900211 ASSERT_LE(sTun2.name().size(), static_cast<size_t>(IFNAMSIZ));
Ken Chen8738e1c2020-11-24 11:38:54 +0800212 ASSERT_LE(sTun3.name().size(), static_cast<size_t>(IFNAMSIZ));
Ken Chen4ea88462021-05-23 14:56:43 +0800213 ASSERT_LE(sTun4.name().size(), static_cast<size_t>(IFNAMSIZ));
Lorenzo Colitti755faa92016-07-27 22:10:49 +0900214 }
215
216 static void TearDownTestCase() {
217 // Closing the socket removes the interface and IP addresses.
Lorenzo Colitti1e299c62017-02-27 17:16:10 +0900218 sTun.destroy();
Luke Huang19b49c52018-10-22 12:12:05 +0900219 sTun2.destroy();
Ken Chen8738e1c2020-11-24 11:38:54 +0800220 sTun3.destroy();
Ken Chen4ea88462021-05-23 14:56:43 +0800221 sTun4.destroy();
Lorenzo Colitti755faa92016-07-27 22:10:49 +0900222 }
223
Bernie Innocentid26a04a2019-10-30 17:15:15 +0900224 static void fakeRemoteSocketPair(unique_fd* clientSocket, unique_fd* serverSocket,
225 unique_fd* acceptedSocket);
Lorenzo Colitti755faa92016-07-27 22:10:49 +0900226
Luke Huangd2861982019-05-17 19:47:28 +0800227 void createVpnNetworkWithUid(bool secure, uid_t uid, int vpnNetId = TEST_NETID2,
Chiachang8a03faa2022-05-04 07:45:37 +0000228 int fallthroughNetId = TEST_NETID1,
229 int nonDefaultNetId = TEST_NETID3);
Luke Huangd2861982019-05-17 19:47:28 +0800230
Ken Chen8738e1c2020-11-24 11:38:54 +0800231 void createAndSetDefaultNetwork(int netId, const std::string& interface,
232 int permission = INetd::PERMISSION_NONE);
233
234 void createPhysicalNetwork(int netId, const std::string& interface,
235 int permission = INetd::PERMISSION_NONE);
236
237 void createDefaultAndOtherPhysicalNetwork(int defaultNetId, int otherNetId);
238
239 void createVpnAndOtherPhysicalNetwork(int systemDefaultNetId, int otherNetId, int vpnNetId,
240 bool secure);
241
242 void createVpnAndAppDefaultNetworkWithUid(int systemDefaultNetId, int appDefaultNetId,
243 int vpnNetId, bool secure,
244 std::vector<UidRangeParcel>&& appDefaultUidRanges,
245 std::vector<UidRangeParcel>&& vpnUidRanges);
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900246 protected:
Luke Huangd2861982019-05-17 19:47:28 +0800247 // Use -1 to represent that default network was not modified because
248 // real netId must be an unsigned value.
249 int mStoredDefaultNetwork = -1;
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900250 sp<INetd> mNetd;
Lorenzo Colitti1e299c62017-02-27 17:16:10 +0900251 static TunInterface sTun;
Luke Huang19b49c52018-10-22 12:12:05 +0900252 static TunInterface sTun2;
Ken Chen8738e1c2020-11-24 11:38:54 +0800253 static TunInterface sTun3;
Ken Chen4ea88462021-05-23 14:56:43 +0800254 static TunInterface sTun4;
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900255};
256
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +0900257TunInterface NetdBinderTest::sTun;
258TunInterface NetdBinderTest::sTun2;
Ken Chen8738e1c2020-11-24 11:38:54 +0800259TunInterface NetdBinderTest::sTun3;
Ken Chen4ea88462021-05-23 14:56:43 +0800260TunInterface NetdBinderTest::sTun4;
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900261
Lorenzo Colitti699aa992016-04-15 10:22:37 +0900262class TimedOperation : public Stopwatch {
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900263 public:
Chih-Hung Hsieh18051052016-05-06 10:36:13 -0700264 explicit TimedOperation(const std::string &name): mName(name) {}
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900265 virtual ~TimedOperation() {
Bernie Innocenti196f1b82019-05-20 16:34:16 +0900266 std::cerr << " " << mName << ": " << timeTakenUs() << "us" << std::endl;
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900267 }
268
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +0900269 private:
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900270 std::string mName;
271};
272
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +0900273TEST_F(NetdBinderTest, IsAlive) {
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900274 TimedOperation t("isAlive RPC");
275 bool isAlive = false;
276 mNetd->isAlive(&isAlive);
277 ASSERT_TRUE(isAlive);
278}
279
Ken Chenab5f3472021-04-04 11:28:06 +0800280namespace {
281
282NativeNetworkConfig makeNativeNetworkConfig(int netId, NativeNetworkType networkType,
Chiachang Wang6dd46152022-01-12 10:02:32 +0800283 int permission, bool secure, bool excludeLocalRoutes) {
Ken Chenab5f3472021-04-04 11:28:06 +0800284 NativeNetworkConfig config = {};
285 config.netId = netId;
286 config.networkType = networkType;
287 config.permission = permission;
288 config.secure = secure;
289 // The vpnType doesn't matter in AOSP. Just pick a well defined one from INetd.
290 config.vpnType = NativeVpnType::PLATFORM;
Chiachang Wang6dd46152022-01-12 10:02:32 +0800291 config.excludeLocalRoutes = excludeLocalRoutes;
Ken Chenab5f3472021-04-04 11:28:06 +0800292 return config;
293}
294
295} // namespace
296
Ken Chena2238de2021-04-27 13:32:40 +0800297bool testNetworkExistsButCannotConnect(const sp<INetd>& netd, TunInterface& ifc, const int netId) {
Chalard Jeand96b0f22021-01-20 14:16:06 +0900298 // If this network exists, we should definitely not be able to create it.
Ken Chenab5f3472021-04-04 11:28:06 +0800299 // Note that this networkCreate is never allowed to create reserved network IDs, so
Chalard Jeand96b0f22021-01-20 14:16:06 +0900300 // this call may fail for other reasons than the network already existing.
Ken Chenab5f3472021-04-04 11:28:06 +0800301 const auto& config = makeNativeNetworkConfig(netId, NativeNetworkType::PHYSICAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +0800302 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +0800303 EXPECT_FALSE(netd->networkCreate(config).isOk());
Ken Chena2238de2021-04-27 13:32:40 +0800304 // Test if the network exist by adding interface. INetd has no dedicated method to query. When
305 // the network exists and the interface can be added, the function succeeds. When the network
306 // exists but the interface cannot be added, it fails with EINVAL, otherwise it is ENONET.
307 binder::Status status = netd->networkAddInterface(netId, ifc.name());
308 if (status.isOk()) { // clean up
309 EXPECT_TRUE(netd->networkRemoveInterface(netId, ifc.name()).isOk());
310 } else if (status.serviceSpecificErrorCode() == ENONET) {
311 return false;
312 }
Chalard Jeand96b0f22021-01-20 14:16:06 +0900313
314 const sockaddr_in6 sin6 = {.sin6_family = AF_INET6,
315 .sin6_addr = {{.u6_addr32 = {htonl(0x20010db8), 0, 0, 0}}},
316 .sin6_port = 53};
317 const int s = socket(AF_INET6, SOCK_DGRAM, 0);
Ken Chena2238de2021-04-27 13:32:40 +0800318 EXPECT_NE(-1, s);
319 if (s == -1) return true;
Lorenzo Colittibf1c0e32021-02-05 18:04:21 +0900320 Fwmark fwmark;
321 fwmark.explicitlySelected = true;
322 fwmark.netId = netId;
323 EXPECT_EQ(0, setsockopt(s, SOL_SOCKET, SO_MARK, &fwmark.intValue, sizeof(fwmark.intValue)));
Chalard Jeand96b0f22021-01-20 14:16:06 +0900324 const int ret = connect(s, (struct sockaddr*)&sin6, sizeof(sin6));
325 const int err = errno;
326 EXPECT_EQ(-1, ret);
327 EXPECT_EQ(ENETUNREACH, err);
328 close(s);
Ken Chena2238de2021-04-27 13:32:40 +0800329 return true;
Chalard Jeand96b0f22021-01-20 14:16:06 +0900330}
331
332TEST_F(NetdBinderTest, InitialNetworksExist) {
Ken Chena2238de2021-04-27 13:32:40 +0800333 EXPECT_TRUE(testNetworkExistsButCannotConnect(mNetd, sTun, INetd::DUMMY_NET_ID));
334 EXPECT_TRUE(testNetworkExistsButCannotConnect(mNetd, sTun, INetd::LOCAL_NET_ID));
335 EXPECT_TRUE(testNetworkExistsButCannotConnect(mNetd, sTun, INetd::UNREACHABLE_NET_ID));
336 EXPECT_FALSE(testNetworkExistsButCannotConnect(mNetd, sTun, 77 /* not exist */));
Chalard Jeand96b0f22021-01-20 14:16:06 +0900337}
338
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +0900339TEST_F(NetdBinderTest, IpSecTunnelInterface) {
George Burgess IVc4a6d272018-05-21 14:41:57 -0700340 const struct TestData {
341 const std::string family;
342 const std::string deviceName;
343 const std::string localAddress;
344 const std::string remoteAddress;
manojboopathi8707f232018-01-02 14:45:47 -0800345 int32_t iKey;
346 int32_t oKey;
Benedict Wonga450e722018-05-07 10:29:02 -0700347 int32_t ifId;
manojboopathi8707f232018-01-02 14:45:47 -0800348 } kTestData[] = {
Benedict Wonga450e722018-05-07 10:29:02 -0700349 {"IPV4", "ipsec_test", "127.0.0.1", "8.8.8.8", 0x1234 + 53, 0x1234 + 53, 0xFFFE},
350 {"IPV6", "ipsec_test6", "::1", "2001:4860:4860::8888", 0x1234 + 50, 0x1234 + 50,
351 0xFFFE},
manojboopathi8707f232018-01-02 14:45:47 -0800352 };
353
Sehee Park8659b8d2018-11-16 10:53:16 +0900354 for (size_t i = 0; i < std::size(kTestData); i++) {
Nathan Harold21299f72018-03-16 20:13:03 -0700355 const auto& td = kTestData[i];
manojboopathi8707f232018-01-02 14:45:47 -0800356
357 binder::Status status;
358
Benedict Wong319f17e2018-05-15 17:06:44 -0700359 // Create Tunnel Interface.
360 status = mNetd->ipSecAddTunnelInterface(td.deviceName, td.localAddress, td.remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700361 td.iKey, td.oKey, td.ifId);
manojboopathi8707f232018-01-02 14:45:47 -0800362 EXPECT_TRUE(status.isOk()) << td.family << status.exceptionMessage();
363
Benedict Wonga450e722018-05-07 10:29:02 -0700364 // Check that the interface exists
Sehee Park8659b8d2018-11-16 10:53:16 +0900365 EXPECT_NE(0U, if_nametoindex(td.deviceName.c_str()));
Benedict Wonga450e722018-05-07 10:29:02 -0700366
Benedict Wong319f17e2018-05-15 17:06:44 -0700367 // Update Tunnel Interface.
368 status = mNetd->ipSecUpdateTunnelInterface(td.deviceName, td.localAddress, td.remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700369 td.iKey, td.oKey, td.ifId);
manojboopathi8707f232018-01-02 14:45:47 -0800370 EXPECT_TRUE(status.isOk()) << td.family << status.exceptionMessage();
371
Benedict Wong319f17e2018-05-15 17:06:44 -0700372 // Remove Tunnel Interface.
373 status = mNetd->ipSecRemoveTunnelInterface(td.deviceName);
manojboopathi8707f232018-01-02 14:45:47 -0800374 EXPECT_TRUE(status.isOk()) << td.family << status.exceptionMessage();
Benedict Wonga450e722018-05-07 10:29:02 -0700375
376 // Check that the interface no longer exists
Sehee Park8659b8d2018-11-16 10:53:16 +0900377 EXPECT_EQ(0U, if_nametoindex(td.deviceName.c_str()));
manojboopathi8707f232018-01-02 14:45:47 -0800378 }
379}
380
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +0900381TEST_F(NetdBinderTest, IpSecSetEncapSocketOwner) {
Bernie Innocentid26a04a2019-10-30 17:15:15 +0900382 unique_fd uniqueFd(socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0));
Benedict Wong1cb73df2018-12-03 00:54:14 -0800383 android::os::ParcelFileDescriptor sockFd(std::move(uniqueFd));
384
385 int sockOptVal = UDP_ENCAP_ESPINUDP;
386 setsockopt(sockFd.get(), IPPROTO_UDP, UDP_ENCAP, &sockOptVal, sizeof(sockOptVal));
387
388 binder::Status res = mNetd->ipSecSetEncapSocketOwner(sockFd, 1001);
389 EXPECT_TRUE(res.isOk());
390
391 struct stat info;
392 EXPECT_EQ(0, fstat(sockFd.get(), &info));
393 EXPECT_EQ(1001, (int) info.st_uid);
394}
395
Nathan Harold2deff322018-05-10 14:03:48 -0700396// IPsec tests are not run in 32 bit mode; both 32-bit kernels and
397// mismatched ABIs (64-bit kernel with 32-bit userspace) are unsupported.
398#if INTPTR_MAX != INT32_MAX
Bernie Innocentia5161a02019-01-30 22:40:53 +0900399
400using android::net::XfrmController;
401
Benedict Wonga04ffa72018-05-09 21:42:42 -0700402static const int XFRM_DIRECTIONS[] = {static_cast<int>(android::net::XfrmDirection::IN),
403 static_cast<int>(android::net::XfrmDirection::OUT)};
404static const int ADDRESS_FAMILIES[] = {AF_INET, AF_INET6};
405
Nathan Harold21299f72018-03-16 20:13:03 -0700406#define RETURN_FALSE_IF_NEQ(_expect_, _ret_) \
407 do { if ((_expect_) != (_ret_)) return false; } while(false)
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +0900408bool NetdBinderTest::allocateIpSecResources(bool expectOk, int32_t* spi) {
Bernie Innocentia5161a02019-01-30 22:40:53 +0900409 android::netdutils::Status status = XfrmController::ipSecAllocateSpi(0, "::", "::1", 123, spi);
Nathan Harold21299f72018-03-16 20:13:03 -0700410 SCOPED_TRACE(status);
411 RETURN_FALSE_IF_NEQ(status.ok(), expectOk);
412
413 // Add a policy
Benedict Wonga450e722018-05-07 10:29:02 -0700414 status = XfrmController::ipSecAddSecurityPolicy(0, AF_INET6, 0, "::", "::1", 123, 0, 0, 0);
Nathan Harold21299f72018-03-16 20:13:03 -0700415 SCOPED_TRACE(status);
416 RETURN_FALSE_IF_NEQ(status.ok(), expectOk);
417
418 // Add an ipsec interface
Benedict Wonga450e722018-05-07 10:29:02 -0700419 return expectOk == XfrmController::ipSecAddTunnelInterface("ipsec_test", "::", "::1", 0xF00D,
420 0xD00D, 0xE00D, false)
421 .ok();
Nathan Harold21299f72018-03-16 20:13:03 -0700422}
423
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +0900424TEST_F(NetdBinderTest, XfrmDualSelectorTunnelModePoliciesV4) {
Bernie Innocentia5161a02019-01-30 22:40:53 +0900425 android::binder::Status status;
Benedict Wonga04ffa72018-05-09 21:42:42 -0700426
427 // Repeat to ensure cleanup and recreation works correctly
428 for (int i = 0; i < 2; i++) {
429 for (int direction : XFRM_DIRECTIONS) {
430 for (int addrFamily : ADDRESS_FAMILIES) {
431 status = mNetd->ipSecAddSecurityPolicy(0, addrFamily, direction, "127.0.0.5",
Benedict Wonga450e722018-05-07 10:29:02 -0700432 "127.0.0.6", 123, 0, 0, 0);
Benedict Wonga04ffa72018-05-09 21:42:42 -0700433 EXPECT_TRUE(status.isOk())
434 << " family: " << addrFamily << " direction: " << direction;
435 }
436 }
437
438 // Cleanup
439 for (int direction : XFRM_DIRECTIONS) {
440 for (int addrFamily : ADDRESS_FAMILIES) {
Benedict Wonga450e722018-05-07 10:29:02 -0700441 status = mNetd->ipSecDeleteSecurityPolicy(0, addrFamily, direction, 0, 0, 0);
Benedict Wonga04ffa72018-05-09 21:42:42 -0700442 EXPECT_TRUE(status.isOk());
443 }
444 }
445 }
446}
447
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +0900448TEST_F(NetdBinderTest, XfrmDualSelectorTunnelModePoliciesV6) {
Benedict Wonga04ffa72018-05-09 21:42:42 -0700449 binder::Status status;
450
451 // Repeat to ensure cleanup and recreation works correctly
452 for (int i = 0; i < 2; i++) {
453 for (int direction : XFRM_DIRECTIONS) {
454 for (int addrFamily : ADDRESS_FAMILIES) {
455 status = mNetd->ipSecAddSecurityPolicy(0, addrFamily, direction, "2001:db8::f00d",
Benedict Wonga450e722018-05-07 10:29:02 -0700456 "2001:db8::d00d", 123, 0, 0, 0);
Benedict Wonga04ffa72018-05-09 21:42:42 -0700457 EXPECT_TRUE(status.isOk())
458 << " family: " << addrFamily << " direction: " << direction;
459 }
460 }
461
462 // Cleanup
463 for (int direction : XFRM_DIRECTIONS) {
464 for (int addrFamily : ADDRESS_FAMILIES) {
Benedict Wonga450e722018-05-07 10:29:02 -0700465 status = mNetd->ipSecDeleteSecurityPolicy(0, addrFamily, direction, 0, 0, 0);
Benedict Wonga04ffa72018-05-09 21:42:42 -0700466 EXPECT_TRUE(status.isOk());
467 }
468 }
469 }
470}
471
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +0900472TEST_F(NetdBinderTest, XfrmControllerInit) {
Bernie Innocentia5161a02019-01-30 22:40:53 +0900473 android::netdutils::Status status;
Nathan Harold21299f72018-03-16 20:13:03 -0700474 status = XfrmController::Init();
475 SCOPED_TRACE(status);
Nathan Harold2deff322018-05-10 14:03:48 -0700476
477 // Older devices or devices with mismatched Kernel/User ABI cannot support the IPsec
478 // feature.
479 if (status.code() == EOPNOTSUPP) return;
480
Nathan Harold21299f72018-03-16 20:13:03 -0700481 ASSERT_TRUE(status.ok());
482
483 int32_t spi = 0;
484
485 ASSERT_TRUE(allocateIpSecResources(true, &spi));
486 ASSERT_TRUE(allocateIpSecResources(false, &spi));
487
488 status = XfrmController::Init();
Nathan Harold39ad6622018-04-25 12:56:56 -0700489 ASSERT_TRUE(status.ok());
Nathan Harold21299f72018-03-16 20:13:03 -0700490 ASSERT_TRUE(allocateIpSecResources(true, &spi));
491
492 // Clean up
Benedict Wonga450e722018-05-07 10:29:02 -0700493 status = XfrmController::ipSecDeleteSecurityAssociation(0, "::", "::1", 123, spi, 0, 0);
Nathan Harold21299f72018-03-16 20:13:03 -0700494 SCOPED_TRACE(status);
495 ASSERT_TRUE(status.ok());
496
Benedict Wonga450e722018-05-07 10:29:02 -0700497 status = XfrmController::ipSecDeleteSecurityPolicy(0, AF_INET6, 0, 0, 0, 0);
Nathan Harold21299f72018-03-16 20:13:03 -0700498 SCOPED_TRACE(status);
499 ASSERT_TRUE(status.ok());
500
501 // Remove Virtual Tunnel Interface.
Benedict Wong319f17e2018-05-15 17:06:44 -0700502 ASSERT_TRUE(XfrmController::ipSecRemoveTunnelInterface("ipsec_test").ok());
Nathan Harold21299f72018-03-16 20:13:03 -0700503}
Bernie Innocentia5161a02019-01-30 22:40:53 +0900504
505#endif // INTPTR_MAX != INT32_MAX
Nathan Harold21299f72018-03-16 20:13:03 -0700506
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900507static int bandwidthDataSaverEnabled(const char *binary) {
Lorenzo Colitti464eabe2016-03-25 13:38:19 +0900508 std::vector<std::string> lines = listIptablesRule(binary, "bw_data_saver");
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900509
510 // Output looks like this:
511 //
Lorenzo Colitti464eabe2016-03-25 13:38:19 +0900512 // Chain bw_data_saver (1 references)
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900513 // target prot opt source destination
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900514 // RETURN all -- 0.0.0.0/0 0.0.0.0/0
Lorenzo Colittiaff28792017-09-26 17:46:18 +0900515 //
516 // or:
517 //
518 // Chain bw_data_saver (1 references)
519 // target prot opt source destination
520 // ... possibly connectivity critical packet rules here ...
521 // REJECT all -- ::/0 ::/0
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900522
Lorenzo Colittiaff28792017-09-26 17:46:18 +0900523 EXPECT_GE(lines.size(), 3U);
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900524
Lorenzo Colittiaff28792017-09-26 17:46:18 +0900525 if (lines.size() == 3 && StartsWith(lines[2], "RETURN ")) {
526 // Data saver disabled.
527 return 0;
528 }
529
530 size_t minSize = (std::string(binary) == IPTABLES_PATH) ? 3 : 9;
531
532 if (lines.size() >= minSize && StartsWith(lines[lines.size() -1], "REJECT ")) {
533 // Data saver enabled.
534 return 1;
535 }
536
537 return -1;
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900538}
539
540bool enableDataSaver(sp<INetd>& netd, bool enable) {
541 TimedOperation op(enable ? " Enabling data saver" : "Disabling data saver");
542 bool ret;
543 netd->bandwidthEnableDataSaver(enable, &ret);
544 return ret;
545}
546
547int getDataSaverState() {
548 const int enabled4 = bandwidthDataSaverEnabled(IPTABLES_PATH);
549 const int enabled6 = bandwidthDataSaverEnabled(IP6TABLES_PATH);
550 EXPECT_EQ(enabled4, enabled6);
551 EXPECT_NE(-1, enabled4);
552 EXPECT_NE(-1, enabled6);
553 if (enabled4 != enabled6 || (enabled6 != 0 && enabled6 != 1)) {
554 return -1;
555 }
556 return enabled6;
557}
558
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +0900559TEST_F(NetdBinderTest, BandwidthEnableDataSaver) {
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900560 const int wasEnabled = getDataSaverState();
561 ASSERT_NE(-1, wasEnabled);
562
563 if (wasEnabled) {
564 ASSERT_TRUE(enableDataSaver(mNetd, false));
565 EXPECT_EQ(0, getDataSaverState());
566 }
567
568 ASSERT_TRUE(enableDataSaver(mNetd, false));
569 EXPECT_EQ(0, getDataSaverState());
570
571 ASSERT_TRUE(enableDataSaver(mNetd, true));
572 EXPECT_EQ(1, getDataSaverState());
573
574 ASSERT_TRUE(enableDataSaver(mNetd, true));
575 EXPECT_EQ(1, getDataSaverState());
576
577 if (!wasEnabled) {
578 ASSERT_TRUE(enableDataSaver(mNetd, false));
579 EXPECT_EQ(0, getDataSaverState());
580 }
581}
Robin Leeb8087362016-03-30 18:43:08 +0100582
Luke Huang94658ac2018-10-18 19:35:12 +0900583static bool ipRuleExistsForRange(const uint32_t priority, const UidRangeParcel& range,
Ken Chen4ea88462021-05-23 14:56:43 +0800584 const std::string& action, const char* ipVersion,
585 const char* oif) {
Robin Leeb8087362016-03-30 18:43:08 +0100586 // Output looks like this:
Ken Chen4ea88462021-05-23 14:56:43 +0800587 // "<priority>:\tfrom all iif lo oif netdc0ca6 uidrange 500000-500000 lookup netdc0ca6"
Ken Chen7099e2e2021-02-08 00:57:47 +0800588 // "<priority>:\tfrom all fwmark 0x0/0x20000 iif lo uidrange 1000-2000 prohibit"
Robin Leeb8087362016-03-30 18:43:08 +0100589 std::vector<std::string> rules = listIpRules(ipVersion);
590
591 std::string prefix = StringPrintf("%" PRIu32 ":", priority);
Ken Chen4ea88462021-05-23 14:56:43 +0800592 std::string suffix;
593 if (oif) {
594 suffix = StringPrintf(" iif lo oif %s uidrange %d-%d %s\n", oif, range.start, range.stop,
595 action.c_str());
596 } else {
597 suffix = StringPrintf(" iif lo uidrange %d-%d %s\n", range.start, range.stop,
598 action.c_str());
599 }
Bernie Innocentif6918262018-06-11 17:37:35 +0900600 for (const auto& line : rules) {
Elliott Hughes2f445082017-12-20 12:39:35 -0800601 if (android::base::StartsWith(line, prefix) && android::base::EndsWith(line, suffix)) {
Robin Leeb8087362016-03-30 18:43:08 +0100602 return true;
603 }
604 }
605 return false;
606}
607
Ken Chen4ea88462021-05-23 14:56:43 +0800608// Overloads function with oif parameter for VPN rules compare.
Luke Huang94658ac2018-10-18 19:35:12 +0900609static bool ipRuleExistsForRange(const uint32_t priority, const UidRangeParcel& range,
Ken Chen4ea88462021-05-23 14:56:43 +0800610 const std::string& action, const char* oif) {
611 bool existsIp4 = ipRuleExistsForRange(priority, range, action, IP_RULE_V4, oif);
612 bool existsIp6 = ipRuleExistsForRange(priority, range, action, IP_RULE_V6, oif);
Robin Leeb8087362016-03-30 18:43:08 +0100613 EXPECT_EQ(existsIp4, existsIp6);
614 return existsIp4;
615}
616
Ken Chen4ea88462021-05-23 14:56:43 +0800617static bool ipRuleExistsForRange(const uint32_t priority, const UidRangeParcel& range,
618 const std::string& action) {
619 return ipRuleExistsForRange(priority, range, action, nullptr);
620}
621
Luke Huang94658ac2018-10-18 19:35:12 +0900622namespace {
623
624UidRangeParcel makeUidRangeParcel(int start, int stop) {
625 UidRangeParcel res;
626 res.start = start;
627 res.stop = stop;
628
629 return res;
630}
631
Ken Chena43e7ce2021-07-08 17:09:42 +0800632UidRangeParcel makeUidRangeParcel(int uid) {
633 return makeUidRangeParcel(uid, uid);
634}
635
636NativeUidRangeConfig makeNativeUidRangeConfig(unsigned netId, std::vector<UidRangeParcel> uidRanges,
Ken Chen53360bf2021-12-10 02:41:05 +0800637 int32_t subPriority) {
Ken Chen4ea88462021-05-23 14:56:43 +0800638 NativeUidRangeConfig res;
639 res.netId = netId;
Ken Chena43e7ce2021-07-08 17:09:42 +0800640 res.uidRanges = move(uidRanges);
Ken Chen4ea88462021-05-23 14:56:43 +0800641 res.subPriority = subPriority;
642
643 return res;
644}
645
Luke Huang94658ac2018-10-18 19:35:12 +0900646} // namespace
647
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +0900648TEST_F(NetdBinderTest, NetworkInterfaces) {
Ken Chenab5f3472021-04-04 11:28:06 +0800649 auto config = makeNativeNetworkConfig(TEST_NETID1, NativeNetworkType::PHYSICAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +0800650 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +0800651 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
652 EXPECT_EQ(EEXIST, mNetd->networkCreate(config).serviceSpecificErrorCode());
653
654 config.networkType = NativeNetworkType::VIRTUAL;
655 config.secure = true;
656 EXPECT_EQ(EEXIST, mNetd->networkCreate(config).serviceSpecificErrorCode());
657
658 config.netId = TEST_NETID2;
659 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900660
661 EXPECT_TRUE(mNetd->networkAddInterface(TEST_NETID1, sTun.name()).isOk());
662 EXPECT_EQ(EBUSY,
663 mNetd->networkAddInterface(TEST_NETID2, sTun.name()).serviceSpecificErrorCode());
664
665 EXPECT_TRUE(mNetd->networkDestroy(TEST_NETID1).isOk());
666 EXPECT_TRUE(mNetd->networkAddInterface(TEST_NETID2, sTun.name()).isOk());
667 EXPECT_TRUE(mNetd->networkDestroy(TEST_NETID2).isOk());
Luke Huangb670d162018-08-23 20:01:13 +0800668 EXPECT_EQ(ENONET, mNetd->networkDestroy(TEST_NETID1).serviceSpecificErrorCode());
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900669}
670
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +0900671TEST_F(NetdBinderTest, NetworkUidRules) {
Ken Chenab5f3472021-04-04 11:28:06 +0800672 auto config = makeNativeNetworkConfig(TEST_NETID1, NativeNetworkType::VIRTUAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +0800673 INetd::PERMISSION_NONE, true, false);
Ken Chenab5f3472021-04-04 11:28:06 +0800674 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
675 EXPECT_EQ(EEXIST, mNetd->networkCreate(config).serviceSpecificErrorCode());
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900676 EXPECT_TRUE(mNetd->networkAddInterface(TEST_NETID1, sTun.name()).isOk());
677
Luke Huang94658ac2018-10-18 19:35:12 +0900678 std::vector<UidRangeParcel> uidRanges = {makeUidRangeParcel(BASE_UID + 8005, BASE_UID + 8012),
679 makeUidRangeParcel(BASE_UID + 8090, BASE_UID + 8099)};
680 UidRangeParcel otherRange = makeUidRangeParcel(BASE_UID + 8190, BASE_UID + 8299);
Ken Chen8738e1c2020-11-24 11:38:54 +0800681 std::string action = StringPrintf("lookup %s ", sTun.name().c_str());
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900682
683 EXPECT_TRUE(mNetd->networkAddUidRanges(TEST_NETID1, uidRanges).isOk());
684
Ken Chen8738e1c2020-11-24 11:38:54 +0800685 EXPECT_TRUE(ipRuleExistsForRange(RULE_PRIORITY_SECURE_VPN, uidRanges[0], action));
686 EXPECT_FALSE(ipRuleExistsForRange(RULE_PRIORITY_SECURE_VPN, otherRange, action));
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900687 EXPECT_TRUE(mNetd->networkRemoveUidRanges(TEST_NETID1, uidRanges).isOk());
Ken Chen8738e1c2020-11-24 11:38:54 +0800688 EXPECT_FALSE(ipRuleExistsForRange(RULE_PRIORITY_SECURE_VPN, uidRanges[0], action));
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900689
690 EXPECT_TRUE(mNetd->networkAddUidRanges(TEST_NETID1, uidRanges).isOk());
Ken Chen8738e1c2020-11-24 11:38:54 +0800691 EXPECT_TRUE(ipRuleExistsForRange(RULE_PRIORITY_SECURE_VPN, uidRanges[1], action));
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900692 EXPECT_TRUE(mNetd->networkDestroy(TEST_NETID1).isOk());
Ken Chen8738e1c2020-11-24 11:38:54 +0800693 EXPECT_FALSE(ipRuleExistsForRange(RULE_PRIORITY_SECURE_VPN, uidRanges[1], action));
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900694
695 EXPECT_EQ(ENONET, mNetd->networkDestroy(TEST_NETID1).serviceSpecificErrorCode());
696}
697
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +0900698TEST_F(NetdBinderTest, NetworkRejectNonSecureVpn) {
Luke Huang94658ac2018-10-18 19:35:12 +0900699 std::vector<UidRangeParcel> uidRanges = {makeUidRangeParcel(BASE_UID + 150, BASE_UID + 224),
700 makeUidRangeParcel(BASE_UID + 226, BASE_UID + 300)};
Luke Huang841f3ef2019-05-30 15:09:19 +0800701 // Make sure no rules existed before calling commands.
702 for (auto const& range : uidRanges) {
Ken Chen7099e2e2021-02-08 00:57:47 +0800703 EXPECT_FALSE(ipRuleExistsForRange(RULE_PRIORITY_PROHIBIT_NON_VPN, range, "prohibit"));
Luke Huang841f3ef2019-05-30 15:09:19 +0800704 }
Robin Leeb8087362016-03-30 18:43:08 +0100705 // Create two valid rules.
706 ASSERT_TRUE(mNetd->networkRejectNonSecureVpn(true, uidRanges).isOk());
Robin Leeb8087362016-03-30 18:43:08 +0100707 for (auto const& range : uidRanges) {
Ken Chen7099e2e2021-02-08 00:57:47 +0800708 EXPECT_TRUE(ipRuleExistsForRange(RULE_PRIORITY_PROHIBIT_NON_VPN, range, "prohibit"));
Robin Leeb8087362016-03-30 18:43:08 +0100709 }
710
711 // Remove the rules.
712 ASSERT_TRUE(mNetd->networkRejectNonSecureVpn(false, uidRanges).isOk());
Robin Leeb8087362016-03-30 18:43:08 +0100713 for (auto const& range : uidRanges) {
Ken Chen7099e2e2021-02-08 00:57:47 +0800714 EXPECT_FALSE(ipRuleExistsForRange(RULE_PRIORITY_PROHIBIT_NON_VPN, range, "prohibit"));
Robin Leeb8087362016-03-30 18:43:08 +0100715 }
716
717 // Fail to remove the rules a second time after they are already deleted.
718 binder::Status status = mNetd->networkRejectNonSecureVpn(false, uidRanges);
719 ASSERT_EQ(binder::Status::EX_SERVICE_SPECIFIC, status.exceptionCode());
720 EXPECT_EQ(ENOENT, status.serviceSpecificErrorCode());
Robin Leeb8087362016-03-30 18:43:08 +0100721}
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900722
Lorenzo Colitti755faa92016-07-27 22:10:49 +0900723// Create a socket pair that isLoopbackSocket won't think is local.
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +0900724void NetdBinderTest::fakeRemoteSocketPair(unique_fd* clientSocket, unique_fd* serverSocket,
725 unique_fd* acceptedSocket) {
Bernie Innocentid26a04a2019-10-30 17:15:15 +0900726 serverSocket->reset(socket(AF_INET6, SOCK_STREAM | SOCK_CLOEXEC, 0));
Lorenzo Colitti1e299c62017-02-27 17:16:10 +0900727 struct sockaddr_in6 server6 = { .sin6_family = AF_INET6, .sin6_addr = sTun.dstAddr() };
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900728 ASSERT_EQ(0, bind(*serverSocket, (struct sockaddr *) &server6, sizeof(server6)));
729
730 socklen_t addrlen = sizeof(server6);
731 ASSERT_EQ(0, getsockname(*serverSocket, (struct sockaddr *) &server6, &addrlen));
732 ASSERT_EQ(0, listen(*serverSocket, 10));
733
Bernie Innocentid26a04a2019-10-30 17:15:15 +0900734 clientSocket->reset(socket(AF_INET6, SOCK_STREAM | SOCK_CLOEXEC, 0));
Lorenzo Colitti1e299c62017-02-27 17:16:10 +0900735 struct sockaddr_in6 client6 = { .sin6_family = AF_INET6, .sin6_addr = sTun.srcAddr() };
Lorenzo Colitti755faa92016-07-27 22:10:49 +0900736 ASSERT_EQ(0, bind(*clientSocket, (struct sockaddr *) &client6, sizeof(client6)));
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900737 ASSERT_EQ(0, connect(*clientSocket, (struct sockaddr *) &server6, sizeof(server6)));
738 ASSERT_EQ(0, getsockname(*clientSocket, (struct sockaddr *) &client6, &addrlen));
739
Bernie Innocentid26a04a2019-10-30 17:15:15 +0900740 acceptedSocket->reset(
741 accept4(*serverSocket, (struct sockaddr*)&server6, &addrlen, SOCK_CLOEXEC));
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900742 ASSERT_NE(-1, *acceptedSocket);
743
744 ASSERT_EQ(0, memcmp(&client6, &server6, sizeof(client6)));
745}
746
747void checkSocketpairOpen(int clientSocket, int acceptedSocket) {
748 char buf[4096];
749 EXPECT_EQ(4, write(clientSocket, "foo", sizeof("foo")));
750 EXPECT_EQ(4, read(acceptedSocket, buf, sizeof(buf)));
751 EXPECT_EQ(0, memcmp(buf, "foo", sizeof("foo")));
752}
753
754void checkSocketpairClosed(int clientSocket, int acceptedSocket) {
755 // Check that the client socket was closed with ECONNABORTED.
756 int ret = write(clientSocket, "foo", sizeof("foo"));
757 int err = errno;
758 EXPECT_EQ(-1, ret);
759 EXPECT_EQ(ECONNABORTED, err);
760
761 // Check that it sent a RST to the server.
762 ret = write(acceptedSocket, "foo", sizeof("foo"));
763 err = errno;
764 EXPECT_EQ(-1, ret);
765 EXPECT_EQ(ECONNRESET, err);
766}
767
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +0900768TEST_F(NetdBinderTest, SocketDestroy) {
Bernie Innocentid26a04a2019-10-30 17:15:15 +0900769 unique_fd clientSocket, serverSocket, acceptedSocket;
Lorenzo Colitti755faa92016-07-27 22:10:49 +0900770 ASSERT_NO_FATAL_FAILURE(fakeRemoteSocketPair(&clientSocket, &serverSocket, &acceptedSocket));
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900771
772 // Pick a random UID in the system UID range.
773 constexpr int baseUid = AID_APP - 2000;
774 static_assert(baseUid > 0, "Not enough UIDs? Please fix this test.");
775 int uid = baseUid + 500 + arc4random_uniform(1000);
776 EXPECT_EQ(0, fchown(clientSocket, uid, -1));
777
778 // UID ranges that don't contain uid.
Luke Huang94658ac2018-10-18 19:35:12 +0900779 std::vector<UidRangeParcel> uidRanges = {
780 makeUidRangeParcel(baseUid + 42, baseUid + 449),
781 makeUidRangeParcel(baseUid + 1536, AID_APP - 4),
782 makeUidRangeParcel(baseUid + 498, uid - 1),
783 makeUidRangeParcel(uid + 1, baseUid + 1520),
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900784 };
785 // A skip list that doesn't contain UID.
786 std::vector<int32_t> skipUids { baseUid + 123, baseUid + 1600 };
787
788 // Close sockets. Our test socket should be intact.
789 EXPECT_TRUE(mNetd->socketDestroy(uidRanges, skipUids).isOk());
790 checkSocketpairOpen(clientSocket, acceptedSocket);
791
792 // UID ranges that do contain uid.
793 uidRanges = {
Luke Huang94658ac2018-10-18 19:35:12 +0900794 makeUidRangeParcel(baseUid + 42, baseUid + 449),
795 makeUidRangeParcel(baseUid + 1536, AID_APP - 4),
796 makeUidRangeParcel(baseUid + 498, baseUid + 1520),
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900797 };
798 // Add uid to the skip list.
799 skipUids.push_back(uid);
800
801 // Close sockets. Our test socket should still be intact because it's in the skip list.
802 EXPECT_TRUE(mNetd->socketDestroy(uidRanges, skipUids).isOk());
803 checkSocketpairOpen(clientSocket, acceptedSocket);
804
805 // Now remove uid from skipUids, and close sockets. Our test socket should have been closed.
806 skipUids.resize(skipUids.size() - 1);
807 EXPECT_TRUE(mNetd->socketDestroy(uidRanges, skipUids).isOk());
808 checkSocketpairClosed(clientSocket, acceptedSocket);
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900809}
Erik Klinecc4f2732016-08-03 11:24:27 +0900810
Lorenzo Colitticaccab42021-06-17 12:16:37 +0900811TEST_F(NetdBinderTest, SocketDestroyLinkLocal) {
812 // Add the same link-local address to two interfaces.
813 const char* kLinkLocalAddress = "fe80::ace:d00d";
814
815 const struct addrinfo hints = {
816 .ai_family = AF_INET6,
817 .ai_socktype = SOCK_STREAM,
818 .ai_flags = AI_NUMERICHOST,
819 };
820
821 binder::Status status = mNetd->interfaceAddAddress(sTun.name(), kLinkLocalAddress, 64);
822 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
823 status = mNetd->interfaceAddAddress(sTun2.name(), kLinkLocalAddress, 64);
824 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
825
826 // Bind a listening socket to the address on each of two interfaces.
827 // The sockets must be open at the same time, because this test checks that SOCK_DESTROY only
828 // destroys the sockets on the interface where the address is deleted.
829 struct addrinfo* addrinfoList = nullptr;
830 int ret = getaddrinfo(kLinkLocalAddress, nullptr, &hints, &addrinfoList);
831 ScopedAddrinfo addrinfoCleanup(addrinfoList);
832 ASSERT_EQ(0, ret);
833
834 socklen_t len = addrinfoList[0].ai_addrlen;
835 sockaddr_in6 sin6_1 = *reinterpret_cast<sockaddr_in6*>(addrinfoList[0].ai_addr);
836 sockaddr_in6 sin6_2 = sin6_1;
837 sin6_1.sin6_scope_id = if_nametoindex(sTun.name().c_str());
838 sin6_2.sin6_scope_id = if_nametoindex(sTun2.name().c_str());
839
Lorenzo Colitti582b0242021-06-17 23:19:22 +0900840 int s1 = socket(AF_INET6, SOCK_STREAM | SOCK_NONBLOCK, 0);
Lorenzo Colitticaccab42021-06-17 12:16:37 +0900841 ASSERT_EQ(0, bind(s1, reinterpret_cast<sockaddr*>(&sin6_1), len));
842 ASSERT_EQ(0, getsockname(s1, reinterpret_cast<sockaddr*>(&sin6_1), &len));
Lorenzo Colitti582b0242021-06-17 23:19:22 +0900843 // getsockname technically writes to len, but sizeof(sockaddr_in6) doesn't change.
Lorenzo Colitticaccab42021-06-17 12:16:37 +0900844
Lorenzo Colitti582b0242021-06-17 23:19:22 +0900845 int s2 = socket(AF_INET6, SOCK_STREAM | SOCK_NONBLOCK, 0);
Lorenzo Colitticaccab42021-06-17 12:16:37 +0900846 ASSERT_EQ(0, bind(s2, reinterpret_cast<sockaddr*>(&sin6_2), len));
847 ASSERT_EQ(0, getsockname(s2, reinterpret_cast<sockaddr*>(&sin6_2), &len));
848
849 ASSERT_EQ(0, listen(s1, 10));
850 ASSERT_EQ(0, listen(s2, 10));
851
852 // Connect one client socket to each and accept the connections.
853 int c1 = socket(AF_INET6, SOCK_STREAM, 0);
854 int c2 = socket(AF_INET6, SOCK_STREAM, 0);
855 ASSERT_EQ(0, connect(c1, reinterpret_cast<sockaddr*>(&sin6_1), len));
856 ASSERT_EQ(0, connect(c2, reinterpret_cast<sockaddr*>(&sin6_2), len));
857 int a1 = accept(s1, nullptr, 0);
858 ASSERT_NE(-1, a1);
859 int a2 = accept(s2, nullptr, 0);
860 ASSERT_NE(-1, a2);
861
862 // Delete the address on sTun2.
863 status = mNetd->interfaceDelAddress(sTun2.name(), kLinkLocalAddress, 64);
864 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
865
Lorenzo Colitti582b0242021-06-17 23:19:22 +0900866 // The client sockets on sTun2 are closed, but the ones on sTun1 remain open.
Lorenzo Colitticaccab42021-06-17 12:16:37 +0900867 char buf[1024];
868 EXPECT_EQ(-1, read(c2, buf, sizeof(buf)));
869 EXPECT_EQ(ECONNABORTED, errno);
870 // The blocking read above ensures that SOCK_DESTROY has completed.
871
872 EXPECT_EQ(3, write(a1, "foo", 3));
873 EXPECT_EQ(3, read(c1, buf, sizeof(buf)));
874 EXPECT_EQ(-1, write(a2, "foo", 3));
875 EXPECT_TRUE(errno == ECONNABORTED || errno == ECONNRESET);
Lorenzo Colitti582b0242021-06-17 23:19:22 +0900876
877 // Check the server sockets too.
878 EXPECT_EQ(-1, accept(s1, nullptr, 0));
879 EXPECT_EQ(EAGAIN, errno);
880 EXPECT_EQ(-1, accept(s2, nullptr, 0));
881 EXPECT_EQ(EINVAL, errno);
Lorenzo Colitticaccab42021-06-17 12:16:37 +0900882}
883
Erik Klinecc4f2732016-08-03 11:24:27 +0900884namespace {
885
886int netmaskToPrefixLength(const uint8_t *buf, size_t buflen) {
887 if (buf == nullptr) return -1;
888
889 int prefixLength = 0;
890 bool endOfContiguousBits = false;
891 for (unsigned int i = 0; i < buflen; i++) {
892 const uint8_t value = buf[i];
893
894 // Bad bit sequence: check for a contiguous set of bits from the high
895 // end by verifying that the inverted value + 1 is a power of 2
896 // (power of 2 iff. (v & (v - 1)) == 0).
897 const uint8_t inverse = ~value + 1;
898 if ((inverse & (inverse - 1)) != 0) return -1;
899
900 prefixLength += (value == 0) ? 0 : CHAR_BIT - ffs(value) + 1;
901
902 // Bogus netmask.
903 if (endOfContiguousBits && value != 0) return -1;
904
905 if (value != 0xff) endOfContiguousBits = true;
906 }
907
908 return prefixLength;
909}
910
911template<typename T>
912int netmaskToPrefixLength(const T *p) {
913 return netmaskToPrefixLength(reinterpret_cast<const uint8_t*>(p), sizeof(T));
914}
915
916
917static bool interfaceHasAddress(
918 const std::string &ifname, const char *addrString, int prefixLength) {
919 struct addrinfo *addrinfoList = nullptr;
Erik Klinecc4f2732016-08-03 11:24:27 +0900920
921 const struct addrinfo hints = {
922 .ai_flags = AI_NUMERICHOST,
923 .ai_family = AF_UNSPEC,
924 .ai_socktype = SOCK_DGRAM,
925 };
926 if (getaddrinfo(addrString, nullptr, &hints, &addrinfoList) != 0 ||
927 addrinfoList == nullptr || addrinfoList->ai_addr == nullptr) {
928 return false;
929 }
Bernie Innocenti9bf749f2018-08-30 08:37:22 +0900930 ScopedAddrinfo addrinfoCleanup(addrinfoList);
Erik Klinecc4f2732016-08-03 11:24:27 +0900931
932 struct ifaddrs *ifaddrsList = nullptr;
933 ScopedIfaddrs ifaddrsCleanup(ifaddrsList);
934
935 if (getifaddrs(&ifaddrsList) != 0) {
936 return false;
937 }
938
939 for (struct ifaddrs *addr = ifaddrsList; addr != nullptr; addr = addr->ifa_next) {
940 if (std::string(addr->ifa_name) != ifname ||
941 addr->ifa_addr == nullptr ||
942 addr->ifa_addr->sa_family != addrinfoList->ai_addr->sa_family) {
943 continue;
944 }
945
946 switch (addr->ifa_addr->sa_family) {
947 case AF_INET: {
948 auto *addr4 = reinterpret_cast<const struct sockaddr_in*>(addr->ifa_addr);
949 auto *want = reinterpret_cast<const struct sockaddr_in*>(addrinfoList->ai_addr);
950 if (memcmp(&addr4->sin_addr, &want->sin_addr, sizeof(want->sin_addr)) != 0) {
951 continue;
952 }
953
954 if (prefixLength < 0) return true; // not checking prefix lengths
955
956 if (addr->ifa_netmask == nullptr) return false;
957 auto *nm = reinterpret_cast<const struct sockaddr_in*>(addr->ifa_netmask);
958 EXPECT_EQ(prefixLength, netmaskToPrefixLength(&nm->sin_addr));
959 return (prefixLength == netmaskToPrefixLength(&nm->sin_addr));
960 }
961 case AF_INET6: {
962 auto *addr6 = reinterpret_cast<const struct sockaddr_in6*>(addr->ifa_addr);
963 auto *want = reinterpret_cast<const struct sockaddr_in6*>(addrinfoList->ai_addr);
964 if (memcmp(&addr6->sin6_addr, &want->sin6_addr, sizeof(want->sin6_addr)) != 0) {
965 continue;
966 }
967
968 if (prefixLength < 0) return true; // not checking prefix lengths
969
970 if (addr->ifa_netmask == nullptr) return false;
971 auto *nm = reinterpret_cast<const struct sockaddr_in6*>(addr->ifa_netmask);
972 EXPECT_EQ(prefixLength, netmaskToPrefixLength(&nm->sin6_addr));
973 return (prefixLength == netmaskToPrefixLength(&nm->sin6_addr));
974 }
975 default:
976 // Cannot happen because we have already screened for matching
977 // address families at the top of each iteration.
978 continue;
979 }
980 }
981
982 return false;
983}
984
985} // namespace
986
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +0900987TEST_F(NetdBinderTest, InterfaceAddRemoveAddress) {
Erik Klinecc4f2732016-08-03 11:24:27 +0900988 static const struct TestData {
989 const char *addrString;
990 const int prefixLength;
Lorenzo Colitti01118982019-12-02 13:19:44 +0900991 const int expectAddResult;
992 const int expectRemoveResult;
Erik Klinecc4f2732016-08-03 11:24:27 +0900993 } kTestData[] = {
Lorenzo Colitti01118982019-12-02 13:19:44 +0900994 {"192.0.2.1", 24, 0, 0},
995 {"192.0.2.2", 25, 0, 0},
996 {"192.0.2.3", 32, 0, 0},
997 {"192.0.2.4", 33, EINVAL, EADDRNOTAVAIL},
998 {"192.not.an.ip", 24, EINVAL, EINVAL},
999 {"2001:db8::1", 64, 0, 0},
1000 {"2001:db8::2", 65, 0, 0},
1001 {"2001:db8::3", 128, 0, 0},
Lorenzo Colitticaccab42021-06-17 12:16:37 +09001002 {"fe80::1234", 64, 0, 0},
Lorenzo Colitti01118982019-12-02 13:19:44 +09001003 {"2001:db8::4", 129, EINVAL, EINVAL},
1004 {"foo:bar::bad", 64, EINVAL, EINVAL},
1005 {"2001:db8::1/64", 64, EINVAL, EINVAL},
Erik Klinecc4f2732016-08-03 11:24:27 +09001006 };
1007
Sehee Park8659b8d2018-11-16 10:53:16 +09001008 for (size_t i = 0; i < std::size(kTestData); i++) {
Erik Klinecc4f2732016-08-03 11:24:27 +09001009 const auto &td = kTestData[i];
1010
Lorenzo Colitti01118982019-12-02 13:19:44 +09001011 SCOPED_TRACE(String8::format("Offending IP address %s/%d", td.addrString, td.prefixLength));
1012
Erik Klinecc4f2732016-08-03 11:24:27 +09001013 // [1.a] Add the address.
1014 binder::Status status = mNetd->interfaceAddAddress(
Lorenzo Colitti1e299c62017-02-27 17:16:10 +09001015 sTun.name(), td.addrString, td.prefixLength);
Lorenzo Colitti01118982019-12-02 13:19:44 +09001016 if (td.expectAddResult == 0) {
Erik Klinecc4f2732016-08-03 11:24:27 +09001017 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1018 } else {
1019 ASSERT_EQ(binder::Status::EX_SERVICE_SPECIFIC, status.exceptionCode());
Lorenzo Colitti01118982019-12-02 13:19:44 +09001020 ASSERT_EQ(td.expectAddResult, status.serviceSpecificErrorCode());
Erik Klinecc4f2732016-08-03 11:24:27 +09001021 }
1022
1023 // [1.b] Verify the addition meets the expectation.
Lorenzo Colitti01118982019-12-02 13:19:44 +09001024 if (td.expectAddResult == 0) {
Lorenzo Colitti1e299c62017-02-27 17:16:10 +09001025 EXPECT_TRUE(interfaceHasAddress(sTun.name(), td.addrString, td.prefixLength));
Erik Klinecc4f2732016-08-03 11:24:27 +09001026 } else {
Lorenzo Colitti1e299c62017-02-27 17:16:10 +09001027 EXPECT_FALSE(interfaceHasAddress(sTun.name(), td.addrString, -1));
Erik Klinecc4f2732016-08-03 11:24:27 +09001028 }
1029
1030 // [2.a] Try to remove the address. If it was not previously added, removing it fails.
Lorenzo Colitti1e299c62017-02-27 17:16:10 +09001031 status = mNetd->interfaceDelAddress(sTun.name(), td.addrString, td.prefixLength);
Lorenzo Colitti01118982019-12-02 13:19:44 +09001032 if (td.expectRemoveResult == 0) {
Erik Klinecc4f2732016-08-03 11:24:27 +09001033 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1034 } else {
1035 ASSERT_EQ(binder::Status::EX_SERVICE_SPECIFIC, status.exceptionCode());
Lorenzo Colitti01118982019-12-02 13:19:44 +09001036 ASSERT_EQ(td.expectRemoveResult, status.serviceSpecificErrorCode());
Erik Klinecc4f2732016-08-03 11:24:27 +09001037 }
1038
1039 // [2.b] No matter what, the address should not be present.
Lorenzo Colitti1e299c62017-02-27 17:16:10 +09001040 EXPECT_FALSE(interfaceHasAddress(sTun.name(), td.addrString, -1));
Erik Klinecc4f2732016-08-03 11:24:27 +09001041 }
Lorenzo Colitti9ae17712019-12-02 17:28:49 +09001042
1043 // Check that netlink errors are returned correctly.
1044 // We do this by attempting to create an IPv6 address on an interface that has IPv6 disabled,
1045 // which returns EACCES.
1046 TunInterface tun;
1047 ASSERT_EQ(0, tun.init());
1048 binder::Status status =
1049 mNetd->setProcSysNet(INetd::IPV6, INetd::CONF, tun.name(), "disable_ipv6", "1");
1050 ASSERT_TRUE(status.isOk()) << status.exceptionMessage();
1051 status = mNetd->interfaceAddAddress(tun.name(), "2001:db8::1", 64);
1052 EXPECT_EQ(binder::Status::EX_SERVICE_SPECIFIC, status.exceptionCode());
1053 EXPECT_EQ(EACCES, status.serviceSpecificErrorCode());
1054 tun.destroy();
Erik Klinecc4f2732016-08-03 11:24:27 +09001055}
Erik Kline55b06f82016-07-04 09:57:18 +09001056
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09001057TEST_F(NetdBinderTest, GetProcSysNet) {
Evgenii Stepanov803aff32021-05-01 23:57:27 -07001058 const char* LOOPBACK = "lo";
Erik Kline38e51f12018-09-06 20:14:44 +09001059 static const struct {
1060 const int ipversion;
Erik Kline55b06f82016-07-04 09:57:18 +09001061 const int which;
Erik Kline38e51f12018-09-06 20:14:44 +09001062 const char* ifname;
1063 const char* parameter;
1064 const char* expectedValue;
Erik Kline55b06f82016-07-04 09:57:18 +09001065 const int expectedReturnCode;
1066 } kTestData[] = {
Erik Kline38e51f12018-09-06 20:14:44 +09001067 {INetd::IPV4, INetd::CONF, LOOPBACK, "arp_ignore", "0", 0},
1068 {-1, INetd::CONF, sTun.name().c_str(), "arp_ignore", nullptr, EAFNOSUPPORT},
1069 {INetd::IPV4, -1, sTun.name().c_str(), "arp_ignore", nullptr, EINVAL},
1070 {INetd::IPV4, INetd::CONF, "..", "conf/lo/arp_ignore", nullptr, EINVAL},
1071 {INetd::IPV4, INetd::CONF, ".", "lo/arp_ignore", nullptr, EINVAL},
1072 {INetd::IPV4, INetd::CONF, sTun.name().c_str(), "../all/arp_ignore", nullptr, EINVAL},
1073 {INetd::IPV6, INetd::NEIGH, LOOPBACK, "ucast_solicit", "3", 0},
Erik Kline55b06f82016-07-04 09:57:18 +09001074 };
1075
Sehee Park8659b8d2018-11-16 10:53:16 +09001076 for (size_t i = 0; i < std::size(kTestData); i++) {
Erik Kline38e51f12018-09-06 20:14:44 +09001077 const auto& td = kTestData[i];
Erik Kline55b06f82016-07-04 09:57:18 +09001078
Erik Kline38e51f12018-09-06 20:14:44 +09001079 std::string value;
1080 const binder::Status status =
1081 mNetd->getProcSysNet(td.ipversion, td.which, td.ifname, td.parameter, &value);
1082
1083 if (td.expectedReturnCode == 0) {
Sehee Park8659b8d2018-11-16 10:53:16 +09001084 SCOPED_TRACE(String8::format("test case %zu should have passed", i));
Erik Kline38e51f12018-09-06 20:14:44 +09001085 EXPECT_EQ(0, status.exceptionCode());
1086 EXPECT_EQ(0, status.serviceSpecificErrorCode());
1087 EXPECT_EQ(td.expectedValue, value);
1088 } else {
Sehee Park8659b8d2018-11-16 10:53:16 +09001089 SCOPED_TRACE(String8::format("test case %zu should have failed", i));
Erik Kline38e51f12018-09-06 20:14:44 +09001090 EXPECT_EQ(binder::Status::EX_SERVICE_SPECIFIC, status.exceptionCode());
1091 EXPECT_EQ(td.expectedReturnCode, status.serviceSpecificErrorCode());
1092 }
1093 }
1094}
1095
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09001096TEST_F(NetdBinderTest, SetProcSysNet) {
Erik Kline38e51f12018-09-06 20:14:44 +09001097 static const struct {
1098 const int ipversion;
1099 const int which;
1100 const char* ifname;
1101 const char* parameter;
1102 const char* value;
1103 const int expectedReturnCode;
1104 } kTestData[] = {
1105 {INetd::IPV4, INetd::CONF, sTun.name().c_str(), "arp_ignore", "1", 0},
1106 {-1, INetd::CONF, sTun.name().c_str(), "arp_ignore", "1", EAFNOSUPPORT},
1107 {INetd::IPV4, -1, sTun.name().c_str(), "arp_ignore", "1", EINVAL},
1108 {INetd::IPV4, INetd::CONF, "..", "conf/lo/arp_ignore", "1", EINVAL},
1109 {INetd::IPV4, INetd::CONF, ".", "lo/arp_ignore", "1", EINVAL},
1110 {INetd::IPV4, INetd::CONF, sTun.name().c_str(), "../all/arp_ignore", "1", EINVAL},
1111 {INetd::IPV6, INetd::NEIGH, sTun.name().c_str(), "ucast_solicit", "7", 0},
1112 };
1113
Sehee Park8659b8d2018-11-16 10:53:16 +09001114 for (size_t i = 0; i < std::size(kTestData); i++) {
Erik Kline38e51f12018-09-06 20:14:44 +09001115 const auto& td = kTestData[i];
Erik Kline38e51f12018-09-06 20:14:44 +09001116 const binder::Status status =
1117 mNetd->setProcSysNet(td.ipversion, td.which, td.ifname, td.parameter, td.value);
Erik Kline55b06f82016-07-04 09:57:18 +09001118
1119 if (td.expectedReturnCode == 0) {
Sehee Park8659b8d2018-11-16 10:53:16 +09001120 SCOPED_TRACE(String8::format("test case %zu should have passed", i));
Erik Kline55b06f82016-07-04 09:57:18 +09001121 EXPECT_EQ(0, status.exceptionCode());
1122 EXPECT_EQ(0, status.serviceSpecificErrorCode());
1123 } else {
Sehee Park8659b8d2018-11-16 10:53:16 +09001124 SCOPED_TRACE(String8::format("test case %zu should have failed", i));
Erik Kline55b06f82016-07-04 09:57:18 +09001125 EXPECT_EQ(binder::Status::EX_SERVICE_SPECIFIC, status.exceptionCode());
1126 EXPECT_EQ(td.expectedReturnCode, status.serviceSpecificErrorCode());
1127 }
1128 }
1129}
Ben Schwartze7601812017-04-28 16:38:29 -04001130
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09001131TEST_F(NetdBinderTest, GetSetProcSysNet) {
Erik Kline38e51f12018-09-06 20:14:44 +09001132 const int ipversion = INetd::IPV6;
1133 const int category = INetd::NEIGH;
1134 const std::string& tun = sTun.name();
1135 const std::string parameter("ucast_solicit");
1136
1137 std::string value{};
1138 EXPECT_TRUE(mNetd->getProcSysNet(ipversion, category, tun, parameter, &value).isOk());
Maciej Żenczykowski7b789b92019-04-09 15:55:06 -07001139 ASSERT_FALSE(value.empty());
Erik Kline38e51f12018-09-06 20:14:44 +09001140 const int ival = std::stoi(value);
1141 EXPECT_GT(ival, 0);
1142 // Try doubling the parameter value (always best!).
1143 EXPECT_TRUE(mNetd->setProcSysNet(ipversion, category, tun, parameter, std::to_string(2 * ival))
1144 .isOk());
1145 EXPECT_TRUE(mNetd->getProcSysNet(ipversion, category, tun, parameter, &value).isOk());
1146 EXPECT_EQ(2 * ival, std::stoi(value));
1147 // Try resetting the parameter.
1148 EXPECT_TRUE(mNetd->setProcSysNet(ipversion, category, tun, parameter, std::to_string(ival))
1149 .isOk());
1150 EXPECT_TRUE(mNetd->getProcSysNet(ipversion, category, tun, parameter, &value).isOk());
1151 EXPECT_EQ(ival, std::stoi(value));
1152}
1153
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +09001154namespace {
1155
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +09001156void expectNoTestCounterRules() {
1157 for (const auto& binary : { IPTABLES_PATH, IP6TABLES_PATH }) {
1158 std::string command = StringPrintf("%s -w -nvL tetherctrl_counters", binary);
1159 std::string allRules = Join(runCommand(command), "\n");
1160 EXPECT_EQ(std::string::npos, allRules.find("netdtest_"));
1161 }
1162}
1163
Bernie Innocentif6918262018-06-11 17:37:35 +09001164void addTetherCounterValues(const char* path, const std::string& if1, const std::string& if2,
1165 int byte, int pkt) {
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +09001166 runCommand(StringPrintf("%s -w -A tetherctrl_counters -i %s -o %s -j RETURN -c %d %d",
1167 path, if1.c_str(), if2.c_str(), pkt, byte));
1168}
1169
Bernie Innocentif6918262018-06-11 17:37:35 +09001170void delTetherCounterValues(const char* path, const std::string& if1, const std::string& if2) {
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +09001171 runCommand(StringPrintf("%s -w -D tetherctrl_counters -i %s -o %s -j RETURN",
1172 path, if1.c_str(), if2.c_str()));
1173 runCommand(StringPrintf("%s -w -D tetherctrl_counters -i %s -o %s -j RETURN",
1174 path, if2.c_str(), if1.c_str()));
1175}
1176
Luke Huangcaebcbb2018-09-27 20:37:14 +08001177std::vector<int64_t> getStatsVectorByIf(const std::vector<TetherStatsParcel>& statsVec,
1178 const std::string& iface) {
1179 for (auto& stats : statsVec) {
1180 if (stats.iface == iface) {
1181 return {stats.rxBytes, stats.rxPackets, stats.txBytes, stats.txPackets};
1182 }
1183 }
1184 return {};
1185}
1186
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +09001187} // namespace
1188
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09001189TEST_F(NetdBinderTest, TetherGetStats) {
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +09001190 expectNoTestCounterRules();
1191
1192 // TODO: fold this into more comprehensive tests once we have binder RPCs for enabling and
1193 // disabling tethering. We don't check the return value because these commands will fail if
1194 // tethering is already enabled.
1195 runCommand(StringPrintf("%s -w -N tetherctrl_counters", IPTABLES_PATH));
1196 runCommand(StringPrintf("%s -w -N tetherctrl_counters", IP6TABLES_PATH));
1197
1198 std::string intIface1 = StringPrintf("netdtest_%u", arc4random_uniform(10000));
1199 std::string intIface2 = StringPrintf("netdtest_%u", arc4random_uniform(10000));
1200 std::string intIface3 = StringPrintf("netdtest_%u", arc4random_uniform(10000));
Luke Huang0f91cdc2019-05-29 17:55:51 +08001201
1202 // Ensure we won't use the same interface name, otherwise the test will fail.
1203 u_int32_t rNumber = arc4random_uniform(10000);
1204 std::string extIface1 = StringPrintf("netdtest_%u", rNumber);
1205 std::string extIface2 = StringPrintf("netdtest_%u", rNumber + 1);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +09001206
1207 addTetherCounterValues(IPTABLES_PATH, intIface1, extIface1, 123, 111);
1208 addTetherCounterValues(IP6TABLES_PATH, intIface1, extIface1, 456, 10);
1209 addTetherCounterValues(IPTABLES_PATH, extIface1, intIface1, 321, 222);
1210 addTetherCounterValues(IP6TABLES_PATH, extIface1, intIface1, 654, 20);
1211 // RX is from external to internal, and TX is from internal to external.
1212 // So rxBytes is 321 + 654 = 975, txBytes is 123 + 456 = 579, etc.
1213 std::vector<int64_t> expected1 = { 975, 242, 579, 121 };
1214
1215 addTetherCounterValues(IPTABLES_PATH, intIface2, extIface2, 1000, 333);
1216 addTetherCounterValues(IP6TABLES_PATH, intIface2, extIface2, 3000, 30);
1217
1218 addTetherCounterValues(IPTABLES_PATH, extIface2, intIface2, 2000, 444);
1219 addTetherCounterValues(IP6TABLES_PATH, extIface2, intIface2, 4000, 40);
1220
1221 addTetherCounterValues(IP6TABLES_PATH, intIface3, extIface2, 1000, 25);
1222 addTetherCounterValues(IP6TABLES_PATH, extIface2, intIface3, 2000, 35);
1223 std::vector<int64_t> expected2 = { 8000, 519, 5000, 388 };
1224
Luke Huangcaebcbb2018-09-27 20:37:14 +08001225 std::vector<TetherStatsParcel> statsVec;
1226 binder::Status status = mNetd->tetherGetStats(&statsVec);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +09001227 EXPECT_TRUE(status.isOk()) << "Getting tethering stats failed: " << status;
1228
Luke Huangcaebcbb2018-09-27 20:37:14 +08001229 EXPECT_EQ(expected1, getStatsVectorByIf(statsVec, extIface1));
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +09001230
Luke Huangcaebcbb2018-09-27 20:37:14 +08001231 EXPECT_EQ(expected2, getStatsVectorByIf(statsVec, extIface2));
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +09001232
1233 for (const auto& path : { IPTABLES_PATH, IP6TABLES_PATH }) {
1234 delTetherCounterValues(path, intIface1, extIface1);
1235 delTetherCounterValues(path, intIface2, extIface2);
1236 if (path == IP6TABLES_PATH) {
1237 delTetherCounterValues(path, intIface3, extIface2);
1238 }
1239 }
1240
1241 expectNoTestCounterRules();
1242}
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +09001243
Luke Huang0051a622018-07-23 20:30:16 +08001244namespace {
1245
Luke Huanga5211072018-08-01 23:36:29 +08001246constexpr char IDLETIMER_RAW_PREROUTING[] = "idletimer_raw_PREROUTING";
1247constexpr char IDLETIMER_MANGLE_POSTROUTING[] = "idletimer_mangle_POSTROUTING";
Luke Huang0051a622018-07-23 20:30:16 +08001248
1249static std::vector<std::string> listIptablesRuleByTable(const char* binary, const char* table,
1250 const char* chainName) {
1251 std::string command = StringPrintf("%s -t %s -w -n -v -L %s", binary, table, chainName);
1252 return runCommand(command);
1253}
1254
Luke Huang19b49c52018-10-22 12:12:05 +09001255// TODO: It is a duplicate function, need to remove it
Luke Huanga5211072018-08-01 23:36:29 +08001256bool iptablesIdleTimerInterfaceRuleExists(const char* binary, const char* chainName,
Luke Huang0051a622018-07-23 20:30:16 +08001257 const std::string& expectedInterface,
1258 const std::string& expectedRule, const char* table) {
1259 std::vector<std::string> rules = listIptablesRuleByTable(binary, table, chainName);
1260 for (const auto& rule : rules) {
1261 if (rule.find(expectedInterface) != std::string::npos) {
1262 if (rule.find(expectedRule) != std::string::npos) {
1263 return true;
1264 }
1265 }
1266 }
1267 return false;
1268}
1269
1270void expectIdletimerInterfaceRuleExists(const std::string& ifname, int timeout,
Luke Huanga5211072018-08-01 23:36:29 +08001271 const std::string& classLabel) {
Luke Huang0051a622018-07-23 20:30:16 +08001272 std::string IdletimerRule =
Maciej Żenczykowski09d64602021-03-23 15:50:32 -07001273 StringPrintf("timeout:%u label:%s send_nl_msg", timeout, classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +08001274 for (const auto& binary : {IPTABLES_PATH, IP6TABLES_PATH}) {
Luke Huanga5211072018-08-01 23:36:29 +08001275 EXPECT_TRUE(iptablesIdleTimerInterfaceRuleExists(binary, IDLETIMER_RAW_PREROUTING, ifname,
1276 IdletimerRule, RAW_TABLE));
1277 EXPECT_TRUE(iptablesIdleTimerInterfaceRuleExists(binary, IDLETIMER_MANGLE_POSTROUTING,
Luke Huang0051a622018-07-23 20:30:16 +08001278 ifname, IdletimerRule, MANGLE_TABLE));
1279 }
1280}
1281
1282void expectIdletimerInterfaceRuleNotExists(const std::string& ifname, int timeout,
Luke Huanga5211072018-08-01 23:36:29 +08001283 const std::string& classLabel) {
Luke Huang0051a622018-07-23 20:30:16 +08001284 std::string IdletimerRule =
Maciej Żenczykowski09d64602021-03-23 15:50:32 -07001285 StringPrintf("timeout:%u label:%s send_nl_msg", timeout, classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +08001286 for (const auto& binary : {IPTABLES_PATH, IP6TABLES_PATH}) {
Luke Huanga5211072018-08-01 23:36:29 +08001287 EXPECT_FALSE(iptablesIdleTimerInterfaceRuleExists(binary, IDLETIMER_RAW_PREROUTING, ifname,
1288 IdletimerRule, RAW_TABLE));
1289 EXPECT_FALSE(iptablesIdleTimerInterfaceRuleExists(binary, IDLETIMER_MANGLE_POSTROUTING,
Luke Huang0051a622018-07-23 20:30:16 +08001290 ifname, IdletimerRule, MANGLE_TABLE));
1291 }
1292}
1293
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +09001294} // namespace
1295
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09001296TEST_F(NetdBinderTest, IdletimerAddRemoveInterface) {
Luke Huang0051a622018-07-23 20:30:16 +08001297 // TODO: We will get error in if expectIdletimerInterfaceRuleNotExists if there are the same
1298 // rule in the table. Because we only check the result after calling remove function. We might
1299 // check the actual rule which is removed by our function (maybe compare the results between
1300 // calling function before and after)
1301 binder::Status status;
1302 const struct TestData {
1303 const std::string ifname;
1304 int32_t timeout;
1305 const std::string classLabel;
1306 } idleTestData[] = {
1307 {"wlan0", 1234, "happyday"},
1308 {"rmnet_data0", 4567, "friday"},
1309 };
1310 for (const auto& td : idleTestData) {
1311 status = mNetd->idletimerAddInterface(td.ifname, td.timeout, td.classLabel);
1312 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1313 expectIdletimerInterfaceRuleExists(td.ifname, td.timeout, td.classLabel);
1314
1315 status = mNetd->idletimerRemoveInterface(td.ifname, td.timeout, td.classLabel);
1316 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1317 expectIdletimerInterfaceRuleNotExists(td.ifname, td.timeout, td.classLabel);
1318 }
1319}
1320
Luke Huanga67dd562018-07-17 19:58:25 +08001321namespace {
1322
1323constexpr char STRICT_OUTPUT[] = "st_OUTPUT";
1324constexpr char STRICT_CLEAR_CAUGHT[] = "st_clear_caught";
1325
Chiachang Wang911265a2022-03-01 17:17:05 +08001326// Output looks like this:
1327//
1328// IPv4:
1329//
1330// throw dst proto static scope link
1331// unreachable dst proto static scope link
1332// dst via nextHop dev ifName proto static
1333// dst dev ifName proto static scope link
1334//
1335// IPv6:
1336//
1337// throw dst dev lo proto static metric 1024
1338// unreachable dst dev lo proto static metric 1024
1339// dst via nextHop dev ifName proto static metric 1024
1340// dst dev ifName proto static metric 1024
1341std::string ipRoutePrefix(const std::string& ifName, const std::string& dst,
1342 const std::string& nextHop) {
1343 std::string prefixString;
1344
1345 bool isThrow = nextHop == "throw";
1346 bool isUnreachable = nextHop == "unreachable";
1347 bool isDefault = (dst == "0.0.0.0/0" || dst == "::/0");
1348 bool isIPv6 = dst.find(':') != std::string::npos;
1349 bool isThrowOrUnreachable = isThrow || isUnreachable;
1350
1351 if (isThrowOrUnreachable) {
1352 prefixString += nextHop + " ";
1353 }
1354
1355 prefixString += isDefault ? "default" : dst;
1356
1357 if (!nextHop.empty() && !isThrowOrUnreachable) {
1358 prefixString += " via " + nextHop;
1359 }
1360
1361 if (isThrowOrUnreachable) {
1362 if (isIPv6) {
1363 prefixString += " dev lo";
1364 }
1365 } else {
1366 prefixString += " dev " + ifName;
1367 }
1368
1369 prefixString += " proto static";
1370
1371 // IPv6 routes report the metric, IPv4 routes report the scope.
1372 if (isIPv6) {
1373 prefixString += " metric 1024";
1374 } else {
1375 if (nextHop.empty() || isThrowOrUnreachable) {
1376 prefixString += " scope link";
1377 }
1378 }
1379
1380 return prefixString;
1381}
1382
Luke Huanga67dd562018-07-17 19:58:25 +08001383void expectStrictSetUidAccept(const int uid) {
1384 std::string uidRule = StringPrintf("owner UID match %u", uid);
1385 std::string perUidChain = StringPrintf("st_clear_caught_%u", uid);
1386 for (const auto& binary : {IPTABLES_PATH, IP6TABLES_PATH}) {
Greg Kaiser46a1d532019-03-26 12:10:58 -07001387 EXPECT_FALSE(iptablesRuleExists(binary, STRICT_OUTPUT, uidRule));
1388 EXPECT_FALSE(iptablesRuleExists(binary, STRICT_CLEAR_CAUGHT, uidRule));
Luke Huanga67dd562018-07-17 19:58:25 +08001389 EXPECT_EQ(0, iptablesRuleLineLength(binary, perUidChain.c_str()));
1390 }
1391}
1392
1393void expectStrictSetUidLog(const int uid) {
1394 static const char logRule[] = "st_penalty_log all";
1395 std::string uidRule = StringPrintf("owner UID match %u", uid);
1396 std::string perUidChain = StringPrintf("st_clear_caught_%u", uid);
1397 for (const auto& binary : {IPTABLES_PATH, IP6TABLES_PATH}) {
Greg Kaiser46a1d532019-03-26 12:10:58 -07001398 EXPECT_TRUE(iptablesRuleExists(binary, STRICT_OUTPUT, uidRule));
1399 EXPECT_TRUE(iptablesRuleExists(binary, STRICT_CLEAR_CAUGHT, uidRule));
Luke Huanga67dd562018-07-17 19:58:25 +08001400 EXPECT_TRUE(iptablesRuleExists(binary, perUidChain.c_str(), logRule));
1401 }
1402}
1403
1404void expectStrictSetUidReject(const int uid) {
1405 static const char rejectRule[] = "st_penalty_reject all";
1406 std::string uidRule = StringPrintf("owner UID match %u", uid);
1407 std::string perUidChain = StringPrintf("st_clear_caught_%u", uid);
1408 for (const auto& binary : {IPTABLES_PATH, IP6TABLES_PATH}) {
Greg Kaiser46a1d532019-03-26 12:10:58 -07001409 EXPECT_TRUE(iptablesRuleExists(binary, STRICT_OUTPUT, uidRule));
1410 EXPECT_TRUE(iptablesRuleExists(binary, STRICT_CLEAR_CAUGHT, uidRule));
Luke Huanga67dd562018-07-17 19:58:25 +08001411 EXPECT_TRUE(iptablesRuleExists(binary, perUidChain.c_str(), rejectRule));
1412 }
1413}
1414
Chiachang Wang911265a2022-03-01 17:17:05 +08001415bool ipRuleExists(const char* ipVersion, const std::string& ipRule) {
1416 std::vector<std::string> rules = listIpRules(ipVersion);
1417 for (const auto& rule : rules) {
1418 if (rule.find(ipRule) != std::string::npos) {
1419 return true;
1420 }
1421 }
1422 return false;
1423}
1424
1425std::vector<std::string> ipRouteSubstrings(const std::string& ifName, const std::string& dst,
1426 const std::string& nextHop, const std::string& mtu) {
1427 std::vector<std::string> routeSubstrings;
1428
1429 routeSubstrings.push_back(ipRoutePrefix(ifName, dst, nextHop));
1430
1431 if (!mtu.empty()) {
1432 // Add separate substring to match mtu value.
1433 // This is needed because on some devices "error -11"/"error -113" appears between ip prefix
1434 // and mtu for throw/unreachable routes.
1435 routeSubstrings.push_back("mtu " + mtu);
1436 }
1437
1438 return routeSubstrings;
1439}
1440
1441void expectNetworkRouteDoesNotExistWithMtu(const char* ipVersion, const std::string& ifName,
1442 const std::string& dst, const std::string& nextHop,
1443 const std::string& mtu, const char* table) {
1444 std::vector<std::string> routeSubstrings = ipRouteSubstrings(ifName, dst, nextHop, mtu);
1445 EXPECT_FALSE(ipRouteExists(ipVersion, table, routeSubstrings))
1446 << "Found unexpected route [" << Join(routeSubstrings, ", ") << "] in table " << table;
1447}
1448
1449void expectNetworkRouteExistsWithMtu(const char* ipVersion, const std::string& ifName,
1450 const std::string& dst, const std::string& nextHop,
1451 const std::string& mtu, const char* table) {
1452 std::vector<std::string> routeSubstrings = ipRouteSubstrings(ifName, dst, nextHop, mtu);
1453 EXPECT_TRUE(ipRouteExists(ipVersion, table, routeSubstrings))
1454 << "Couldn't find route to " << dst << ": [" << Join(routeSubstrings, ", ")
1455 << "] in table " << table;
1456}
1457
Chiachang Wange39cc752022-03-01 17:35:31 +08001458void expectVpnLocalExclusionRuleExists(const std::string& ifName, bool expectExists) {
Chiachang Wang911265a2022-03-01 17:17:05 +08001459 std::string tableName = std::string(ifName + "_local");
1460 // Check if rule exists
1461 std::string vpnLocalExclusionRule =
1462 StringPrintf("%d:\tfrom all fwmark 0x0/0x10000 iif lo lookup %s",
1463 RULE_PRIORITY_LOCAL_ROUTES, tableName.c_str());
1464 for (const auto& ipVersion : {IP_RULE_V4, IP_RULE_V6}) {
Chiachang Wange39cc752022-03-01 17:35:31 +08001465 EXPECT_EQ(expectExists, ipRuleExists(ipVersion, vpnLocalExclusionRule));
Chiachang Wang911265a2022-03-01 17:17:05 +08001466 }
1467}
1468
1469void expectNetworkRouteExists(const char* ipVersion, const std::string& ifName,
1470 const std::string& dst, const std::string& nextHop,
1471 const char* table) {
1472 expectNetworkRouteExistsWithMtu(ipVersion, ifName, dst, nextHop, "", table);
1473}
1474
1475void expectNetworkRouteDoesNotExist(const char* ipVersion, const std::string& ifName,
1476 const std::string& dst, const std::string& nextHop,
1477 const char* table) {
1478 expectNetworkRouteDoesNotExistWithMtu(ipVersion, ifName, dst, nextHop, "", table);
1479}
1480
1481void expectNetworkDefaultIpRuleExists(const char* ifName) {
1482 std::string networkDefaultRule =
1483 StringPrintf("%u:\tfrom all fwmark 0x0/0xffff iif lo lookup %s",
1484 RULE_PRIORITY_DEFAULT_NETWORK, ifName);
1485
1486 for (const auto& ipVersion : {IP_RULE_V4, IP_RULE_V6}) {
1487 EXPECT_TRUE(ipRuleExists(ipVersion, networkDefaultRule));
1488 }
1489}
1490
1491void expectNetworkDefaultIpRuleDoesNotExist() {
1492 std::string networkDefaultRule =
1493 StringPrintf("%u:\tfrom all fwmark 0x0/0xffff iif lo", RULE_PRIORITY_DEFAULT_NETWORK);
1494
1495 for (const auto& ipVersion : {IP_RULE_V4, IP_RULE_V6}) {
1496 EXPECT_FALSE(ipRuleExists(ipVersion, networkDefaultRule));
1497 }
1498}
1499
1500void expectNetworkPermissionIpRuleExists(const char* ifName, int permission) {
1501 std::string networkPermissionRule = "";
1502 switch (permission) {
1503 case INetd::PERMISSION_NONE:
1504 networkPermissionRule =
1505 StringPrintf("%u:\tfrom all fwmark 0x1ffdd/0x1ffff iif lo lookup %s",
1506 RULE_PRIORITY_EXPLICIT_NETWORK, ifName);
1507 break;
1508 case INetd::PERMISSION_NETWORK:
1509 networkPermissionRule =
1510 StringPrintf("%u:\tfrom all fwmark 0x5ffdd/0x5ffff iif lo lookup %s",
1511 RULE_PRIORITY_EXPLICIT_NETWORK, ifName);
1512 break;
1513 case INetd::PERMISSION_SYSTEM:
1514 networkPermissionRule =
1515 StringPrintf("%u:\tfrom all fwmark 0xdffdd/0xdffff iif lo lookup %s",
1516 RULE_PRIORITY_EXPLICIT_NETWORK, ifName);
1517 break;
1518 }
1519
1520 for (const auto& ipVersion : {IP_RULE_V4, IP_RULE_V6}) {
1521 EXPECT_TRUE(ipRuleExists(ipVersion, networkPermissionRule));
1522 }
1523}
1524
1525// TODO: It is a duplicate function, need to remove it
1526bool iptablesNetworkPermissionIptablesRuleExists(const char* binary, const char* chainName,
1527 const std::string& expectedInterface,
1528 const std::string& expectedRule,
1529 const char* table) {
1530 std::vector<std::string> rules = listIptablesRuleByTable(binary, table, chainName);
1531 for (const auto& rule : rules) {
1532 if (rule.find(expectedInterface) != std::string::npos) {
1533 if (rule.find(expectedRule) != std::string::npos) {
1534 return true;
1535 }
1536 }
1537 }
1538 return false;
1539}
1540
1541void expectNetworkPermissionIptablesRuleExists(const char* ifName, int permission) {
1542 static const char ROUTECTRL_INPUT[] = "routectrl_mangle_INPUT";
1543 std::string networkIncomingPacketMarkRule = "";
1544 switch (permission) {
1545 case INetd::PERMISSION_NONE:
1546 networkIncomingPacketMarkRule = "MARK xset 0x3ffdd/0xffefffff";
1547 break;
1548 case INetd::PERMISSION_NETWORK:
1549 networkIncomingPacketMarkRule = "MARK xset 0x7ffdd/0xffefffff";
1550 break;
1551 case INetd::PERMISSION_SYSTEM:
1552 networkIncomingPacketMarkRule = "MARK xset 0xfffdd/0xffefffff";
1553 break;
1554 }
1555
1556 for (const auto& binary : {IPTABLES_PATH, IP6TABLES_PATH}) {
1557 EXPECT_TRUE(iptablesNetworkPermissionIptablesRuleExists(
1558 binary, ROUTECTRL_INPUT, ifName, networkIncomingPacketMarkRule, MANGLE_TABLE));
1559 }
1560}
1561
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +09001562} // namespace
1563
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09001564TEST_F(NetdBinderTest, StrictSetUidCleartextPenalty) {
Luke Huanga67dd562018-07-17 19:58:25 +08001565 binder::Status status;
1566 int32_t uid = randomUid();
1567
1568 // setUidCleartextPenalty Policy:Log with randomUid
1569 status = mNetd->strictUidCleartextPenalty(uid, INetd::PENALTY_POLICY_LOG);
1570 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1571 expectStrictSetUidLog(uid);
1572
1573 // setUidCleartextPenalty Policy:Accept with randomUid
1574 status = mNetd->strictUidCleartextPenalty(uid, INetd::PENALTY_POLICY_ACCEPT);
1575 expectStrictSetUidAccept(uid);
1576
1577 // setUidCleartextPenalty Policy:Reject with randomUid
1578 status = mNetd->strictUidCleartextPenalty(uid, INetd::PENALTY_POLICY_REJECT);
1579 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1580 expectStrictSetUidReject(uid);
1581
1582 // setUidCleartextPenalty Policy:Accept with randomUid
1583 status = mNetd->strictUidCleartextPenalty(uid, INetd::PENALTY_POLICY_ACCEPT);
1584 expectStrictSetUidAccept(uid);
1585
1586 // test wrong policy
1587 int32_t wrongPolicy = -123;
1588 status = mNetd->strictUidCleartextPenalty(uid, wrongPolicy);
1589 EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode());
1590}
1591
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +09001592namespace {
Luke Huang6d301232018-08-01 14:05:18 +08001593
Luke Huangd1675922019-03-11 17:29:27 +08001594std::vector<std::string> tryToFindProcesses(const std::string& processName, uint32_t maxTries = 1,
Luke Huang728cf4c2019-03-14 19:43:02 +08001595 uint32_t intervalMs = 50) {
Luke Huangd1675922019-03-11 17:29:27 +08001596 // Output looks like:(clatd)
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +09001597 // clat 4963 850 1 12:16:51 ? 00:00:00 clatd-netd10a88 -i netd10a88 ...
1598 // ...
1599 // root 5221 5219 0 12:18:12 ? 00:00:00 sh -c ps -Af | grep ' clatd-netdcc1a0'
1600
Luke Huangd1675922019-03-11 17:29:27 +08001601 // (dnsmasq)
1602 // dns_tether 4620 792 0 16:51:28 ? 00:00:00 dnsmasq --keep-in-foreground ...
1603
1604 if (maxTries == 0) return {};
1605
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +09001606 std::string cmd = StringPrintf("ps -Af | grep '[0-9] %s'", processName.c_str());
Luke Huangd1675922019-03-11 17:29:27 +08001607 std::vector<std::string> result;
1608 for (uint32_t run = 1;;) {
Greg Kaiser46a1d532019-03-26 12:10:58 -07001609 result = runCommand(cmd);
Luke Huangd1675922019-03-11 17:29:27 +08001610 if (result.size() || ++run > maxTries) {
1611 break;
1612 }
1613
Luke Huang728cf4c2019-03-14 19:43:02 +08001614 usleep(intervalMs * 1000);
Luke Huangd1675922019-03-11 17:29:27 +08001615 }
1616 return result;
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +09001617}
1618
Luke Huangd1675922019-03-11 17:29:27 +08001619void expectProcessExists(const std::string& processName) {
Luke Huang728cf4c2019-03-14 19:43:02 +08001620 EXPECT_EQ(1U, tryToFindProcesses(processName, 5 /*maxTries*/).size());
Luke Huangd1675922019-03-11 17:29:27 +08001621}
1622
Luke Huang728cf4c2019-03-14 19:43:02 +08001623void expectProcessDoesNotExist(const std::string& processName) {
Luke Huangd1675922019-03-11 17:29:27 +08001624 EXPECT_FALSE(tryToFindProcesses(processName).size());
Luke Huang6d301232018-08-01 14:05:18 +08001625}
1626
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +09001627} // namespace
1628
Chiachang89e504e2022-05-12 05:21:20 +00001629TEST_F(NetdBinderTest, NetworkAddRemoveRouteToLocalExcludeTable) {
1630 static const struct {
1631 const char* ipVersion;
1632 const char* testDest;
1633 const char* testNextHop;
1634 const bool expectInLocalTable;
Chiachang3aa56612022-05-12 05:55:45 +00001635 } kTestData[] = {{IP_RULE_V6, "::/0", "fe80::", false},
1636 {IP_RULE_V6, "::/0", "", false},
1637 {IP_RULE_V6, "2001:db8:cafe::/64", "fe80::", false},
1638 {IP_RULE_V6, "fe80::/64", "", true},
1639 {IP_RULE_V6, "2001:db8:cafe::/48", "", true},
1640 {IP_RULE_V6, "2001:db8:cafe::/64", "unreachable", false},
1641 {IP_RULE_V6, "2001:db8:ca00::/40", "", true},
1642 {IP_RULE_V4, "0.0.0.0/0", "10.251.10.1", false},
1643 {IP_RULE_V4, "192.1.0.0/16", "", false},
1644 {IP_RULE_V4, "192.168.0.0/15", "", false},
1645 {IP_RULE_V4, "192.168.0.0/16", "", true},
1646 {IP_RULE_V4, "192.168.0.0/24", "", true},
1647 {IP_RULE_V4, "100.1.0.0/16", "", false},
1648 {IP_RULE_V4, "100.0.0.0/8", "", false},
1649 {IP_RULE_V4, "100.64.0.0/10", "", true},
1650 {IP_RULE_V4, "100.64.0.0/16", "", true},
1651 {IP_RULE_V4, "100.64.0.0/10", "throw", false},
1652 {IP_RULE_V4, "172.0.0.0/8", "", false},
1653 {IP_RULE_V4, "172.16.0.0/12", "", true},
1654 {IP_RULE_V4, "172.16.0.0/16", "", true},
1655 {IP_RULE_V4, "172.16.0.0/12", "unreachable", false},
1656 {IP_RULE_V4, "172.32.0.0/12", "", false},
1657 {IP_RULE_V4, "169.0.0.0/8", "", false},
1658 {IP_RULE_V4, "169.254.0.0/16", "", true},
1659 {IP_RULE_V4, "169.254.0.0/20", "", true},
1660 {IP_RULE_V4, "169.254.3.0/24", "", true},
1661 {IP_RULE_V4, "170.254.0.0/16", "", false},
1662 {IP_RULE_V4, "10.0.0.0/8", "", true},
1663 {IP_RULE_V4, "10.0.0.0/7", "", false},
1664 {IP_RULE_V4, "10.0.0.0/16", "", true},
1665 {IP_RULE_V4, "10.251.0.0/16", "", true},
1666 {IP_RULE_V4, "10.251.250.0/24", "", true},
1667 {IP_RULE_V4, "10.251.10.2/31", "throw", false},
1668 {IP_RULE_V4, "10.251.10.2/31", "unreachable", false}};
Chiachang89e504e2022-05-12 05:21:20 +00001669
Chiachang3aa56612022-05-12 05:55:45 +00001670 // To ensure that the nexthops for the above are reachable.
1671 // Otherwise, the routes can't be created.
Chiachang89e504e2022-05-12 05:21:20 +00001672 static const struct {
1673 const char* ipVersion;
1674 const char* testDest;
1675 const char* testNextHop;
Chiachang3aa56612022-05-12 05:55:45 +00001676 } kDirectlyConnectedRoutes[] = {
1677 {IP_RULE_V4, "10.251.10.0/30", ""},
1678 {IP_RULE_V6, "2001:db8::/32", ""},
1679 };
Chiachang89e504e2022-05-12 05:21:20 +00001680
1681 // Add test physical network
1682 const auto& config = makeNativeNetworkConfig(TEST_NETID1, NativeNetworkType::PHYSICAL,
1683 INetd::PERMISSION_NONE, false, false);
1684 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
1685 EXPECT_TRUE(mNetd->networkAddInterface(TEST_NETID1, sTun.name()).isOk());
1686
1687 // Get current default network NetId
1688 binder::Status status = mNetd->networkGetDefault(&mStoredDefaultNetwork);
1689 ASSERT_TRUE(status.isOk()) << status.exceptionMessage();
1690
1691 // Set default network
1692 EXPECT_TRUE(mNetd->networkSetDefault(TEST_NETID1).isOk());
1693
1694 std::string localTableName = std::string(sTun.name() + "_local");
1695 // Set up link-local routes for connectivity to the "gateway"
Chiachang3aa56612022-05-12 05:55:45 +00001696 for (size_t i = 0; i < std::size(kDirectlyConnectedRoutes); i++) {
1697 const auto& td = kDirectlyConnectedRoutes[i];
Chiachang89e504e2022-05-12 05:21:20 +00001698
1699 binder::Status status =
1700 mNetd->networkAddRoute(TEST_NETID1, sTun.name(), td.testDest, td.testNextHop);
1701 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1702 expectNetworkRouteExists(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
1703 sTun.name().c_str());
1704 // Verify routes in local table
1705 expectNetworkRouteExists(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
1706 localTableName.c_str());
1707 }
1708
1709 for (size_t i = 0; i < std::size(kTestData); i++) {
1710 const auto& td = kTestData[i];
Chiachang3aa56612022-05-12 05:55:45 +00001711 SCOPED_TRACE(StringPrintf("case ip:%s, dest:%s, nexHop:%s, expect:%d", td.ipVersion,
1712 td.testDest, td.testNextHop, td.expectInLocalTable));
Chiachang89e504e2022-05-12 05:21:20 +00001713 binder::Status status =
1714 mNetd->networkAddRoute(TEST_NETID1, sTun.name(), td.testDest, td.testNextHop);
1715 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1716 // Verify routes in local table
1717 if (td.expectInLocalTable) {
1718 expectNetworkRouteExists(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
1719 localTableName.c_str());
1720 } else {
1721 expectNetworkRouteDoesNotExist(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
1722 localTableName.c_str());
1723 }
1724
1725 status = mNetd->networkRemoveRoute(TEST_NETID1, sTun.name(), td.testDest, td.testNextHop);
1726 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1727 expectNetworkRouteDoesNotExist(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
1728 localTableName.c_str());
1729 }
1730
Chiachang3aa56612022-05-12 05:55:45 +00001731 for (size_t i = 0; i < std::size(kDirectlyConnectedRoutes); i++) {
1732 const auto& td = kDirectlyConnectedRoutes[i];
Chiachang89e504e2022-05-12 05:21:20 +00001733 status = mNetd->networkRemoveRoute(TEST_NETID1, sTun.name(), td.testDest, td.testNextHop);
1734 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1735 }
1736
1737 // Set default network back
1738 status = mNetd->networkSetDefault(mStoredDefaultNetwork);
1739
1740 // Remove test physical network
1741 EXPECT_TRUE(mNetd->networkDestroy(TEST_NETID1).isOk());
1742}
1743
Luke Huang457d4702018-08-16 15:39:15 +08001744namespace {
1745
1746bool getIpfwdV4Enable() {
1747 static const char ipv4IpfwdCmd[] = "cat /proc/sys/net/ipv4/ip_forward";
1748 std::vector<std::string> result = runCommand(ipv4IpfwdCmd);
1749 EXPECT_TRUE(!result.empty());
1750 int v4Enable = std::stoi(result[0]);
1751 return v4Enable;
1752}
1753
1754bool getIpfwdV6Enable() {
Lorenzo Colitti76edb4b2019-05-09 11:46:45 +09001755 static const char ipv6IpfwdCmd[] = "cat /proc/sys/net/ipv6/conf/all/forwarding";
Luke Huang457d4702018-08-16 15:39:15 +08001756 std::vector<std::string> result = runCommand(ipv6IpfwdCmd);
1757 EXPECT_TRUE(!result.empty());
1758 int v6Enable = std::stoi(result[0]);
1759 return v6Enable;
1760}
1761
1762void expectIpfwdEnable(bool enable) {
1763 int enableIPv4 = getIpfwdV4Enable();
1764 int enableIPv6 = getIpfwdV6Enable();
1765 EXPECT_EQ(enable, enableIPv4);
1766 EXPECT_EQ(enable, enableIPv6);
1767}
1768
Bernie Innocenti1bdf10d2018-09-10 18:46:07 +09001769bool ipRuleIpfwdExists(const char* ipVersion, const std::string& ipfwdRule) {
Luke Huang457d4702018-08-16 15:39:15 +08001770 std::vector<std::string> rules = listIpRules(ipVersion);
1771 for (const auto& rule : rules) {
1772 if (rule.find(ipfwdRule) != std::string::npos) {
1773 return true;
1774 }
1775 }
1776 return false;
1777}
1778
1779void expectIpfwdRuleExists(const char* fromIf, const char* toIf) {
Ken Chen7099e2e2021-02-08 00:57:47 +08001780 std::string ipfwdRule =
1781 StringPrintf("%u:\tfrom all iif %s lookup %s ", RULE_PRIORITY_TETHERING, fromIf, toIf);
Luke Huang457d4702018-08-16 15:39:15 +08001782
1783 for (const auto& ipVersion : {IP_RULE_V4, IP_RULE_V6}) {
1784 EXPECT_TRUE(ipRuleIpfwdExists(ipVersion, ipfwdRule));
1785 }
1786}
1787
1788void expectIpfwdRuleNotExists(const char* fromIf, const char* toIf) {
Ken Chen7099e2e2021-02-08 00:57:47 +08001789 std::string ipfwdRule =
1790 StringPrintf("%u:\tfrom all iif %s lookup %s ", RULE_PRIORITY_TETHERING, fromIf, toIf);
Luke Huang457d4702018-08-16 15:39:15 +08001791
1792 for (const auto& ipVersion : {IP_RULE_V4, IP_RULE_V6}) {
1793 EXPECT_FALSE(ipRuleIpfwdExists(ipVersion, ipfwdRule));
1794 }
1795}
1796
1797} // namespace
1798
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09001799TEST_F(NetdBinderTest, TestIpfwdEnableDisableStatusForwarding) {
Luke Huang728cf4c2019-03-14 19:43:02 +08001800 // Get ipfwd requester list from Netd
1801 std::vector<std::string> requesterList;
1802 binder::Status status = mNetd->ipfwdGetRequesterList(&requesterList);
Luke Huang457d4702018-08-16 15:39:15 +08001803 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
Luke Huang457d4702018-08-16 15:39:15 +08001804
1805 bool ipfwdEnabled;
Luke Huang728cf4c2019-03-14 19:43:02 +08001806 if (requesterList.size() == 0) {
1807 // No requester in Netd, ipfwd should be disabled
1808 // So add one test requester and verify
1809 status = mNetd->ipfwdEnableForwarding("TestRequester");
1810 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
Luke Huang457d4702018-08-16 15:39:15 +08001811
Luke Huang728cf4c2019-03-14 19:43:02 +08001812 expectIpfwdEnable(true);
1813 status = mNetd->ipfwdEnabled(&ipfwdEnabled);
1814 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1815 EXPECT_TRUE(ipfwdEnabled);
Luke Huang457d4702018-08-16 15:39:15 +08001816
Luke Huang728cf4c2019-03-14 19:43:02 +08001817 // Remove test one, verify again
1818 status = mNetd->ipfwdDisableForwarding("TestRequester");
1819 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1820
1821 expectIpfwdEnable(false);
1822 status = mNetd->ipfwdEnabled(&ipfwdEnabled);
1823 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1824 EXPECT_FALSE(ipfwdEnabled);
1825 } else {
1826 // Disable all requesters
1827 for (const auto& requester : requesterList) {
1828 status = mNetd->ipfwdDisableForwarding(requester);
1829 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1830 }
1831
1832 // After disable all requester, ipfwd should be disabled
1833 expectIpfwdEnable(false);
1834 status = mNetd->ipfwdEnabled(&ipfwdEnabled);
1835 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1836 EXPECT_FALSE(ipfwdEnabled);
1837
1838 // Enable them back
1839 for (const auto& requester : requesterList) {
1840 status = mNetd->ipfwdEnableForwarding(requester);
1841 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1842 }
1843
1844 // ipfwd should be enabled
1845 expectIpfwdEnable(true);
1846 status = mNetd->ipfwdEnabled(&ipfwdEnabled);
1847 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1848 EXPECT_TRUE(ipfwdEnabled);
1849 }
Luke Huang457d4702018-08-16 15:39:15 +08001850}
1851
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09001852TEST_F(NetdBinderTest, TestIpfwdAddRemoveInterfaceForward) {
Lorenzo Colittifaa0edf2020-06-03 21:56:46 +09001853 // Add test physical network
Ken Chenab5f3472021-04-04 11:28:06 +08001854 auto config = makeNativeNetworkConfig(TEST_NETID1, NativeNetworkType::PHYSICAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +08001855 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08001856 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Lorenzo Colittifaa0edf2020-06-03 21:56:46 +09001857 EXPECT_TRUE(mNetd->networkAddInterface(TEST_NETID1, sTun.name()).isOk());
Ken Chenab5f3472021-04-04 11:28:06 +08001858
1859 config.netId = TEST_NETID2;
1860 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Lorenzo Colittifaa0edf2020-06-03 21:56:46 +09001861 EXPECT_TRUE(mNetd->networkAddInterface(TEST_NETID2, sTun2.name()).isOk());
Luke Huang457d4702018-08-16 15:39:15 +08001862
Lorenzo Colittifaa0edf2020-06-03 21:56:46 +09001863 binder::Status status = mNetd->ipfwdAddInterfaceForward(sTun.name(), sTun2.name());
1864 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1865 expectIpfwdRuleExists(sTun.name().c_str(), sTun2.name().c_str());
Luke Huang457d4702018-08-16 15:39:15 +08001866
Lorenzo Colittifaa0edf2020-06-03 21:56:46 +09001867 status = mNetd->ipfwdRemoveInterfaceForward(sTun.name(), sTun2.name());
1868 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1869 expectIpfwdRuleNotExists(sTun.name().c_str(), sTun2.name().c_str());
Bernie Innocenti1bcc25a2018-08-10 17:15:00 +09001870}
Luke Huang531f5d32018-08-03 15:19:05 +08001871
1872namespace {
1873
1874constexpr char BANDWIDTH_INPUT[] = "bw_INPUT";
1875constexpr char BANDWIDTH_OUTPUT[] = "bw_OUTPUT";
1876constexpr char BANDWIDTH_FORWARD[] = "bw_FORWARD";
1877constexpr char BANDWIDTH_NAUGHTY[] = "bw_penalty_box";
Luke Huangae038f82018-11-05 11:17:31 +09001878constexpr char BANDWIDTH_ALERT[] = "bw_global_alert";
Luke Huang531f5d32018-08-03 15:19:05 +08001879
Luke Huang19b49c52018-10-22 12:12:05 +09001880// TODO: Move iptablesTargetsExists and listIptablesRuleByTable to the top.
1881// Use either a std::vector<std::string> of things to match, or a variadic function.
Luke Huang531f5d32018-08-03 15:19:05 +08001882bool iptablesTargetsExists(const char* binary, int expectedCount, const char* table,
1883 const char* chainName, const std::string& expectedTargetA,
1884 const std::string& expectedTargetB) {
1885 std::vector<std::string> rules = listIptablesRuleByTable(binary, table, chainName);
1886 int matchCount = 0;
1887
1888 for (const auto& rule : rules) {
1889 if (rule.find(expectedTargetA) != std::string::npos) {
1890 if (rule.find(expectedTargetB) != std::string::npos) {
1891 matchCount++;
1892 }
1893 }
1894 }
1895 return matchCount == expectedCount;
1896}
1897
1898void expectXtQuotaValueEqual(const char* ifname, long quotaBytes) {
1899 std::string path = StringPrintf("/proc/net/xt_quota/%s", ifname);
1900 std::string result = "";
1901
1902 EXPECT_TRUE(ReadFileToString(path, &result));
Luke Huang4953ca22018-09-14 14:08:50 +08001903 // Quota value might be decreased while matching packets
1904 EXPECT_GE(quotaBytes, std::stol(Trim(result)));
Luke Huang531f5d32018-08-03 15:19:05 +08001905}
1906
1907void expectBandwidthInterfaceQuotaRuleExists(const char* ifname, long quotaBytes) {
1908 std::string BANDWIDTH_COSTLY_IF = StringPrintf("bw_costly_%s", ifname);
1909 std::string quotaRule = StringPrintf("quota %s", ifname);
1910
1911 for (const auto& binary : {IPTABLES_PATH, IP6TABLES_PATH}) {
1912 EXPECT_TRUE(iptablesTargetsExists(binary, 1, FILTER_TABLE, BANDWIDTH_INPUT, ifname,
1913 BANDWIDTH_COSTLY_IF));
1914 EXPECT_TRUE(iptablesTargetsExists(binary, 1, FILTER_TABLE, BANDWIDTH_OUTPUT, ifname,
1915 BANDWIDTH_COSTLY_IF));
1916 EXPECT_TRUE(iptablesTargetsExists(binary, 2, FILTER_TABLE, BANDWIDTH_FORWARD, ifname,
1917 BANDWIDTH_COSTLY_IF));
1918 EXPECT_TRUE(iptablesRuleExists(binary, BANDWIDTH_COSTLY_IF.c_str(), BANDWIDTH_NAUGHTY));
1919 EXPECT_TRUE(iptablesRuleExists(binary, BANDWIDTH_COSTLY_IF.c_str(), quotaRule));
1920 }
1921 expectXtQuotaValueEqual(ifname, quotaBytes);
1922}
1923
1924void expectBandwidthInterfaceQuotaRuleDoesNotExist(const char* ifname) {
1925 std::string BANDWIDTH_COSTLY_IF = StringPrintf("bw_costly_%s", ifname);
1926 std::string quotaRule = StringPrintf("quota %s", ifname);
1927
1928 for (const auto& binary : {IPTABLES_PATH, IP6TABLES_PATH}) {
1929 EXPECT_FALSE(iptablesTargetsExists(binary, 1, FILTER_TABLE, BANDWIDTH_INPUT, ifname,
1930 BANDWIDTH_COSTLY_IF));
1931 EXPECT_FALSE(iptablesTargetsExists(binary, 1, FILTER_TABLE, BANDWIDTH_OUTPUT, ifname,
1932 BANDWIDTH_COSTLY_IF));
1933 EXPECT_FALSE(iptablesTargetsExists(binary, 2, FILTER_TABLE, BANDWIDTH_FORWARD, ifname,
1934 BANDWIDTH_COSTLY_IF));
1935 EXPECT_FALSE(iptablesRuleExists(binary, BANDWIDTH_COSTLY_IF.c_str(), BANDWIDTH_NAUGHTY));
1936 EXPECT_FALSE(iptablesRuleExists(binary, BANDWIDTH_COSTLY_IF.c_str(), quotaRule));
1937 }
1938}
1939
1940void expectBandwidthInterfaceAlertRuleExists(const char* ifname, long alertBytes) {
1941 std::string BANDWIDTH_COSTLY_IF = StringPrintf("bw_costly_%s", ifname);
1942 std::string alertRule = StringPrintf("quota %sAlert", ifname);
1943 std::string alertName = StringPrintf("%sAlert", ifname);
1944
1945 for (const auto& binary : {IPTABLES_PATH, IP6TABLES_PATH}) {
1946 EXPECT_TRUE(iptablesRuleExists(binary, BANDWIDTH_COSTLY_IF.c_str(), alertRule));
1947 }
1948 expectXtQuotaValueEqual(alertName.c_str(), alertBytes);
1949}
1950
1951void expectBandwidthInterfaceAlertRuleDoesNotExist(const char* ifname) {
1952 std::string BANDWIDTH_COSTLY_IF = StringPrintf("bw_costly_%s", ifname);
1953 std::string alertRule = StringPrintf("quota %sAlert", ifname);
1954
1955 for (const auto& binary : {IPTABLES_PATH, IP6TABLES_PATH}) {
1956 EXPECT_FALSE(iptablesRuleExists(binary, BANDWIDTH_COSTLY_IF.c_str(), alertRule));
1957 }
1958}
1959
1960void expectBandwidthGlobalAlertRuleExists(long alertBytes) {
1961 static const char globalAlertRule[] = "quota globalAlert";
1962 static const char globalAlertName[] = "globalAlert";
1963
1964 for (const auto& binary : {IPTABLES_PATH, IP6TABLES_PATH}) {
Luke Huangae038f82018-11-05 11:17:31 +09001965 EXPECT_TRUE(iptablesRuleExists(binary, BANDWIDTH_ALERT, globalAlertRule));
Luke Huang531f5d32018-08-03 15:19:05 +08001966 }
1967 expectXtQuotaValueEqual(globalAlertName, alertBytes);
1968}
1969
Luke Huang531f5d32018-08-03 15:19:05 +08001970} // namespace
1971
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09001972TEST_F(NetdBinderTest, BandwidthSetRemoveInterfaceQuota) {
Luke Huang531f5d32018-08-03 15:19:05 +08001973 long testQuotaBytes = 5550;
1974
1975 // Add test physical network
Ken Chenab5f3472021-04-04 11:28:06 +08001976 const auto& config = makeNativeNetworkConfig(TEST_NETID1, NativeNetworkType::PHYSICAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +08001977 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08001978 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Luke Huang531f5d32018-08-03 15:19:05 +08001979 EXPECT_TRUE(mNetd->networkAddInterface(TEST_NETID1, sTun.name()).isOk());
1980
1981 binder::Status status = mNetd->bandwidthSetInterfaceQuota(sTun.name(), testQuotaBytes);
1982 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1983 expectBandwidthInterfaceQuotaRuleExists(sTun.name().c_str(), testQuotaBytes);
1984
1985 status = mNetd->bandwidthRemoveInterfaceQuota(sTun.name());
1986 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
1987 expectBandwidthInterfaceQuotaRuleDoesNotExist(sTun.name().c_str());
1988
1989 // Remove test physical network
1990 EXPECT_TRUE(mNetd->networkDestroy(TEST_NETID1).isOk());
1991}
1992
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09001993TEST_F(NetdBinderTest, BandwidthSetRemoveInterfaceAlert) {
Luke Huang531f5d32018-08-03 15:19:05 +08001994 long testAlertBytes = 373;
Luke Huang531f5d32018-08-03 15:19:05 +08001995 // Add test physical network
Ken Chenab5f3472021-04-04 11:28:06 +08001996 const auto& config = makeNativeNetworkConfig(TEST_NETID1, NativeNetworkType::PHYSICAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +08001997 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08001998 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Luke Huang531f5d32018-08-03 15:19:05 +08001999 EXPECT_TRUE(mNetd->networkAddInterface(TEST_NETID1, sTun.name()).isOk());
Luke Huang531f5d32018-08-03 15:19:05 +08002000 // Need to have a prior interface quota set to set an alert
2001 binder::Status status = mNetd->bandwidthSetInterfaceQuota(sTun.name(), testAlertBytes);
2002 status = mNetd->bandwidthSetInterfaceAlert(sTun.name(), testAlertBytes);
2003 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2004 expectBandwidthInterfaceAlertRuleExists(sTun.name().c_str(), testAlertBytes);
2005
2006 status = mNetd->bandwidthRemoveInterfaceAlert(sTun.name());
2007 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2008 expectBandwidthInterfaceAlertRuleDoesNotExist(sTun.name().c_str());
2009
2010 // Remove interface quota
2011 status = mNetd->bandwidthRemoveInterfaceQuota(sTun.name());
2012 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2013 expectBandwidthInterfaceQuotaRuleDoesNotExist(sTun.name().c_str());
2014
2015 // Remove test physical network
2016 EXPECT_TRUE(mNetd->networkDestroy(TEST_NETID1).isOk());
2017}
2018
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09002019TEST_F(NetdBinderTest, BandwidthSetGlobalAlert) {
Luke Huang8ca0f1c2019-05-29 15:56:42 +08002020 int64_t testAlertBytes = 2097200;
Luke Huang531f5d32018-08-03 15:19:05 +08002021
2022 binder::Status status = mNetd->bandwidthSetGlobalAlert(testAlertBytes);
2023 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2024 expectBandwidthGlobalAlertRuleExists(testAlertBytes);
2025
Luke Huang8ca0f1c2019-05-29 15:56:42 +08002026 testAlertBytes = 2098230;
Luke Huang531f5d32018-08-03 15:19:05 +08002027 status = mNetd->bandwidthSetGlobalAlert(testAlertBytes);
2028 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2029 expectBandwidthGlobalAlertRuleExists(testAlertBytes);
2030}
2031
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09002032TEST_F(NetdBinderTest, NetworkAddRemoveRouteUserPermission) {
Luke Huangc3252cc2018-10-16 15:43:23 +08002033 static const struct {
Luke Huangb670d162018-08-23 20:01:13 +08002034 const char* ipVersion;
2035 const char* testDest;
2036 const char* testNextHop;
2037 const bool expectSuccess;
2038 } kTestData[] = {
2039 {IP_RULE_V4, "0.0.0.0/0", "", true},
Luke Huangc3252cc2018-10-16 15:43:23 +08002040 {IP_RULE_V4, "0.0.0.0/0", "10.251.10.0", true},
2041 {IP_RULE_V4, "10.251.0.0/16", "", true},
2042 {IP_RULE_V4, "10.251.0.0/16", "10.251.10.0", true},
2043 {IP_RULE_V4, "10.251.0.0/16", "fe80::/64", false},
Luke Huangb670d162018-08-23 20:01:13 +08002044 {IP_RULE_V6, "::/0", "", true},
Luke Huangc3252cc2018-10-16 15:43:23 +08002045 {IP_RULE_V6, "::/0", "2001:db8::", true},
2046 {IP_RULE_V6, "2001:db8:cafe::/64", "2001:db8::", true},
Luke Huangb670d162018-08-23 20:01:13 +08002047 {IP_RULE_V4, "fe80::/64", "0.0.0.0", false},
Taras Antoshchuk35987de2021-09-21 17:45:15 +02002048 {IP_RULE_V4, "10.251.10.2/31", "throw", true},
2049 {IP_RULE_V4, "10.251.10.2/31", "unreachable", true},
2050 {IP_RULE_V4, "0.0.0.0/0", "throw", true},
2051 {IP_RULE_V4, "0.0.0.0/0", "unreachable", true},
2052 {IP_RULE_V6, "::/0", "throw", true},
2053 {IP_RULE_V6, "::/0", "unreachable", true},
2054 {IP_RULE_V6, "2001:db8:cafe::/64", "throw", true},
2055 {IP_RULE_V6, "2001:db8:cafe::/64", "unreachable", true},
Luke Huangb670d162018-08-23 20:01:13 +08002056 };
2057
Luke Huangc3252cc2018-10-16 15:43:23 +08002058 static const struct {
2059 const char* ipVersion;
2060 const char* testDest;
2061 const char* testNextHop;
2062 } kTestDataWithNextHop[] = {
2063 {IP_RULE_V4, "10.251.10.0/30", ""},
2064 {IP_RULE_V6, "2001:db8::/32", ""},
2065 };
2066
Luke Huangb670d162018-08-23 20:01:13 +08002067 static const char testTableLegacySystem[] = "legacy_system";
Luke Huangc3252cc2018-10-16 15:43:23 +08002068 static const char testTableLegacyNetwork[] = "legacy_network";
Luke Huangb670d162018-08-23 20:01:13 +08002069 const int testUid = randomUid();
2070 const std::vector<int32_t> testUids = {testUid};
2071
2072 // Add test physical network
Ken Chenab5f3472021-04-04 11:28:06 +08002073 const auto& config = makeNativeNetworkConfig(TEST_NETID1, NativeNetworkType::PHYSICAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +08002074 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08002075 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Luke Huangb670d162018-08-23 20:01:13 +08002076 EXPECT_TRUE(mNetd->networkAddInterface(TEST_NETID1, sTun.name()).isOk());
2077
Luke Huangc3252cc2018-10-16 15:43:23 +08002078 // Setup route for testing nextHop
Sehee Park8659b8d2018-11-16 10:53:16 +09002079 for (size_t i = 0; i < std::size(kTestDataWithNextHop); i++) {
Luke Huangc3252cc2018-10-16 15:43:23 +08002080 const auto& td = kTestDataWithNextHop[i];
2081
2082 // All route for test tun will disappear once the tun interface is deleted.
2083 binder::Status status =
2084 mNetd->networkAddRoute(TEST_NETID1, sTun.name(), td.testDest, td.testNextHop);
2085 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2086 expectNetworkRouteExists(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
2087 sTun.name().c_str());
2088
2089 // Add system permission for test uid, setup route in legacy system table.
2090 EXPECT_TRUE(mNetd->networkSetPermissionForUser(INetd::PERMISSION_SYSTEM, testUids).isOk());
2091
2092 status = mNetd->networkAddLegacyRoute(TEST_NETID1, sTun.name(), td.testDest, td.testNextHop,
2093 testUid);
2094 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2095 expectNetworkRouteExists(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
2096 testTableLegacySystem);
2097
2098 // Remove system permission for test uid, setup route in legacy network table.
2099 EXPECT_TRUE(mNetd->networkClearPermissionForUser(testUids).isOk());
2100
2101 status = mNetd->networkAddLegacyRoute(TEST_NETID1, sTun.name(), td.testDest, td.testNextHop,
2102 testUid);
2103 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2104 expectNetworkRouteExists(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
2105 testTableLegacyNetwork);
2106 }
2107
Sehee Park8659b8d2018-11-16 10:53:16 +09002108 for (size_t i = 0; i < std::size(kTestData); i++) {
Luke Huangb670d162018-08-23 20:01:13 +08002109 const auto& td = kTestData[i];
2110
2111 binder::Status status =
2112 mNetd->networkAddRoute(TEST_NETID1, sTun.name(), td.testDest, td.testNextHop);
2113 if (td.expectSuccess) {
2114 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
Luke Huangc3252cc2018-10-16 15:43:23 +08002115 expectNetworkRouteExists(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
Luke Huangb670d162018-08-23 20:01:13 +08002116 sTun.name().c_str());
2117 } else {
Luke Huangc3252cc2018-10-16 15:43:23 +08002118 EXPECT_EQ(binder::Status::EX_SERVICE_SPECIFIC, status.exceptionCode());
2119 EXPECT_NE(0, status.serviceSpecificErrorCode());
Luke Huangb670d162018-08-23 20:01:13 +08002120 }
2121
2122 status = mNetd->networkRemoveRoute(TEST_NETID1, sTun.name(), td.testDest, td.testNextHop);
2123 if (td.expectSuccess) {
2124 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
Luke Huangc3252cc2018-10-16 15:43:23 +08002125 expectNetworkRouteDoesNotExist(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
2126 sTun.name().c_str());
Luke Huangb670d162018-08-23 20:01:13 +08002127 } else {
Luke Huangc3252cc2018-10-16 15:43:23 +08002128 EXPECT_EQ(binder::Status::EX_SERVICE_SPECIFIC, status.exceptionCode());
2129 EXPECT_NE(0, status.serviceSpecificErrorCode());
Luke Huangb670d162018-08-23 20:01:13 +08002130 }
2131
Luke Huangc3252cc2018-10-16 15:43:23 +08002132 // Add system permission for test uid, route will be added into legacy system table.
2133 EXPECT_TRUE(mNetd->networkSetPermissionForUser(INetd::PERMISSION_SYSTEM, testUids).isOk());
Luke Huangb670d162018-08-23 20:01:13 +08002134
2135 status = mNetd->networkAddLegacyRoute(TEST_NETID1, sTun.name(), td.testDest, td.testNextHop,
2136 testUid);
2137 if (td.expectSuccess) {
2138 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
Luke Huangc3252cc2018-10-16 15:43:23 +08002139 expectNetworkRouteExists(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
Luke Huangb670d162018-08-23 20:01:13 +08002140 testTableLegacySystem);
2141 } else {
Luke Huangc3252cc2018-10-16 15:43:23 +08002142 EXPECT_EQ(binder::Status::EX_SERVICE_SPECIFIC, status.exceptionCode());
2143 EXPECT_NE(0, status.serviceSpecificErrorCode());
Luke Huangb670d162018-08-23 20:01:13 +08002144 }
2145
2146 status = mNetd->networkRemoveLegacyRoute(TEST_NETID1, sTun.name(), td.testDest,
2147 td.testNextHop, testUid);
2148 if (td.expectSuccess) {
2149 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
Luke Huangc3252cc2018-10-16 15:43:23 +08002150 expectNetworkRouteDoesNotExist(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
2151 testTableLegacySystem);
Luke Huangb670d162018-08-23 20:01:13 +08002152 } else {
Luke Huangc3252cc2018-10-16 15:43:23 +08002153 EXPECT_EQ(binder::Status::EX_SERVICE_SPECIFIC, status.exceptionCode());
2154 EXPECT_NE(0, status.serviceSpecificErrorCode());
Luke Huangb670d162018-08-23 20:01:13 +08002155 }
2156
Luke Huangc3252cc2018-10-16 15:43:23 +08002157 // Remove system permission for test uid, route will be added into legacy network table.
2158 EXPECT_TRUE(mNetd->networkClearPermissionForUser(testUids).isOk());
2159
2160 status = mNetd->networkAddLegacyRoute(TEST_NETID1, sTun.name(), td.testDest, td.testNextHop,
2161 testUid);
2162 if (td.expectSuccess) {
2163 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2164 expectNetworkRouteExists(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
2165 testTableLegacyNetwork);
2166 } else {
2167 EXPECT_EQ(binder::Status::EX_SERVICE_SPECIFIC, status.exceptionCode());
2168 EXPECT_NE(0, status.serviceSpecificErrorCode());
2169 }
2170
2171 status = mNetd->networkRemoveLegacyRoute(TEST_NETID1, sTun.name(), td.testDest,
2172 td.testNextHop, testUid);
2173 if (td.expectSuccess) {
2174 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2175 expectNetworkRouteDoesNotExist(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
2176 testTableLegacyNetwork);
2177 } else {
2178 EXPECT_EQ(binder::Status::EX_SERVICE_SPECIFIC, status.exceptionCode());
2179 EXPECT_NE(0, status.serviceSpecificErrorCode());
2180 }
Luke Huangb670d162018-08-23 20:01:13 +08002181 }
2182
Taras Antoshchuk8fba2bb2021-09-24 18:37:17 +02002183 /*
2184 * Test networkUpdateRouteParcel behavior in case of route MTU change.
2185 *
2186 * Change of route MTU should be treated as an update of the route:
2187 * - networkUpdateRouteParcel should succeed and update route MTU.
2188 */
Tyler Wearfa94a272019-12-05 15:01:48 -08002189 for (size_t i = 0; i < std::size(kTestData); i++) {
2190 const auto& td = kTestData[i];
2191 int mtu = (i % 2) ? 1480 : 1280;
2192
2193 android::net::RouteInfoParcel parcel;
2194 parcel.ifName = sTun.name();
2195 parcel.destination = td.testDest;
2196 parcel.nextHop = td.testNextHop;
2197 parcel.mtu = mtu;
2198 binder::Status status = mNetd->networkAddRouteParcel(TEST_NETID1, parcel);
2199 if (td.expectSuccess) {
2200 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2201 expectNetworkRouteExistsWithMtu(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
2202 std::to_string(parcel.mtu), sTun.name().c_str());
2203 } else {
2204 EXPECT_EQ(binder::Status::EX_SERVICE_SPECIFIC, status.exceptionCode());
2205 EXPECT_NE(0, status.serviceSpecificErrorCode());
2206 }
2207
2208 parcel.mtu = 1337;
2209 status = mNetd->networkUpdateRouteParcel(TEST_NETID1, parcel);
2210 if (td.expectSuccess) {
2211 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2212 expectNetworkRouteExistsWithMtu(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
2213 std::to_string(parcel.mtu), sTun.name().c_str());
2214 } else {
2215 EXPECT_EQ(binder::Status::EX_SERVICE_SPECIFIC, status.exceptionCode());
2216 EXPECT_NE(0, status.serviceSpecificErrorCode());
2217 }
2218
2219 status = mNetd->networkRemoveRouteParcel(TEST_NETID1, parcel);
2220 if (td.expectSuccess) {
2221 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2222 expectNetworkRouteDoesNotExist(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
2223 sTun.name().c_str());
2224 } else {
2225 EXPECT_EQ(binder::Status::EX_SERVICE_SPECIFIC, status.exceptionCode());
2226 EXPECT_NE(0, status.serviceSpecificErrorCode());
2227 }
2228 }
Taras Antoshchuk8fba2bb2021-09-24 18:37:17 +02002229
2230 /*
2231 * Test network[Update|Add]RouteParcel behavior in case of route type change.
2232 *
2233 * Change of route type should be treated as an update of the route:
2234 * - networkUpdateRouteParcel should succeed and update route type.
2235 * - networkAddRouteParcel should silently fail, because the route already exists. Route type
2236 * should not be changed in this case.
2237 */
2238 for (size_t i = 0; i < std::size(kTestData); i++) {
2239 const auto& td = kTestData[i];
2240
2241 if (!td.expectSuccess) {
2242 continue;
2243 }
2244
2245 android::net::RouteInfoParcel parcel;
2246 parcel.ifName = sTun.name();
2247 parcel.destination = td.testDest;
2248 parcel.nextHop = td.testNextHop;
2249 parcel.mtu = 1280;
2250 binder::Status status = mNetd->networkAddRouteParcel(TEST_NETID1, parcel);
2251 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2252 expectNetworkRouteExistsWithMtu(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
2253 std::to_string(parcel.mtu), sTun.name().c_str());
2254
2255 parcel.nextHop = parcel.nextHop == "throw" ? "unreachable" : "throw";
2256 const char* oldNextHop = td.testNextHop;
2257 const char* newNextHop = parcel.nextHop.c_str();
2258
2259 // Trying to add same route with changed type, this should silently fail.
2260 status = mNetd->networkAddRouteParcel(TEST_NETID1, parcel);
2261 // No error reported.
2262 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2263 // Old route still exists.
2264 expectNetworkRouteExistsWithMtu(td.ipVersion, sTun.name(), td.testDest, oldNextHop,
2265 std::to_string(parcel.mtu), sTun.name().c_str());
2266 // New route was not actually added.
2267 expectNetworkRouteDoesNotExistWithMtu(td.ipVersion, sTun.name(), td.testDest, newNextHop,
2268 std::to_string(parcel.mtu), sTun.name().c_str());
2269
2270 // Update should succeed.
2271 status = mNetd->networkUpdateRouteParcel(TEST_NETID1, parcel);
2272 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2273 expectNetworkRouteExistsWithMtu(td.ipVersion, sTun.name(), td.testDest, newNextHop,
2274 std::to_string(parcel.mtu), sTun.name().c_str());
2275 expectNetworkRouteDoesNotExistWithMtu(td.ipVersion, sTun.name(), td.testDest, oldNextHop,
2276 std::to_string(parcel.mtu), sTun.name().c_str());
2277
2278 status = mNetd->networkRemoveRouteParcel(TEST_NETID1, parcel);
2279 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2280 expectNetworkRouteDoesNotExistWithMtu(td.ipVersion, sTun.name(), td.testDest, newNextHop,
2281 std::to_string(parcel.mtu), sTun.name().c_str());
2282 }
2283
Luke Huangb670d162018-08-23 20:01:13 +08002284 // Remove test physical network
2285 EXPECT_TRUE(mNetd->networkDestroy(TEST_NETID1).isOk());
2286}
2287
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09002288TEST_F(NetdBinderTest, NetworkPermissionDefault) {
Luke Huangb670d162018-08-23 20:01:13 +08002289 // Add test physical network
Ken Chenab5f3472021-04-04 11:28:06 +08002290 const auto& config = makeNativeNetworkConfig(TEST_NETID1, NativeNetworkType::PHYSICAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +08002291 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08002292 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Luke Huangb670d162018-08-23 20:01:13 +08002293 EXPECT_TRUE(mNetd->networkAddInterface(TEST_NETID1, sTun.name()).isOk());
2294
Luke Huangc3252cc2018-10-16 15:43:23 +08002295 // Get current default network NetId
Luke Huangd2861982019-05-17 19:47:28 +08002296 binder::Status status = mNetd->networkGetDefault(&mStoredDefaultNetwork);
2297 ASSERT_TRUE(status.isOk()) << status.exceptionMessage();
Luke Huangb670d162018-08-23 20:01:13 +08002298
2299 // Test SetDefault
2300 status = mNetd->networkSetDefault(TEST_NETID1);
2301 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2302 expectNetworkDefaultIpRuleExists(sTun.name().c_str());
2303
2304 status = mNetd->networkClearDefault();
2305 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2306 expectNetworkDefaultIpRuleDoesNotExist();
2307
Luke Huangd2861982019-05-17 19:47:28 +08002308 // Set default network back
2309 status = mNetd->networkSetDefault(mStoredDefaultNetwork);
Luke Huangb670d162018-08-23 20:01:13 +08002310 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2311
2312 // Test SetPermission
2313 status = mNetd->networkSetPermissionForNetwork(TEST_NETID1, INetd::PERMISSION_SYSTEM);
2314 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2315 expectNetworkPermissionIpRuleExists(sTun.name().c_str(), INetd::PERMISSION_SYSTEM);
2316 expectNetworkPermissionIptablesRuleExists(sTun.name().c_str(), INetd::PERMISSION_SYSTEM);
2317
2318 status = mNetd->networkSetPermissionForNetwork(TEST_NETID1, INetd::PERMISSION_NONE);
2319 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2320 expectNetworkPermissionIpRuleExists(sTun.name().c_str(), INetd::PERMISSION_NONE);
2321 expectNetworkPermissionIptablesRuleExists(sTun.name().c_str(), INetd::PERMISSION_NONE);
2322
2323 // Remove test physical network
2324 EXPECT_TRUE(mNetd->networkDestroy(TEST_NETID1).isOk());
2325}
2326
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09002327TEST_F(NetdBinderTest, NetworkSetProtectAllowDeny) {
Luke Huang854e2992019-05-29 16:42:48 +08002328 binder::Status status = mNetd->networkSetProtectAllow(TEST_UID1);
Luke Huangb670d162018-08-23 20:01:13 +08002329 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2330 bool ret = false;
Luke Huang854e2992019-05-29 16:42:48 +08002331 status = mNetd->networkCanProtect(TEST_UID1, &ret);
Luke Huangb670d162018-08-23 20:01:13 +08002332 EXPECT_TRUE(ret);
2333
Luke Huang854e2992019-05-29 16:42:48 +08002334 status = mNetd->networkSetProtectDeny(TEST_UID1);
Luke Huangb670d162018-08-23 20:01:13 +08002335 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
Luke Huang854e2992019-05-29 16:42:48 +08002336
2337 // Clear uid permission before calling networkCanProtect to ensure
2338 // the call won't be affected by uid permission.
2339 EXPECT_TRUE(mNetd->networkClearPermissionForUser({TEST_UID1}).isOk());
2340
2341 status = mNetd->networkCanProtect(TEST_UID1, &ret);
Luke Huangb670d162018-08-23 20:01:13 +08002342 EXPECT_FALSE(ret);
2343}
2344
2345namespace {
2346
Luke Huangb5733d72018-08-21 17:17:19 +08002347int readIntFromPath(const std::string& path) {
2348 std::string result = "";
2349 EXPECT_TRUE(ReadFileToString(path, &result));
2350 return std::stoi(result);
2351}
2352
2353int getTetherAcceptIPv6Ra(const std::string& ifName) {
2354 std::string path = StringPrintf("/proc/sys/net/ipv6/conf/%s/accept_ra", ifName.c_str());
2355 return readIntFromPath(path);
2356}
2357
2358bool getTetherAcceptIPv6Dad(const std::string& ifName) {
2359 std::string path = StringPrintf("/proc/sys/net/ipv6/conf/%s/accept_dad", ifName.c_str());
2360 return readIntFromPath(path);
2361}
2362
2363int getTetherIPv6DadTransmits(const std::string& ifName) {
2364 std::string path = StringPrintf("/proc/sys/net/ipv6/conf/%s/dad_transmits", ifName.c_str());
2365 return readIntFromPath(path);
2366}
2367
2368bool getTetherEnableIPv6(const std::string& ifName) {
2369 std::string path = StringPrintf("/proc/sys/net/ipv6/conf/%s/disable_ipv6", ifName.c_str());
2370 int disableIPv6 = readIntFromPath(path);
2371 return !disableIPv6;
2372}
2373
2374bool interfaceListContains(const std::vector<std::string>& ifList, const std::string& ifName) {
2375 for (const auto& iface : ifList) {
2376 if (iface == ifName) {
2377 return true;
2378 }
2379 }
2380 return false;
2381}
2382
2383void expectTetherInterfaceConfigureForIPv6Router(const std::string& ifName) {
2384 EXPECT_EQ(getTetherAcceptIPv6Ra(ifName), 0);
2385 EXPECT_FALSE(getTetherAcceptIPv6Dad(ifName));
2386 EXPECT_EQ(getTetherIPv6DadTransmits(ifName), 0);
2387 EXPECT_TRUE(getTetherEnableIPv6(ifName));
2388}
2389
2390void expectTetherInterfaceConfigureForIPv6Client(const std::string& ifName) {
2391 EXPECT_EQ(getTetherAcceptIPv6Ra(ifName), 2);
2392 EXPECT_TRUE(getTetherAcceptIPv6Dad(ifName));
2393 EXPECT_EQ(getTetherIPv6DadTransmits(ifName), 1);
2394 EXPECT_FALSE(getTetherEnableIPv6(ifName));
2395}
2396
2397void expectTetherInterfaceExists(const std::vector<std::string>& ifList,
2398 const std::string& ifName) {
2399 EXPECT_TRUE(interfaceListContains(ifList, ifName));
2400}
2401
2402void expectTetherInterfaceNotExists(const std::vector<std::string>& ifList,
2403 const std::string& ifName) {
2404 EXPECT_FALSE(interfaceListContains(ifList, ifName));
2405}
2406
2407void expectTetherDnsListEquals(const std::vector<std::string>& dnsList,
2408 const std::vector<std::string>& testDnsAddrs) {
2409 EXPECT_TRUE(dnsList == testDnsAddrs);
2410}
2411
2412} // namespace
2413
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09002414TEST_F(NetdBinderTest, TetherStartStopStatus) {
Luke Huangb5733d72018-08-21 17:17:19 +08002415 std::vector<std::string> noDhcpRange = {};
Luke Huang91bd3e12019-08-20 11:33:52 +08002416 for (bool usingLegacyDnsProxy : {true, false}) {
Chiachang Wang08cb2112019-12-10 09:53:24 +08002417 android::net::TetherConfigParcel config;
2418 config.usingLegacyDnsProxy = usingLegacyDnsProxy;
2419 config.dhcpRanges = noDhcpRange;
2420 binder::Status status = mNetd->tetherStartWithConfiguration(config);
Luke Huang91bd3e12019-08-20 11:33:52 +08002421 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2422 SCOPED_TRACE(StringPrintf("usingLegacyDnsProxy: %d", usingLegacyDnsProxy));
2423 if (usingLegacyDnsProxy == true) {
Lorenzo Colitti1b213742020-03-27 17:50:19 +09002424 expectProcessExists(DNSMASQ);
Luke Huang91bd3e12019-08-20 11:33:52 +08002425 } else {
Lorenzo Colitti1b213742020-03-27 17:50:19 +09002426 expectProcessDoesNotExist(DNSMASQ);
Luke Huang91bd3e12019-08-20 11:33:52 +08002427 }
Luke Huangb5733d72018-08-21 17:17:19 +08002428
Luke Huang91bd3e12019-08-20 11:33:52 +08002429 bool tetherEnabled;
2430 status = mNetd->tetherIsEnabled(&tetherEnabled);
2431 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2432 EXPECT_TRUE(tetherEnabled);
Luke Huangb5733d72018-08-21 17:17:19 +08002433
Luke Huang91bd3e12019-08-20 11:33:52 +08002434 status = mNetd->tetherStop();
2435 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
Lorenzo Colitti1b213742020-03-27 17:50:19 +09002436 expectProcessDoesNotExist(DNSMASQ);
Luke Huangb5733d72018-08-21 17:17:19 +08002437
Luke Huang91bd3e12019-08-20 11:33:52 +08002438 status = mNetd->tetherIsEnabled(&tetherEnabled);
2439 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2440 EXPECT_FALSE(tetherEnabled);
2441 }
Luke Huangb5733d72018-08-21 17:17:19 +08002442}
2443
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09002444TEST_F(NetdBinderTest, TetherInterfaceAddRemoveList) {
Luke Huangb5733d72018-08-21 17:17:19 +08002445 // TODO: verify if dnsmasq update interface successfully
2446
2447 binder::Status status = mNetd->tetherInterfaceAdd(sTun.name());
2448 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2449 expectTetherInterfaceConfigureForIPv6Router(sTun.name());
2450
2451 std::vector<std::string> ifList;
2452 status = mNetd->tetherInterfaceList(&ifList);
2453 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2454 expectTetherInterfaceExists(ifList, sTun.name());
2455
2456 status = mNetd->tetherInterfaceRemove(sTun.name());
2457 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2458 expectTetherInterfaceConfigureForIPv6Client(sTun.name());
2459
2460 status = mNetd->tetherInterfaceList(&ifList);
2461 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2462 expectTetherInterfaceNotExists(ifList, sTun.name());
2463}
2464
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09002465TEST_F(NetdBinderTest, TetherDnsSetList) {
Luke Huangb5733d72018-08-21 17:17:19 +08002466 // TODO: verify if dnsmasq update dns successfully
Luke Huang8dc1cac2019-03-30 16:12:31 +08002467 std::vector<std::string> testDnsAddrs = {"192.168.1.37", "213.137.100.3",
2468 "fe80::1%" + sTun.name()};
Luke Huangb5733d72018-08-21 17:17:19 +08002469
2470 binder::Status status = mNetd->tetherDnsSet(TEST_NETID1, testDnsAddrs);
2471 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2472
2473 std::vector<std::string> dnsList;
2474 status = mNetd->tetherDnsList(&dnsList);
2475 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2476 expectTetherDnsListEquals(dnsList, testDnsAddrs);
Luke Huange64fa382018-07-24 16:38:22 +08002477}
2478
2479namespace {
2480
Lorenzo Colitti1b213742020-03-27 17:50:19 +09002481std::vector<IPAddress> findDnsSockets(SockDiag* sd, unsigned numExpected) {
2482 std::vector<IPAddress> listenAddrs;
2483
2484 // Callback lambda that finds all IPv4 sockets with source port 53.
2485 auto findDnsSockets = [&](uint8_t /* proto */, const inet_diag_msg* msg) {
2486 // Always return false, which means do not destroy this socket.
2487 if (msg->id.idiag_sport != htons(53)) return false;
2488 IPAddress addr(*(in_addr*)msg->id.idiag_src);
2489 listenAddrs.push_back(addr);
2490 return false;
2491 };
2492
2493 // There is no way to know if dnsmasq has finished processing the update_interfaces command and
2494 // opened listening sockets. So, just spin a few times and return the first list of sockets
2495 // that is at least numExpected long.
Lorenzo Colittif12027e2020-04-30 14:06:10 +09002496 // Pick a relatively large timeout to avoid flaky tests, particularly when running on shared
2497 // devices.
2498 constexpr int kMaxAttempts = 50;
Lorenzo Colitti1b213742020-03-27 17:50:19 +09002499 constexpr int kSleepMs = 100;
2500 for (int i = 0; i < kMaxAttempts; i++) {
2501 listenAddrs.clear();
2502 EXPECT_EQ(0, sd->sendDumpRequest(IPPROTO_TCP, AF_INET, 1 << TCP_LISTEN))
2503 << "Failed to dump sockets, attempt " << i << " of " << kMaxAttempts;
2504 sd->readDiagMsg(IPPROTO_TCP, findDnsSockets);
2505 if (listenAddrs.size() >= numExpected) {
2506 break;
2507 }
2508 usleep(kSleepMs * 1000);
2509 }
2510
2511 return listenAddrs;
2512}
2513
2514} // namespace
2515
2516// Checks that when starting dnsmasq on an interface that no longer exists, it doesn't attempt to
2517// start on other interfaces instead.
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09002518TEST_F(NetdBinderTest, TetherDeletedInterface) {
Lorenzo Colitti1b213742020-03-27 17:50:19 +09002519 // Do this first so we don't need to clean up anything else if it fails.
2520 SockDiag sd;
2521 ASSERT_TRUE(sd.open()) << "Failed to open SOCK_DIAG socket";
2522
2523 // Create our own TunInterfaces (so we can delete them without affecting other tests), and add
2524 // IP addresses to them. They must be IPv4 because tethering an interface disables and
2525 // re-enables IPv6 on the interface, which clears all addresses.
2526 TunInterface tun1, tun2;
2527 ASSERT_EQ(0, tun1.init());
2528 ASSERT_EQ(0, tun2.init());
2529
2530 // Clean up. It is safe to call TunInterface::destroy multiple times.
2531 auto guard = android::base::make_scope_guard([&] {
2532 tun1.destroy();
2533 tun2.destroy();
2534 mNetd->tetherStop();
2535 mNetd->tetherInterfaceRemove(tun1.name());
2536 mNetd->tetherInterfaceRemove(tun2.name());
2537 });
2538
2539 IPAddress addr1, addr2;
2540 ASSERT_TRUE(IPAddress::forString("192.0.2.1", &addr1));
2541 ASSERT_TRUE(IPAddress::forString("192.0.2.2", &addr2));
2542 EXPECT_EQ(0, tun1.addAddress(addr1.toString(), 32));
2543 EXPECT_EQ(0, tun2.addAddress(addr2.toString(), 32));
2544
2545 // Stop tethering.
2546 binder::Status status = mNetd->tetherStop();
2547 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2548
2549 // Start dnsmasq on an interface that doesn't exist.
2550 // First, tether our tun interface...
2551 status = mNetd->tetherInterfaceAdd(tun1.name());
2552 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2553 expectTetherInterfaceConfigureForIPv6Router(tun1.name());
2554
2555 // ... then delete it...
2556 tun1.destroy();
2557
2558 // ... then start dnsmasq.
2559 android::net::TetherConfigParcel config;
2560 config.usingLegacyDnsProxy = true;
2561 config.dhcpRanges = {};
2562 status = mNetd->tetherStartWithConfiguration(config);
2563 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2564
2565 // Wait for dnsmasq to start.
2566 expectProcessExists(DNSMASQ);
2567
2568 // Make sure that netd thinks the interface is tethered (even though it doesn't exist).
2569 std::vector<std::string> ifList;
2570 status = mNetd->tetherInterfaceList(&ifList);
2571 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2572 ASSERT_EQ(1U, ifList.size());
2573 EXPECT_EQ(tun1.name(), ifList[0]);
2574
2575 // Give dnsmasq some time to start up.
2576 usleep(200 * 1000);
2577
2578 // Check that dnsmasq is not listening on any IP addresses. It shouldn't, because it was only
2579 // told to run on tun1, and tun1 does not exist. Ensure it stays running and doesn't listen on
2580 // any IP addresses.
2581 std::vector<IPAddress> listenAddrs = findDnsSockets(&sd, 0);
2582 EXPECT_EQ(0U, listenAddrs.size()) << "Unexpectedly found IPv4 socket(s) listening on port 53";
2583
2584 // Now add an interface to dnsmasq and check that we can see the sockets. This confirms that
2585 // findDnsSockets is actually able to see sockets when they exist.
2586 status = mNetd->tetherInterfaceAdd(tun2.name());
2587 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2588
2589 in_addr loopback = {htonl(INADDR_LOOPBACK)};
2590 listenAddrs = findDnsSockets(&sd, 2);
2591 EXPECT_EQ(2U, listenAddrs.size()) << "Expected exactly 2 IPv4 sockets listening on port 53";
2592 EXPECT_EQ(1, std::count(listenAddrs.begin(), listenAddrs.end(), addr2));
2593 EXPECT_EQ(1, std::count(listenAddrs.begin(), listenAddrs.end(), IPAddress(loopback)));
2594
2595 // Clean up.
2596 status = mNetd->tetherStop();
2597 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2598
2599 expectProcessDoesNotExist(DNSMASQ);
2600
2601 status = mNetd->tetherInterfaceRemove(tun1.name());
2602 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2603
2604 status = mNetd->tetherInterfaceRemove(tun2.name());
2605 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2606}
2607
2608namespace {
2609
Luke Huange64fa382018-07-24 16:38:22 +08002610constexpr char FIREWALL_INPUT[] = "fw_INPUT";
2611constexpr char FIREWALL_OUTPUT[] = "fw_OUTPUT";
2612constexpr char FIREWALL_FORWARD[] = "fw_FORWARD";
Luke Huange64fa382018-07-24 16:38:22 +08002613
Lorenzo Colitticdd79f12020-07-30 12:03:40 +09002614void expectFirewallAllowlistMode() {
Luke Huange64fa382018-07-24 16:38:22 +08002615 static const char dropRule[] = "DROP all";
2616 static const char rejectRule[] = "REJECT all";
2617 for (const auto& binary : {IPTABLES_PATH, IP6TABLES_PATH}) {
2618 EXPECT_TRUE(iptablesRuleExists(binary, FIREWALL_INPUT, dropRule));
2619 EXPECT_TRUE(iptablesRuleExists(binary, FIREWALL_OUTPUT, rejectRule));
2620 EXPECT_TRUE(iptablesRuleExists(binary, FIREWALL_FORWARD, rejectRule));
2621 }
2622}
2623
Lorenzo Colitticdd79f12020-07-30 12:03:40 +09002624void expectFirewallDenylistMode() {
Maciej Żenczykowski344bb892021-10-14 20:22:23 -07002625 EXPECT_EQ(2, iptablesRuleLineLength(IPTABLES_PATH, FIREWALL_INPUT));
2626 EXPECT_EQ(2, iptablesRuleLineLength(IPTABLES_PATH, FIREWALL_OUTPUT));
2627 EXPECT_EQ(2, iptablesRuleLineLength(IPTABLES_PATH, FIREWALL_FORWARD));
2628
2629 // for IPv6 there is an extra OUTPUT rule to DROP ::1 sourced packets to non-loopback devices
2630 EXPECT_EQ(2, iptablesRuleLineLength(IP6TABLES_PATH, FIREWALL_INPUT));
2631 EXPECT_EQ(3, iptablesRuleLineLength(IP6TABLES_PATH, FIREWALL_OUTPUT));
2632 EXPECT_EQ(2, iptablesRuleLineLength(IP6TABLES_PATH, FIREWALL_FORWARD));
Luke Huange64fa382018-07-24 16:38:22 +08002633}
2634
2635bool iptablesFirewallInterfaceFirstRuleExists(const char* binary, const char* chainName,
2636 const std::string& expectedInterface,
2637 const std::string& expectedRule) {
2638 std::vector<std::string> rules = listIptablesRuleByTable(binary, FILTER_TABLE, chainName);
2639 // Expected rule:
2640 // Chain fw_INPUT (1 references)
2641 // pkts bytes target prot opt in out source destination
2642 // 0 0 RETURN all -- expectedInterface * 0.0.0.0/0 0.0.0.0/0
2643 // 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
2644 int firstRuleIndex = 2;
2645 if (rules.size() < 4) return false;
2646 if (rules[firstRuleIndex].find(expectedInterface) != std::string::npos) {
2647 if (rules[firstRuleIndex].find(expectedRule) != std::string::npos) {
2648 return true;
2649 }
2650 }
2651 return false;
2652}
2653
2654// TODO: It is a duplicate function, need to remove it
2655bool iptablesFirewallInterfaceRuleExists(const char* binary, const char* chainName,
2656 const std::string& expectedInterface,
2657 const std::string& expectedRule) {
2658 std::vector<std::string> rules = listIptablesRuleByTable(binary, FILTER_TABLE, chainName);
2659 for (const auto& rule : rules) {
2660 if (rule.find(expectedInterface) != std::string::npos) {
2661 if (rule.find(expectedRule) != std::string::npos) {
2662 return true;
2663 }
2664 }
2665 }
2666 return false;
2667}
2668
2669void expectFirewallInterfaceRuleAllowExists(const std::string& ifname) {
2670 static const char returnRule[] = "RETURN all";
2671 for (const auto& binary : {IPTABLES_PATH, IP6TABLES_PATH}) {
2672 EXPECT_TRUE(iptablesFirewallInterfaceFirstRuleExists(binary, FIREWALL_INPUT, ifname,
2673 returnRule));
2674 EXPECT_TRUE(iptablesFirewallInterfaceFirstRuleExists(binary, FIREWALL_OUTPUT, ifname,
2675 returnRule));
2676 }
2677}
2678
2679void expectFireWallInterfaceRuleAllowDoesNotExist(const std::string& ifname) {
2680 static const char returnRule[] = "RETURN all";
2681 for (const auto& binary : {IPTABLES_PATH, IP6TABLES_PATH}) {
2682 EXPECT_FALSE(
2683 iptablesFirewallInterfaceRuleExists(binary, FIREWALL_INPUT, ifname, returnRule));
2684 EXPECT_FALSE(
2685 iptablesFirewallInterfaceRuleExists(binary, FIREWALL_OUTPUT, ifname, returnRule));
2686 }
2687}
2688
Luke Huange64fa382018-07-24 16:38:22 +08002689} // namespace
2690
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09002691TEST_F(NetdBinderTest, FirewallSetFirewallType) {
Jooyung Hanf3e8bbc2021-01-07 15:38:40 +09002692 binder::Status status = mNetd->firewallSetFirewallType(INetd::FIREWALL_ALLOWLIST);
Luke Huange64fa382018-07-24 16:38:22 +08002693 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
Lorenzo Colitticdd79f12020-07-30 12:03:40 +09002694 expectFirewallAllowlistMode();
Luke Huange64fa382018-07-24 16:38:22 +08002695
Jooyung Hanf3e8bbc2021-01-07 15:38:40 +09002696 status = mNetd->firewallSetFirewallType(INetd::FIREWALL_DENYLIST);
Luke Huange64fa382018-07-24 16:38:22 +08002697 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
Lorenzo Colitticdd79f12020-07-30 12:03:40 +09002698 expectFirewallDenylistMode();
Luke Huange64fa382018-07-24 16:38:22 +08002699
2700 // set firewall type blacklist twice
Jooyung Hanf3e8bbc2021-01-07 15:38:40 +09002701 mNetd->firewallSetFirewallType(INetd::FIREWALL_DENYLIST);
2702 status = mNetd->firewallSetFirewallType(INetd::FIREWALL_DENYLIST);
Luke Huange64fa382018-07-24 16:38:22 +08002703 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
Lorenzo Colitticdd79f12020-07-30 12:03:40 +09002704 expectFirewallDenylistMode();
Luke Huange64fa382018-07-24 16:38:22 +08002705
2706 // set firewall type whitelist twice
Jooyung Hanf3e8bbc2021-01-07 15:38:40 +09002707 mNetd->firewallSetFirewallType(INetd::FIREWALL_ALLOWLIST);
2708 status = mNetd->firewallSetFirewallType(INetd::FIREWALL_ALLOWLIST);
Luke Huange64fa382018-07-24 16:38:22 +08002709 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
Lorenzo Colitticdd79f12020-07-30 12:03:40 +09002710 expectFirewallAllowlistMode();
Luke Huange64fa382018-07-24 16:38:22 +08002711
2712 // reset firewall type to default
Jooyung Hanf3e8bbc2021-01-07 15:38:40 +09002713 status = mNetd->firewallSetFirewallType(INetd::FIREWALL_DENYLIST);
Luke Huange64fa382018-07-24 16:38:22 +08002714 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
Lorenzo Colitticdd79f12020-07-30 12:03:40 +09002715 expectFirewallDenylistMode();
Luke Huange64fa382018-07-24 16:38:22 +08002716}
2717
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09002718TEST_F(NetdBinderTest, FirewallSetInterfaceRule) {
Luke Huange64fa382018-07-24 16:38:22 +08002719 // setinterfaceRule is not supported in BLACKLIST MODE
Jooyung Hanf3e8bbc2021-01-07 15:38:40 +09002720 binder::Status status = mNetd->firewallSetFirewallType(INetd::FIREWALL_DENYLIST);
Luke Huange64fa382018-07-24 16:38:22 +08002721 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2722
2723 status = mNetd->firewallSetInterfaceRule(sTun.name(), INetd::FIREWALL_RULE_ALLOW);
2724 EXPECT_FALSE(status.isOk()) << status.exceptionMessage();
2725
2726 // set WHITELIST mode first
Jooyung Hanf3e8bbc2021-01-07 15:38:40 +09002727 status = mNetd->firewallSetFirewallType(INetd::FIREWALL_ALLOWLIST);
Luke Huange64fa382018-07-24 16:38:22 +08002728 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2729
2730 status = mNetd->firewallSetInterfaceRule(sTun.name(), INetd::FIREWALL_RULE_ALLOW);
2731 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2732 expectFirewallInterfaceRuleAllowExists(sTun.name());
2733
2734 status = mNetd->firewallSetInterfaceRule(sTun.name(), INetd::FIREWALL_RULE_DENY);
2735 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2736 expectFireWallInterfaceRuleAllowDoesNotExist(sTun.name());
2737
2738 // reset firewall mode to default
Jooyung Hanf3e8bbc2021-01-07 15:38:40 +09002739 status = mNetd->firewallSetFirewallType(INetd::FIREWALL_DENYLIST);
Luke Huange64fa382018-07-24 16:38:22 +08002740 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
Lorenzo Colitticdd79f12020-07-30 12:03:40 +09002741 expectFirewallDenylistMode();
Luke Huange64fa382018-07-24 16:38:22 +08002742}
2743
Luke Huangf7782042018-08-08 13:13:04 +08002744namespace {
2745
2746std::string hwAddrToStr(unsigned char* hwaddr) {
2747 return StringPrintf("%02x:%02x:%02x:%02x:%02x:%02x", hwaddr[0], hwaddr[1], hwaddr[2], hwaddr[3],
2748 hwaddr[4], hwaddr[5]);
2749}
2750
2751int ipv4NetmaskToPrefixLength(in_addr_t mask) {
2752 int prefixLength = 0;
2753 uint32_t m = ntohl(mask);
2754 while (m & (1 << 31)) {
2755 prefixLength++;
2756 m = m << 1;
2757 }
2758 return prefixLength;
2759}
2760
2761std::string toStdString(const String16& s) {
2762 return std::string(String8(s.string()));
2763}
2764
2765android::netdutils::StatusOr<ifreq> ioctlByIfName(const std::string& ifName, unsigned long flag) {
2766 const auto& sys = sSyscalls.get();
2767 auto fd = sys.socket(AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0);
2768 EXPECT_TRUE(isOk(fd.status()));
2769
2770 struct ifreq ifr = {};
2771 strlcpy(ifr.ifr_name, ifName.c_str(), IFNAMSIZ);
2772
2773 return sys.ioctl(fd.value(), flag, &ifr);
2774}
2775
2776std::string getInterfaceHwAddr(const std::string& ifName) {
2777 auto res = ioctlByIfName(ifName, SIOCGIFHWADDR);
2778
2779 unsigned char hwaddr[ETH_ALEN] = {};
2780 if (isOk(res.status())) {
2781 memcpy((void*) hwaddr, &res.value().ifr_hwaddr.sa_data, ETH_ALEN);
2782 }
2783
2784 return hwAddrToStr(hwaddr);
2785}
2786
2787int getInterfaceIPv4Prefix(const std::string& ifName) {
2788 auto res = ioctlByIfName(ifName, SIOCGIFNETMASK);
2789
2790 int prefixLength = 0;
2791 if (isOk(res.status())) {
2792 prefixLength = ipv4NetmaskToPrefixLength(
2793 ((struct sockaddr_in*) &res.value().ifr_addr)->sin_addr.s_addr);
2794 }
2795
2796 return prefixLength;
2797}
2798
2799std::string getInterfaceIPv4Addr(const std::string& ifName) {
2800 auto res = ioctlByIfName(ifName, SIOCGIFADDR);
2801
2802 struct in_addr addr = {};
2803 if (isOk(res.status())) {
2804 addr.s_addr = ((struct sockaddr_in*) &res.value().ifr_addr)->sin_addr.s_addr;
2805 }
2806
2807 return std::string(inet_ntoa(addr));
2808}
2809
2810std::vector<std::string> getInterfaceFlags(const std::string& ifName) {
2811 auto res = ioctlByIfName(ifName, SIOCGIFFLAGS);
2812
2813 unsigned flags = 0;
2814 if (isOk(res.status())) {
2815 flags = res.value().ifr_flags;
2816 }
2817
2818 std::vector<std::string> ifFlags;
2819 ifFlags.push_back(flags & IFF_UP ? toStdString(INetd::IF_STATE_UP())
2820 : toStdString(INetd::IF_STATE_DOWN()));
2821
2822 if (flags & IFF_BROADCAST) ifFlags.push_back(toStdString(INetd::IF_FLAG_BROADCAST()));
2823 if (flags & IFF_LOOPBACK) ifFlags.push_back(toStdString(INetd::IF_FLAG_LOOPBACK()));
2824 if (flags & IFF_POINTOPOINT) ifFlags.push_back(toStdString(INetd::IF_FLAG_POINTOPOINT()));
2825 if (flags & IFF_RUNNING) ifFlags.push_back(toStdString(INetd::IF_FLAG_RUNNING()));
2826 if (flags & IFF_MULTICAST) ifFlags.push_back(toStdString(INetd::IF_FLAG_MULTICAST()));
2827
2828 return ifFlags;
2829}
2830
2831bool compareListInterface(const std::vector<std::string>& interfaceList) {
waynema5851b032021-11-24 17:08:25 +08002832 const auto& res = getIfaceNames();
Luke Huangf7782042018-08-08 13:13:04 +08002833 EXPECT_TRUE(isOk(res));
2834
2835 std::vector<std::string> resIfList;
2836 resIfList.reserve(res.value().size());
2837 resIfList.insert(end(resIfList), begin(res.value()), end(res.value()));
2838
2839 return resIfList == interfaceList;
2840}
2841
2842int getInterfaceIPv6PrivacyExtensions(const std::string& ifName) {
2843 std::string path = StringPrintf("/proc/sys/net/ipv6/conf/%s/use_tempaddr", ifName.c_str());
2844 return readIntFromPath(path);
2845}
2846
2847bool getInterfaceEnableIPv6(const std::string& ifName) {
2848 std::string path = StringPrintf("/proc/sys/net/ipv6/conf/%s/disable_ipv6", ifName.c_str());
2849
2850 int disableIPv6 = readIntFromPath(path);
2851 return !disableIPv6;
2852}
2853
2854int getInterfaceMtu(const std::string& ifName) {
2855 std::string path = StringPrintf("/sys/class/net/%s/mtu", ifName.c_str());
2856 return readIntFromPath(path);
2857}
2858
2859void expectInterfaceList(const std::vector<std::string>& interfaceList) {
2860 EXPECT_TRUE(compareListInterface(interfaceList));
2861}
2862
2863void expectCurrentInterfaceConfigurationEquals(const std::string& ifName,
2864 const InterfaceConfigurationParcel& interfaceCfg) {
2865 EXPECT_EQ(getInterfaceIPv4Addr(ifName), interfaceCfg.ipv4Addr);
2866 EXPECT_EQ(getInterfaceIPv4Prefix(ifName), interfaceCfg.prefixLength);
2867 EXPECT_EQ(getInterfaceHwAddr(ifName), interfaceCfg.hwAddr);
2868 EXPECT_EQ(getInterfaceFlags(ifName), interfaceCfg.flags);
2869}
2870
2871void expectCurrentInterfaceConfigurationAlmostEqual(const InterfaceConfigurationParcel& setCfg) {
2872 EXPECT_EQ(getInterfaceIPv4Addr(setCfg.ifName), setCfg.ipv4Addr);
2873 EXPECT_EQ(getInterfaceIPv4Prefix(setCfg.ifName), setCfg.prefixLength);
2874
2875 const auto& ifFlags = getInterfaceFlags(setCfg.ifName);
2876 for (const auto& flag : setCfg.flags) {
2877 EXPECT_TRUE(std::find(ifFlags.begin(), ifFlags.end(), flag) != ifFlags.end());
2878 }
2879}
2880
2881void expectInterfaceIPv6PrivacyExtensions(const std::string& ifName, bool enable) {
2882 int v6PrivacyExtensions = getInterfaceIPv6PrivacyExtensions(ifName);
2883 EXPECT_EQ(v6PrivacyExtensions, enable ? 2 : 0);
2884}
2885
2886void expectInterfaceNoAddr(const std::string& ifName) {
2887 // noAddr
2888 EXPECT_EQ(getInterfaceIPv4Addr(ifName), "0.0.0.0");
2889 // noPrefix
2890 EXPECT_EQ(getInterfaceIPv4Prefix(ifName), 0);
2891}
2892
2893void expectInterfaceEnableIPv6(const std::string& ifName, bool enable) {
2894 int enableIPv6 = getInterfaceEnableIPv6(ifName);
2895 EXPECT_EQ(enableIPv6, enable);
2896}
2897
2898void expectInterfaceMtu(const std::string& ifName, const int mtu) {
2899 int mtuSize = getInterfaceMtu(ifName);
2900 EXPECT_EQ(mtu, mtuSize);
2901}
2902
2903InterfaceConfigurationParcel makeInterfaceCfgParcel(const std::string& ifName,
2904 const std::string& addr, int prefixLength,
2905 const std::vector<std::string>& flags) {
2906 InterfaceConfigurationParcel cfg;
2907 cfg.ifName = ifName;
2908 cfg.hwAddr = "";
2909 cfg.ipv4Addr = addr;
2910 cfg.prefixLength = prefixLength;
2911 cfg.flags = flags;
2912 return cfg;
2913}
2914
2915void expectTunFlags(const InterfaceConfigurationParcel& interfaceCfg) {
2916 std::vector<std::string> expectedFlags = {"up", "point-to-point", "running", "multicast"};
2917 std::vector<std::string> unexpectedFlags = {"down", "broadcast"};
2918
2919 for (const auto& flag : expectedFlags) {
2920 EXPECT_TRUE(std::find(interfaceCfg.flags.begin(), interfaceCfg.flags.end(), flag) !=
2921 interfaceCfg.flags.end());
2922 }
2923
2924 for (const auto& flag : unexpectedFlags) {
2925 EXPECT_TRUE(std::find(interfaceCfg.flags.begin(), interfaceCfg.flags.end(), flag) ==
2926 interfaceCfg.flags.end());
2927 }
2928}
2929
2930} // namespace
2931
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09002932TEST_F(NetdBinderTest, InterfaceList) {
Luke Huangf7782042018-08-08 13:13:04 +08002933 std::vector<std::string> interfaceListResult;
2934
2935 binder::Status status = mNetd->interfaceGetList(&interfaceListResult);
2936 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2937 expectInterfaceList(interfaceListResult);
2938}
2939
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09002940TEST_F(NetdBinderTest, InterfaceGetCfg) {
Luke Huangf7782042018-08-08 13:13:04 +08002941 InterfaceConfigurationParcel interfaceCfgResult;
2942
2943 // Add test physical network
Ken Chenab5f3472021-04-04 11:28:06 +08002944 const auto& config = makeNativeNetworkConfig(TEST_NETID1, NativeNetworkType::PHYSICAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +08002945 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08002946 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Luke Huangf7782042018-08-08 13:13:04 +08002947 EXPECT_TRUE(mNetd->networkAddInterface(TEST_NETID1, sTun.name()).isOk());
2948
2949 binder::Status status = mNetd->interfaceGetCfg(sTun.name(), &interfaceCfgResult);
2950 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2951 expectCurrentInterfaceConfigurationEquals(sTun.name(), interfaceCfgResult);
2952 expectTunFlags(interfaceCfgResult);
2953
2954 // Remove test physical network
2955 EXPECT_TRUE(mNetd->networkDestroy(TEST_NETID1).isOk());
2956}
2957
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09002958TEST_F(NetdBinderTest, InterfaceSetCfg) {
Luke Huangf7782042018-08-08 13:13:04 +08002959 const std::string testAddr = "192.0.2.3";
2960 const int testPrefixLength = 24;
2961 std::vector<std::string> upFlags = {"up"};
2962 std::vector<std::string> downFlags = {"down"};
2963
2964 // Add test physical network
Ken Chenab5f3472021-04-04 11:28:06 +08002965 const auto& config = makeNativeNetworkConfig(TEST_NETID1, NativeNetworkType::PHYSICAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +08002966 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08002967 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Luke Huangf7782042018-08-08 13:13:04 +08002968 EXPECT_TRUE(mNetd->networkAddInterface(TEST_NETID1, sTun.name()).isOk());
2969
2970 // Set tun interface down.
2971 auto interfaceCfg = makeInterfaceCfgParcel(sTun.name(), testAddr, testPrefixLength, downFlags);
2972 binder::Status status = mNetd->interfaceSetCfg(interfaceCfg);
2973 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2974 expectCurrentInterfaceConfigurationAlmostEqual(interfaceCfg);
2975
2976 // Set tun interface up again.
2977 interfaceCfg = makeInterfaceCfgParcel(sTun.name(), testAddr, testPrefixLength, upFlags);
2978 status = mNetd->interfaceSetCfg(interfaceCfg);
2979 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2980 status = mNetd->interfaceClearAddrs(sTun.name());
2981 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2982
2983 // Remove test physical network
2984 EXPECT_TRUE(mNetd->networkDestroy(TEST_NETID1).isOk());
2985}
2986
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09002987TEST_F(NetdBinderTest, InterfaceSetIPv6PrivacyExtensions) {
Luke Huangf7782042018-08-08 13:13:04 +08002988 // enable
2989 binder::Status status = mNetd->interfaceSetIPv6PrivacyExtensions(sTun.name(), true);
2990 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2991 expectInterfaceIPv6PrivacyExtensions(sTun.name(), true);
2992
2993 // disable
2994 status = mNetd->interfaceSetIPv6PrivacyExtensions(sTun.name(), false);
2995 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
2996 expectInterfaceIPv6PrivacyExtensions(sTun.name(), false);
2997}
2998
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09002999TEST_F(NetdBinderTest, InterfaceClearAddr) {
Luke Huangf7782042018-08-08 13:13:04 +08003000 const std::string testAddr = "192.0.2.3";
3001 const int testPrefixLength = 24;
3002 std::vector<std::string> noFlags{};
3003
3004 // Add test physical network
Ken Chenab5f3472021-04-04 11:28:06 +08003005 const auto& config = makeNativeNetworkConfig(TEST_NETID1, NativeNetworkType::PHYSICAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +08003006 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08003007 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Luke Huangf7782042018-08-08 13:13:04 +08003008 EXPECT_TRUE(mNetd->networkAddInterface(TEST_NETID1, sTun.name()).isOk());
3009
3010 auto interfaceCfg = makeInterfaceCfgParcel(sTun.name(), testAddr, testPrefixLength, noFlags);
3011 binder::Status status = mNetd->interfaceSetCfg(interfaceCfg);
3012 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
3013 expectCurrentInterfaceConfigurationAlmostEqual(interfaceCfg);
3014
3015 status = mNetd->interfaceClearAddrs(sTun.name());
3016 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
3017 expectInterfaceNoAddr(sTun.name());
3018
3019 // Remove test physical network
3020 EXPECT_TRUE(mNetd->networkDestroy(TEST_NETID1).isOk());
3021}
3022
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09003023TEST_F(NetdBinderTest, InterfaceSetEnableIPv6) {
Luke Huangf7782042018-08-08 13:13:04 +08003024 // Add test physical network
Ken Chenab5f3472021-04-04 11:28:06 +08003025 const auto& config = makeNativeNetworkConfig(TEST_NETID1, NativeNetworkType::PHYSICAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +08003026 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08003027 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Luke Huangf7782042018-08-08 13:13:04 +08003028 EXPECT_TRUE(mNetd->networkAddInterface(TEST_NETID1, sTun.name()).isOk());
3029
3030 // disable
3031 binder::Status status = mNetd->interfaceSetEnableIPv6(sTun.name(), false);
3032 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
3033 expectInterfaceEnableIPv6(sTun.name(), false);
3034
3035 // enable
3036 status = mNetd->interfaceSetEnableIPv6(sTun.name(), true);
3037 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
3038 expectInterfaceEnableIPv6(sTun.name(), true);
3039
3040 // Remove test physical network
3041 EXPECT_TRUE(mNetd->networkDestroy(TEST_NETID1).isOk());
3042}
3043
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09003044TEST_F(NetdBinderTest, InterfaceSetMtu) {
Luke Huangf7782042018-08-08 13:13:04 +08003045 const int testMtu = 1200;
3046
3047 // Add test physical network
Ken Chenab5f3472021-04-04 11:28:06 +08003048 const auto& config = makeNativeNetworkConfig(TEST_NETID1, NativeNetworkType::PHYSICAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +08003049 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08003050 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Luke Huangf7782042018-08-08 13:13:04 +08003051 EXPECT_TRUE(mNetd->networkAddInterface(TEST_NETID1, sTun.name()).isOk());
3052
3053 binder::Status status = mNetd->interfaceSetMtu(sTun.name(), testMtu);
3054 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
3055 expectInterfaceMtu(sTun.name(), testMtu);
3056
3057 // Remove test physical network
3058 EXPECT_TRUE(mNetd->networkDestroy(TEST_NETID1).isOk());
3059}
Luke Huang19b49c52018-10-22 12:12:05 +09003060
3061namespace {
3062
3063constexpr const char TETHER_FORWARD[] = "tetherctrl_FORWARD";
3064constexpr const char TETHER_NAT_POSTROUTING[] = "tetherctrl_nat_POSTROUTING";
Luke Huangae038f82018-11-05 11:17:31 +09003065constexpr const char TETHER_RAW_PREROUTING[] = "tetherctrl_raw_PREROUTING";
Luke Huang19b49c52018-10-22 12:12:05 +09003066constexpr const char TETHER_COUNTERS_CHAIN[] = "tetherctrl_counters";
3067
Luke Huangae038f82018-11-05 11:17:31 +09003068int iptablesCountRules(const char* binary, const char* table, const char* chainName) {
Luke Huang19b49c52018-10-22 12:12:05 +09003069 return listIptablesRuleByTable(binary, table, chainName).size();
3070}
3071
3072bool iptablesChainMatch(const char* binary, const char* table, const char* chainName,
3073 const std::vector<std::string>& targetVec) {
3074 std::vector<std::string> rules = listIptablesRuleByTable(binary, table, chainName);
3075 if (targetVec.size() != rules.size() - 2) {
3076 return false;
3077 }
3078
3079 /*
Luke Huangae038f82018-11-05 11:17:31 +09003080 * Check that the rules match. Note that this function matches substrings, not entire rules,
3081 * because otherwise rules where "pkts" or "bytes" are nonzero would not match.
Luke Huang19b49c52018-10-22 12:12:05 +09003082 * Skip first two lines since rules start from third line.
3083 * Chain chainName (x references)
3084 * pkts bytes target prot opt in out source destination
3085 * ...
3086 */
3087 int rIndex = 2;
3088 for (const auto& target : targetVec) {
3089 if (rules[rIndex].find(target) == std::string::npos) {
3090 return false;
3091 }
3092 rIndex++;
3093 }
3094 return true;
3095}
3096
3097void expectNatEnable(const std::string& intIf, const std::string& extIf) {
3098 std::vector<std::string> postroutingV4Match = {"MASQUERADE"};
3099 std::vector<std::string> preroutingV4Match = {"CT helper ftp", "CT helper pptp"};
3100 std::vector<std::string> forwardV4Match = {
Luke Huangae038f82018-11-05 11:17:31 +09003101 "bw_global_alert", "state RELATED", "state INVALID",
Luke Huang19b49c52018-10-22 12:12:05 +09003102 StringPrintf("tetherctrl_counters all -- %s %s", intIf.c_str(), extIf.c_str()),
3103 "DROP"};
3104
3105 // V4
3106 EXPECT_TRUE(iptablesChainMatch(IPTABLES_PATH, NAT_TABLE, TETHER_NAT_POSTROUTING,
3107 postroutingV4Match));
Luke Huangae038f82018-11-05 11:17:31 +09003108 EXPECT_TRUE(
3109 iptablesChainMatch(IPTABLES_PATH, RAW_TABLE, TETHER_RAW_PREROUTING, preroutingV4Match));
Luke Huang19b49c52018-10-22 12:12:05 +09003110 EXPECT_TRUE(iptablesChainMatch(IPTABLES_PATH, FILTER_TABLE, TETHER_FORWARD, forwardV4Match));
3111
Luke Huangae038f82018-11-05 11:17:31 +09003112 std::vector<std::string> forwardV6Match = {"bw_global_alert", "tetherctrl_counters"};
Luke Huang19b49c52018-10-22 12:12:05 +09003113 std::vector<std::string> preroutingV6Match = {"rpfilter invert"};
3114
3115 // V6
3116 EXPECT_TRUE(iptablesChainMatch(IP6TABLES_PATH, FILTER_TABLE, TETHER_FORWARD, forwardV6Match));
Luke Huangae038f82018-11-05 11:17:31 +09003117 EXPECT_TRUE(iptablesChainMatch(IP6TABLES_PATH, RAW_TABLE, TETHER_RAW_PREROUTING,
3118 preroutingV6Match));
Luke Huang19b49c52018-10-22 12:12:05 +09003119
3120 for (const auto& binary : {IPTABLES_PATH, IP6TABLES_PATH}) {
3121 EXPECT_TRUE(iptablesTargetsExists(binary, 2, FILTER_TABLE, TETHER_COUNTERS_CHAIN, intIf,
3122 extIf));
3123 }
3124}
3125
3126void expectNatDisable() {
3127 // It is the default DROP rule with tethering disable.
3128 // Chain tetherctrl_FORWARD (1 references)
3129 // pkts bytes target prot opt in out source destination
3130 // 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
3131 std::vector<std::string> forwardV4Match = {"DROP"};
3132 EXPECT_TRUE(iptablesChainMatch(IPTABLES_PATH, FILTER_TABLE, TETHER_FORWARD, forwardV4Match));
3133
3134 // We expect that these chains should be empty.
Luke Huangae038f82018-11-05 11:17:31 +09003135 EXPECT_EQ(2, iptablesCountRules(IPTABLES_PATH, NAT_TABLE, TETHER_NAT_POSTROUTING));
3136 EXPECT_EQ(2, iptablesCountRules(IPTABLES_PATH, RAW_TABLE, TETHER_RAW_PREROUTING));
Luke Huang19b49c52018-10-22 12:12:05 +09003137
Luke Huangae038f82018-11-05 11:17:31 +09003138 EXPECT_EQ(2, iptablesCountRules(IP6TABLES_PATH, FILTER_TABLE, TETHER_FORWARD));
3139 EXPECT_EQ(2, iptablesCountRules(IP6TABLES_PATH, RAW_TABLE, TETHER_RAW_PREROUTING));
Luke Huang19b49c52018-10-22 12:12:05 +09003140
3141 // Netd won't clear tether quota rule, we don't care rule in tetherctrl_counters.
3142}
3143
3144} // namespace
3145
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09003146TEST_F(NetdBinderTest, TetherForwardAddRemove) {
Luke Huang19b49c52018-10-22 12:12:05 +09003147 binder::Status status = mNetd->tetherAddForward(sTun.name(), sTun2.name());
3148 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
3149 expectNatEnable(sTun.name(), sTun2.name());
3150
3151 status = mNetd->tetherRemoveForward(sTun.name(), sTun2.name());
3152 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
3153 expectNatDisable();
Luke Huang19b49c52018-10-22 12:12:05 +09003154}
Chenbo Fengf5663d82018-11-08 16:10:48 -08003155
3156namespace {
3157
3158using TripleInt = std::array<int, 3>;
3159
3160TripleInt readProcFileToTripleInt(const std::string& path) {
3161 std::string valueString;
3162 int min, def, max;
3163 EXPECT_TRUE(ReadFileToString(path, &valueString));
3164 EXPECT_EQ(3, sscanf(valueString.c_str(), "%d %d %d", &min, &def, &max));
3165 return {min, def, max};
3166}
3167
3168void updateAndCheckTcpBuffer(sp<INetd>& netd, TripleInt& rmemValues, TripleInt& wmemValues) {
3169 std::string testRmemValues =
3170 StringPrintf("%u %u %u", rmemValues[0], rmemValues[1], rmemValues[2]);
3171 std::string testWmemValues =
3172 StringPrintf("%u %u %u", wmemValues[0], wmemValues[1], wmemValues[2]);
3173 EXPECT_TRUE(netd->setTcpRWmemorySize(testRmemValues, testWmemValues).isOk());
3174
3175 TripleInt newRmemValues = readProcFileToTripleInt(TCP_RMEM_PROC_FILE);
3176 TripleInt newWmemValues = readProcFileToTripleInt(TCP_WMEM_PROC_FILE);
3177
3178 for (int i = 0; i < 3; i++) {
3179 SCOPED_TRACE(StringPrintf("tcp_mem value %d should be equal", i));
3180 EXPECT_EQ(rmemValues[i], newRmemValues[i]);
3181 EXPECT_EQ(wmemValues[i], newWmemValues[i]);
3182 }
3183}
3184
3185} // namespace
3186
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09003187TEST_F(NetdBinderTest, TcpBufferSet) {
Chenbo Fengf5663d82018-11-08 16:10:48 -08003188 TripleInt rmemValue = readProcFileToTripleInt(TCP_RMEM_PROC_FILE);
3189 TripleInt testRmemValue{rmemValue[0] + 42, rmemValue[1] + 42, rmemValue[2] + 42};
3190 TripleInt wmemValue = readProcFileToTripleInt(TCP_WMEM_PROC_FILE);
3191 TripleInt testWmemValue{wmemValue[0] + 42, wmemValue[1] + 42, wmemValue[2] + 42};
3192
3193 updateAndCheckTcpBuffer(mNetd, testRmemValue, testWmemValue);
3194 updateAndCheckTcpBuffer(mNetd, rmemValue, wmemValue);
3195}
Luke Huang528af602018-08-29 19:06:05 +08003196
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09003197TEST_F(NetdBinderTest, UnsolEvents) {
Luke Huang528af602018-08-29 19:06:05 +08003198 auto testUnsolService = android::net::TestUnsolService::start();
3199 std::string oldTunName = sTun.name();
3200 std::string newTunName = "unsolTest";
3201 testUnsolService->tarVec.push_back(oldTunName);
3202 testUnsolService->tarVec.push_back(newTunName);
3203 auto& cv = testUnsolService->getCv();
3204 auto& cvMutex = testUnsolService->getCvMutex();
3205 binder::Status status = mNetd->registerUnsolicitedEventListener(
3206 android::interface_cast<android::net::INetdUnsolicitedEventListener>(testUnsolService));
3207 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
3208
3209 // TODO: Add test for below events
3210 // StrictCleartextDetected / InterfaceDnsServersAdded
3211 // InterfaceClassActivity / QuotaLimitReached / InterfaceAddressRemoved
3212
3213 {
3214 std::unique_lock lock(cvMutex);
3215
3216 // Re-init test Tun, and we expect that we will get some unsol events.
3217 // Use the test Tun device name to verify if we receive its unsol events.
3218 sTun.destroy();
3219 // Use predefined name
3220 sTun.init(newTunName);
3221
3222 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lock, std::chrono::seconds(2)));
3223 }
3224
3225 // bit mask 1101101000
3226 // Test only covers below events currently
3227 const uint32_t kExpectedEvents = InterfaceAddressUpdated | InterfaceAdded | InterfaceRemoved |
3228 InterfaceLinkStatusChanged | RouteChanged;
3229 EXPECT_EQ(kExpectedEvents, testUnsolService->getReceived());
Luke Huangcfd04b22019-03-18 15:53:21 +08003230
3231 // Re-init sTun to clear predefined name
3232 sTun.destroy();
3233 sTun.init();
3234}
3235
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09003236TEST_F(NetdBinderTest, NDC) {
Luke Huangcfd04b22019-03-18 15:53:21 +08003237 struct Command {
3238 const std::string cmdString;
3239 const std::string expectedResult;
3240 };
3241
3242 // clang-format off
3243 // Do not change the commands order
3244 const Command networkCmds[] = {
3245 {StringPrintf("ndc network create %d", TEST_NETID1),
3246 "200 0 success"},
3247 {StringPrintf("ndc network interface add %d %s", TEST_NETID1, sTun.name().c_str()),
3248 "200 0 success"},
3249 {StringPrintf("ndc network interface remove %d %s", TEST_NETID1, sTun.name().c_str()),
3250 "200 0 success"},
3251 {StringPrintf("ndc network interface add %d %s", TEST_NETID2, sTun.name().c_str()),
3252 "400 0 addInterfaceToNetwork() failed (Machine is not on the network)"},
3253 {StringPrintf("ndc network destroy %d", TEST_NETID1),
3254 "200 0 success"},
3255 };
3256
3257 const std::vector<Command> ipfwdCmds = {
3258 {"ndc ipfwd enable " + sTun.name(),
3259 "200 0 ipfwd operation succeeded"},
3260 {"ndc ipfwd disable " + sTun.name(),
3261 "200 0 ipfwd operation succeeded"},
3262 {"ndc ipfwd add lo2 lo3",
3263 "400 0 ipfwd operation failed (No such process)"},
3264 {"ndc ipfwd add " + sTun.name() + " " + sTun2.name(),
3265 "200 0 ipfwd operation succeeded"},
3266 {"ndc ipfwd remove " + sTun.name() + " " + sTun2.name(),
3267 "200 0 ipfwd operation succeeded"},
3268 };
3269
3270 static const struct {
3271 const char* ipVersion;
3272 const char* testDest;
3273 const char* testNextHop;
3274 const bool expectSuccess;
3275 const std::string expectedResult;
3276 } kTestData[] = {
3277 {IP_RULE_V4, "0.0.0.0/0", "", true,
3278 "200 0 success"},
3279 {IP_RULE_V4, "10.251.0.0/16", "", true,
3280 "200 0 success"},
3281 {IP_RULE_V4, "10.251.0.0/16", "fe80::/64", false,
3282 "400 0 addRoute() failed (Invalid argument)",},
3283 {IP_RULE_V6, "::/0", "", true,
3284 "200 0 success"},
3285 {IP_RULE_V6, "2001:db8:cafe::/64", "", true,
3286 "200 0 success"},
3287 {IP_RULE_V6, "fe80::/64", "0.0.0.0", false,
3288 "400 0 addRoute() failed (Invalid argument)"},
3289 };
3290 // clang-format on
3291
3292 for (const auto& cmd : networkCmds) {
3293 const std::vector<std::string> result = runCommand(cmd.cmdString);
3294 SCOPED_TRACE(cmd.cmdString);
3295 EXPECT_EQ(result.size(), 1U);
3296 EXPECT_EQ(cmd.expectedResult, Trim(result[0]));
3297 }
3298
3299 for (const auto& cmd : ipfwdCmds) {
3300 const std::vector<std::string> result = runCommand(cmd.cmdString);
3301 SCOPED_TRACE(cmd.cmdString);
3302 EXPECT_EQ(result.size(), 1U);
3303 EXPECT_EQ(cmd.expectedResult, Trim(result[0]));
3304 }
3305
3306 // Add test physical network
Ken Chenab5f3472021-04-04 11:28:06 +08003307 const auto& config = makeNativeNetworkConfig(TEST_NETID1, NativeNetworkType::PHYSICAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +08003308 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08003309 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Luke Huangcfd04b22019-03-18 15:53:21 +08003310 EXPECT_TRUE(mNetd->networkAddInterface(TEST_NETID1, sTun.name()).isOk());
3311
3312 for (const auto& td : kTestData) {
3313 const std::string routeAddCmd =
3314 StringPrintf("ndc network route add %d %s %s %s", TEST_NETID1, sTun.name().c_str(),
3315 td.testDest, td.testNextHop);
3316 const std::string routeRemoveCmd =
3317 StringPrintf("ndc network route remove %d %s %s %s", TEST_NETID1,
3318 sTun.name().c_str(), td.testDest, td.testNextHop);
3319 std::vector<std::string> result = runCommand(routeAddCmd);
3320 SCOPED_TRACE(routeAddCmd);
3321 EXPECT_EQ(result.size(), 1U);
3322 EXPECT_EQ(td.expectedResult, Trim(result[0]));
3323 if (td.expectSuccess) {
3324 expectNetworkRouteExists(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
3325 sTun.name().c_str());
3326 result = runCommand(routeRemoveCmd);
3327 EXPECT_EQ(result.size(), 1U);
3328 EXPECT_EQ(td.expectedResult, Trim(result[0]));
3329 expectNetworkRouteDoesNotExist(td.ipVersion, sTun.name(), td.testDest, td.testNextHop,
3330 sTun.name().c_str());
3331 }
3332 }
3333 // Remove test physical network
3334 EXPECT_TRUE(mNetd->networkDestroy(TEST_NETID1).isOk());
Bernie Innocentia5161a02019-01-30 22:40:53 +09003335}
Luke Huang0e5e69d2019-03-06 15:42:38 +08003336
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09003337TEST_F(NetdBinderTest, OemNetdRelated) {
Luke Huang0e5e69d2019-03-06 15:42:38 +08003338 sp<IBinder> binder;
3339 binder::Status status = mNetd->getOemNetd(&binder);
3340 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
3341 sp<com::android::internal::net::IOemNetd> oemNetd;
3342 if (binder != nullptr) {
3343 oemNetd = android::interface_cast<com::android::internal::net::IOemNetd>(binder);
3344 }
Luke Huang2ff8b342019-04-30 15:33:33 +08003345 ASSERT_NE(nullptr, oemNetd.get());
Luke Huang0e5e69d2019-03-06 15:42:38 +08003346
3347 TimedOperation t("OemNetd isAlive RPC");
3348 bool isAlive = false;
3349 oemNetd->isAlive(&isAlive);
3350 ASSERT_TRUE(isAlive);
Luke Huang2ff8b342019-04-30 15:33:33 +08003351
3352 class TestOemUnsolListener
3353 : public com::android::internal::net::BnOemNetdUnsolicitedEventListener {
3354 public:
3355 android::binder::Status onRegistered() override {
3356 std::lock_guard lock(mCvMutex);
3357 mCv.notify_one();
3358 return android::binder::Status::ok();
3359 }
3360 std::condition_variable& getCv() { return mCv; }
3361 std::mutex& getCvMutex() { return mCvMutex; }
3362
3363 private:
3364 std::mutex mCvMutex;
3365 std::condition_variable mCv;
3366 };
3367
3368 // Start the Binder thread pool.
3369 android::ProcessState::self()->startThreadPool();
3370
3371 android::sp<TestOemUnsolListener> testListener = new TestOemUnsolListener();
3372
3373 auto& cv = testListener->getCv();
3374 auto& cvMutex = testListener->getCvMutex();
3375
3376 {
3377 std::unique_lock lock(cvMutex);
3378
3379 status = oemNetd->registerOemUnsolicitedEventListener(
3380 ::android::interface_cast<
3381 com::android::internal::net::IOemNetdUnsolicitedEventListener>(
3382 testListener));
3383 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
3384
3385 // Wait for receiving expected events.
3386 EXPECT_EQ(std::cv_status::no_timeout, cv.wait_for(lock, std::chrono::seconds(2)));
3387 }
Luke Huang0e5e69d2019-03-06 15:42:38 +08003388}
Luke Huangd2861982019-05-17 19:47:28 +08003389
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09003390void NetdBinderTest::createVpnNetworkWithUid(bool secure, uid_t uid, int vpnNetId,
Chiachang8a03faa2022-05-04 07:45:37 +00003391 int fallthroughNetId, int nonDefaultNetId) {
Luke Huangd2861982019-05-17 19:47:28 +08003392 // Re-init sTun* to ensure route rule exists.
3393 sTun.destroy();
3394 sTun.init();
3395 sTun2.destroy();
3396 sTun2.init();
Chiachang8a03faa2022-05-04 07:45:37 +00003397 sTun3.destroy();
3398 sTun3.init();
Luke Huangd2861982019-05-17 19:47:28 +08003399
3400 // Create physical network with fallthroughNetId but not set it as default network
Ken Chenab5f3472021-04-04 11:28:06 +08003401 auto config = makeNativeNetworkConfig(fallthroughNetId, NativeNetworkType::PHYSICAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +08003402 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08003403 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Luke Huangd2861982019-05-17 19:47:28 +08003404 EXPECT_TRUE(mNetd->networkAddInterface(fallthroughNetId, sTun.name()).isOk());
chiachangwang776b68c2022-05-17 05:16:16 +00003405 // Create another physical network in order to test VPN behaviour with multiple networks
3406 // connected, of which one may be the default.
Chiachang8a03faa2022-05-04 07:45:37 +00003407 auto nonDefaultNetworkConfig = makeNativeNetworkConfig(
3408 nonDefaultNetId, NativeNetworkType::PHYSICAL, INetd::PERMISSION_NONE, false, false);
3409 EXPECT_TRUE(mNetd->networkCreate(nonDefaultNetworkConfig).isOk());
3410 EXPECT_TRUE(mNetd->networkAddInterface(nonDefaultNetId, sTun3.name()).isOk());
Luke Huangd2861982019-05-17 19:47:28 +08003411
3412 // Create VPN with vpnNetId
Ken Chenab5f3472021-04-04 11:28:06 +08003413 config.netId = vpnNetId;
3414 config.networkType = NativeNetworkType::VIRTUAL;
3415 config.secure = secure;
3416 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Luke Huangd2861982019-05-17 19:47:28 +08003417
3418 // Add uid to VPN
3419 EXPECT_TRUE(mNetd->networkAddUidRanges(vpnNetId, {makeUidRangeParcel(uid, uid)}).isOk());
3420 EXPECT_TRUE(mNetd->networkAddInterface(vpnNetId, sTun2.name()).isOk());
3421
3422 // Add default route to fallthroughNetwork
3423 EXPECT_TRUE(mNetd->networkAddRoute(TEST_NETID1, sTun.name(), "::/0", "").isOk());
3424 // Add limited route
3425 EXPECT_TRUE(mNetd->networkAddRoute(TEST_NETID2, sTun2.name(), "2001:db8::/32", "").isOk());
Chiachang89e504e2022-05-12 05:21:20 +00003426
3427 // Also add default route to non-default network for per app default use.
3428 EXPECT_TRUE(mNetd->networkAddRoute(TEST_NETID3, sTun3.name(), "::/0", "").isOk());
Luke Huangd2861982019-05-17 19:47:28 +08003429}
3430
Ken Chen8738e1c2020-11-24 11:38:54 +08003431void NetdBinderTest::createAndSetDefaultNetwork(int netId, const std::string& interface,
3432 int permission) {
3433 // backup current default network.
3434 ASSERT_TRUE(mNetd->networkGetDefault(&mStoredDefaultNetwork).isOk());
3435
Ken Chenab5f3472021-04-04 11:28:06 +08003436 const auto& config =
Chiachang Wang6dd46152022-01-12 10:02:32 +08003437 makeNativeNetworkConfig(netId, NativeNetworkType::PHYSICAL, permission, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08003438 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Ken Chen8738e1c2020-11-24 11:38:54 +08003439 EXPECT_TRUE(mNetd->networkAddInterface(netId, interface).isOk());
3440 EXPECT_TRUE(mNetd->networkSetDefault(netId).isOk());
3441}
3442
3443void NetdBinderTest::createPhysicalNetwork(int netId, const std::string& interface,
3444 int permission) {
Ken Chenab5f3472021-04-04 11:28:06 +08003445 const auto& config =
Chiachang Wang6dd46152022-01-12 10:02:32 +08003446 makeNativeNetworkConfig(netId, NativeNetworkType::PHYSICAL, permission, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08003447 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Ken Chen8738e1c2020-11-24 11:38:54 +08003448 EXPECT_TRUE(mNetd->networkAddInterface(netId, interface).isOk());
3449}
3450
3451// 1. Create a physical network on sTun, and set it as the system default network.
3452// 2. Create another physical network on sTun2.
3453void NetdBinderTest::createDefaultAndOtherPhysicalNetwork(int defaultNetId, int otherNetId) {
3454 createAndSetDefaultNetwork(defaultNetId, sTun.name());
3455 EXPECT_TRUE(mNetd->networkAddRoute(defaultNetId, sTun.name(), "::/0", "").isOk());
3456
3457 createPhysicalNetwork(otherNetId, sTun2.name());
3458 EXPECT_TRUE(mNetd->networkAddRoute(otherNetId, sTun2.name(), "::/0", "").isOk());
3459}
3460
3461// 1. Create a system default network and a physical network.
3462// 2. Create a VPN on sTun3.
3463void NetdBinderTest::createVpnAndOtherPhysicalNetwork(int systemDefaultNetId, int otherNetId,
3464 int vpnNetId, bool secure) {
3465 createDefaultAndOtherPhysicalNetwork(systemDefaultNetId, otherNetId);
3466
Ken Chenab5f3472021-04-04 11:28:06 +08003467 auto config = makeNativeNetworkConfig(vpnNetId, NativeNetworkType::VIRTUAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +08003468 INetd::PERMISSION_NONE, secure, false);
Ken Chenab5f3472021-04-04 11:28:06 +08003469 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Ken Chen8738e1c2020-11-24 11:38:54 +08003470 EXPECT_TRUE(mNetd->networkAddInterface(vpnNetId, sTun3.name()).isOk());
3471 EXPECT_TRUE(mNetd->networkAddRoute(vpnNetId, sTun3.name(), "2001:db8::/32", "").isOk());
3472}
3473
3474// 1. Create system default network, a physical network (for per-app default), and a VPN.
3475// 2. Add per-app uid ranges and VPN ranges.
3476void NetdBinderTest::createVpnAndAppDefaultNetworkWithUid(
3477 int systemDefaultNetId, int appDefaultNetId, int vpnNetId, bool secure,
3478 std::vector<UidRangeParcel>&& appDefaultUidRanges,
3479 std::vector<UidRangeParcel>&& vpnUidRanges) {
3480 createVpnAndOtherPhysicalNetwork(systemDefaultNetId, appDefaultNetId, vpnNetId, secure);
3481 // add per-app uid ranges.
3482 EXPECT_TRUE(mNetd->networkAddUidRanges(appDefaultNetId, appDefaultUidRanges).isOk());
3483 // add VPN uid ranges.
3484 EXPECT_TRUE(mNetd->networkAddUidRanges(vpnNetId, vpnUidRanges).isOk());
3485}
3486
Luke Huangd2861982019-05-17 19:47:28 +08003487namespace {
3488
3489class ScopedUidChange {
3490 public:
3491 explicit ScopedUidChange(uid_t uid) : mInputUid(uid) {
Ken Chen8738e1c2020-11-24 11:38:54 +08003492 mStoredUid = geteuid();
Luke Huangd2861982019-05-17 19:47:28 +08003493 if (mInputUid == mStoredUid) return;
3494 EXPECT_TRUE(seteuid(uid) == 0);
3495 }
3496 ~ScopedUidChange() {
3497 if (mInputUid == mStoredUid) return;
3498 EXPECT_TRUE(seteuid(mStoredUid) == 0);
3499 }
3500
3501 private:
3502 uid_t mInputUid;
3503 uid_t mStoredUid;
3504};
3505
Luke Huangd2861982019-05-17 19:47:28 +08003506void clearQueue(int tunFd) {
3507 char buf[4096];
3508 int ret;
3509 do {
3510 ret = read(tunFd, buf, sizeof(buf));
3511 } while (ret > 0);
3512}
3513
Ken Chen8738e1c2020-11-24 11:38:54 +08003514void checkDataReceived(int udpSocket, int tunFd, sockaddr* dstAddr, int addrLen) {
Luke Huangd2861982019-05-17 19:47:28 +08003515 char buf[4096] = {};
3516 // Clear tunFd's queue before write something because there might be some
3517 // arbitrary packets in the queue. (e.g. ICMPv6 packet)
3518 clearQueue(tunFd);
Ken Chen8738e1c2020-11-24 11:38:54 +08003519 EXPECT_EQ(4, sendto(udpSocket, "foo", sizeof("foo"), 0, dstAddr, addrLen));
Luke Huangd2861982019-05-17 19:47:28 +08003520 // TODO: extract header and verify data
3521 EXPECT_GT(read(tunFd, buf, sizeof(buf)), 0);
3522}
3523
Ken Chen8738e1c2020-11-24 11:38:54 +08003524bool sendIPv6PacketFromUid(uid_t uid, const in6_addr& dstAddr, Fwmark* fwmark, int tunFd,
3525 bool doConnect = true) {
Luke Huangd2861982019-05-17 19:47:28 +08003526 ScopedUidChange scopedUidChange(uid);
Bernie Innocentid26a04a2019-10-30 17:15:15 +09003527 unique_fd testSocket(socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0));
Luke Huangd2861982019-05-17 19:47:28 +08003528 if (testSocket < 0) return false;
3529
Nick Desaulniers6b357502019-10-11 09:26:44 -07003530 const sockaddr_in6 dst6 = {
3531 .sin6_family = AF_INET6,
3532 .sin6_port = 42,
3533 .sin6_addr = dstAddr,
3534 };
Ken Chen8738e1c2020-11-24 11:38:54 +08003535 if (doConnect && connect(testSocket, (sockaddr*)&dst6, sizeof(dst6)) == -1) return false;
3536
Luke Huangd2861982019-05-17 19:47:28 +08003537 socklen_t fwmarkLen = sizeof(fwmark->intValue);
3538 EXPECT_NE(-1, getsockopt(testSocket, SOL_SOCKET, SO_MARK, &(fwmark->intValue), &fwmarkLen));
Luke Huangd2861982019-05-17 19:47:28 +08003539
3540 char addr[INET6_ADDRSTRLEN];
3541 inet_ntop(AF_INET6, &dstAddr, addr, INET6_ADDRSTRLEN);
Ken Chen8738e1c2020-11-24 11:38:54 +08003542 SCOPED_TRACE(StringPrintf("sendIPv6Packet, addr: %s, uid: %u, doConnect: %s", addr, uid,
3543 doConnect ? "true" : "false"));
3544 if (doConnect) {
3545 checkDataReceived(testSocket, tunFd, nullptr, 0);
3546 } else {
3547 checkDataReceived(testSocket, tunFd, (sockaddr*)&dst6, sizeof(dst6));
3548 }
Luke Huangd2861982019-05-17 19:47:28 +08003549 return true;
3550}
3551
Ken Chen4e8ef9b2021-03-17 01:57:19 +08003552// Send an IPv6 packet from the uid. Expect to fail and get specified errno.
3553bool sendIPv6PacketFromUidFail(uid_t uid, const in6_addr& dstAddr, Fwmark* fwmark, bool doConnect,
3554 int expectedErr) {
3555 ScopedUidChange scopedUidChange(uid);
3556 unique_fd s(socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0));
3557 if (s < 0) return false;
3558
3559 const sockaddr_in6 dst6 = {
3560 .sin6_family = AF_INET6,
3561 .sin6_port = 42,
3562 .sin6_addr = dstAddr,
3563 };
3564 if (doConnect) {
3565 if (connect(s, (sockaddr*)&dst6, sizeof(dst6)) == 0) return false;
3566 if (errno != expectedErr) return false;
3567 }
3568
3569 socklen_t fwmarkLen = sizeof(fwmark->intValue);
3570 EXPECT_NE(-1, getsockopt(s, SOL_SOCKET, SO_MARK, &(fwmark->intValue), &fwmarkLen));
3571
3572 char addr[INET6_ADDRSTRLEN];
3573 inet_ntop(AF_INET6, &dstAddr, addr, INET6_ADDRSTRLEN);
3574 SCOPED_TRACE(StringPrintf("sendIPv6PacketFail, addr: %s, uid: %u, doConnect: %s", addr, uid,
3575 doConnect ? "true" : "false"));
3576 if (!doConnect) {
3577 if (sendto(s, "foo", sizeof("foo"), 0, (sockaddr*)&dst6, sizeof(dst6)) == 0) return false;
3578 if (errno != expectedErr) return false;
3579 }
3580 return true;
3581}
3582
Luke Huangd2861982019-05-17 19:47:28 +08003583void expectVpnFallthroughRuleExists(const std::string& ifName, int vpnNetId) {
3584 std::string vpnFallthroughRule =
3585 StringPrintf("%d:\tfrom all fwmark 0x%x/0xffff lookup %s",
3586 RULE_PRIORITY_VPN_FALLTHROUGH, vpnNetId, ifName.c_str());
3587 for (const auto& ipVersion : {IP_RULE_V4, IP_RULE_V6}) {
3588 EXPECT_TRUE(ipRuleExists(ipVersion, vpnFallthroughRule));
3589 }
3590}
3591
3592void expectVpnFallthroughWorks(android::net::INetd* netdService, bool bypassable, uid_t uid,
Chiachang89e504e2022-05-12 05:21:20 +00003593 uid_t uidNotInVpn, const TunInterface& fallthroughNetwork,
3594 const TunInterface& vpnNetwork, const TunInterface& otherNetwork,
3595 int vpnNetId = TEST_NETID2, int fallthroughNetId = TEST_NETID1,
3596 int otherNetId = TEST_NETID3) {
Luke Huangd2861982019-05-17 19:47:28 +08003597 // Set default network to NETID_UNSET
3598 EXPECT_TRUE(netdService->networkSetDefault(NETID_UNSET).isOk());
3599
3600 // insideVpnAddr based on the route we added in createVpnNetworkWithUid
3601 in6_addr insideVpnAddr = {
3602 {// 2001:db8:cafe::1
3603 .u6_addr8 = {0x20, 0x01, 0x0d, 0xb8, 0xca, 0xfe, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}}};
3604 // outsideVpnAddr will hit the route in the fallthrough network route table
3605 // because we added default route in createVpnNetworkWithUid
3606 in6_addr outsideVpnAddr = {
3607 {// 2607:f0d0:1002::4
3608 .u6_addr8 = {0x26, 0x07, 0xf0, 0xd0, 0x10, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4}}};
3609
3610 int fallthroughFd = fallthroughNetwork.getFdForTesting();
3611 int vpnFd = vpnNetwork.getFdForTesting();
3612 // Expect all connections to fail because UID 0 is not routed to the VPN and there is no
3613 // default network.
3614 Fwmark fwmark;
3615 EXPECT_FALSE(sendIPv6PacketFromUid(0, outsideVpnAddr, &fwmark, fallthroughFd));
3616 EXPECT_FALSE(sendIPv6PacketFromUid(0, insideVpnAddr, &fwmark, fallthroughFd));
3617
3618 // Set default network
3619 EXPECT_TRUE(netdService->networkSetDefault(fallthroughNetId).isOk());
3620
3621 // Connections go on the default network because UID 0 is not subject to the VPN.
3622 EXPECT_TRUE(sendIPv6PacketFromUid(0, outsideVpnAddr, &fwmark, fallthroughFd));
3623 EXPECT_EQ(fallthroughNetId | 0xC0000, static_cast<int>(fwmark.intValue));
3624 EXPECT_TRUE(sendIPv6PacketFromUid(0, insideVpnAddr, &fwmark, fallthroughFd));
3625 EXPECT_EQ(fallthroughNetId | 0xC0000, static_cast<int>(fwmark.intValue));
3626
3627 // Check if fallthrough rule exists
3628 expectVpnFallthroughRuleExists(fallthroughNetwork.name(), vpnNetId);
3629
Chiachang8a03faa2022-05-04 07:45:37 +00003630 // Check if local exclusion rule exists for default network
Chiachang Wange39cc752022-03-01 17:35:31 +08003631 expectVpnLocalExclusionRuleExists(fallthroughNetwork.name(), true);
Chiachang8a03faa2022-05-04 07:45:37 +00003632 // No local exclusion rule for non-default network
Chiachang89e504e2022-05-12 05:21:20 +00003633 expectVpnLocalExclusionRuleExists(otherNetwork.name(), false);
Chiachang Wange7bf5f52022-01-17 11:37:39 +08003634
Luke Huangd2861982019-05-17 19:47:28 +08003635 // Expect fallthrough to default network
3636 // The fwmark differs depending on whether the VPN is bypassable or not.
3637 EXPECT_TRUE(sendIPv6PacketFromUid(uid, outsideVpnAddr, &fwmark, fallthroughFd));
3638 EXPECT_EQ(bypassable ? vpnNetId : fallthroughNetId, static_cast<int>(fwmark.intValue));
3639
3640 // Expect connect success, packet will be sent to vpnFd.
3641 EXPECT_TRUE(sendIPv6PacketFromUid(uid, insideVpnAddr, &fwmark, vpnFd));
3642 EXPECT_EQ(bypassable ? vpnNetId : fallthroughNetId, static_cast<int>(fwmark.intValue));
3643
3644 // Explicitly select vpn network
3645 setNetworkForProcess(vpnNetId);
3646
3647 // Expect fallthrough to default network
3648 EXPECT_TRUE(sendIPv6PacketFromUid(0, outsideVpnAddr, &fwmark, fallthroughFd));
3649 // Expect the mark contains all the bit because we've selected network.
3650 EXPECT_EQ(vpnNetId | 0xF0000, static_cast<int>(fwmark.intValue));
3651
3652 // Expect connect success, packet will be sent to vpnFd.
3653 EXPECT_TRUE(sendIPv6PacketFromUid(0, insideVpnAddr, &fwmark, vpnFd));
3654 // Expect the mark contains all the bit because we've selected network.
3655 EXPECT_EQ(vpnNetId | 0xF0000, static_cast<int>(fwmark.intValue));
3656
3657 // Explicitly select fallthrough network
3658 setNetworkForProcess(fallthroughNetId);
3659
3660 // The mark is set to fallthrough network because we've selected it.
3661 EXPECT_TRUE(sendIPv6PacketFromUid(0, outsideVpnAddr, &fwmark, fallthroughFd));
3662 EXPECT_TRUE(sendIPv6PacketFromUid(0, insideVpnAddr, &fwmark, fallthroughFd));
3663
3664 // If vpn is BypassableVPN, connections can also go on the fallthrough network under vpn uid.
3665 if (bypassable) {
3666 EXPECT_TRUE(sendIPv6PacketFromUid(uid, outsideVpnAddr, &fwmark, fallthroughFd));
3667 EXPECT_TRUE(sendIPv6PacketFromUid(uid, insideVpnAddr, &fwmark, fallthroughFd));
3668 } else {
3669 // If not, no permission to bypass vpn.
3670 EXPECT_FALSE(sendIPv6PacketFromUid(uid, outsideVpnAddr, &fwmark, fallthroughFd));
3671 EXPECT_FALSE(sendIPv6PacketFromUid(uid, insideVpnAddr, &fwmark, fallthroughFd));
3672 }
Chiachang89e504e2022-05-12 05:21:20 +00003673
3674 // Add per-app uid ranges.
3675 EXPECT_TRUE(netdService
3676 ->networkAddUidRanges(otherNetId,
3677 {makeUidRangeParcel(uidNotInVpn, uidNotInVpn)})
3678 .isOk());
3679
3680 int appDefaultFd = otherNetwork.getFdForTesting();
3681
3682 // UID is not inside the VPN range, so it won't go to vpn network.
3683 // It won't fall into per app local rule because it's explicitly selected.
3684 EXPECT_TRUE(sendIPv6PacketFromUid(uidNotInVpn, outsideVpnAddr, &fwmark, fallthroughFd));
3685 EXPECT_TRUE(sendIPv6PacketFromUid(uidNotInVpn, insideVpnAddr, &fwmark, fallthroughFd));
3686
3687 // Reset explicitly selection.
3688 setNetworkForProcess(NETID_UNSET);
3689 // Connections can go to app default network.
3690 EXPECT_TRUE(sendIPv6PacketFromUid(uidNotInVpn, insideVpnAddr, &fwmark, appDefaultFd));
3691 EXPECT_TRUE(sendIPv6PacketFromUid(uidNotInVpn, outsideVpnAddr, &fwmark, appDefaultFd));
Luke Huangd2861982019-05-17 19:47:28 +08003692}
3693
3694} // namespace
3695
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09003696TEST_F(NetdBinderTest, SecureVPNFallthrough) {
Luke Huangd2861982019-05-17 19:47:28 +08003697 createVpnNetworkWithUid(true /* secure */, TEST_UID1);
3698 // Get current default network NetId
3699 ASSERT_TRUE(mNetd->networkGetDefault(&mStoredDefaultNetwork).isOk());
Chiachang89e504e2022-05-12 05:21:20 +00003700 expectVpnFallthroughWorks(mNetd.get(), false /* bypassable */, TEST_UID1, TEST_UID2, sTun,
3701 sTun2, sTun3);
Luke Huangd2861982019-05-17 19:47:28 +08003702}
3703
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09003704TEST_F(NetdBinderTest, BypassableVPNFallthrough) {
Luke Huangd2861982019-05-17 19:47:28 +08003705 createVpnNetworkWithUid(false /* secure */, TEST_UID1);
3706 // Get current default network NetId
3707 ASSERT_TRUE(mNetd->networkGetDefault(&mStoredDefaultNetwork).isOk());
Chiachang89e504e2022-05-12 05:21:20 +00003708 expectVpnFallthroughWorks(mNetd.get(), true /* bypassable */, TEST_UID1, TEST_UID2, sTun, sTun2,
3709 sTun3);
Bernie Innocenti80ffd0f2019-06-05 15:27:46 +09003710}
Chiachang Wang00fc62f2019-12-04 20:38:26 +08003711
3712namespace {
3713
3714int32_t createIpv6SocketAndCheckMark(int type, const in6_addr& dstAddr) {
3715 const sockaddr_in6 dst6 = {
3716 .sin6_family = AF_INET6,
3717 .sin6_port = 1234,
3718 .sin6_addr = dstAddr,
3719 };
3720 // create non-blocking socket.
3721 int sockFd = socket(AF_INET6, type | SOCK_NONBLOCK, 0);
3722 EXPECT_NE(-1, sockFd);
3723 EXPECT_EQ((type == SOCK_STREAM) ? -1 : 0, connect(sockFd, (sockaddr*)&dst6, sizeof(dst6)));
3724
3725 // Get socket fwmark.
3726 Fwmark fwmark;
3727 socklen_t fwmarkLen = sizeof(fwmark.intValue);
3728 EXPECT_EQ(0, getsockopt(sockFd, SOL_SOCKET, SO_MARK, &fwmark.intValue, &fwmarkLen));
3729 EXPECT_EQ(0, close(sockFd));
3730 return fwmark.intValue;
3731}
3732
3733} // namespace
3734
Lorenzo Colitti76f4bdb2020-06-03 21:50:41 +09003735TEST_F(NetdBinderTest, GetFwmarkForNetwork) {
Maciej Żenczykowski084e0ef2020-05-20 02:01:23 -07003736 // Save current default network.
3737 ASSERT_TRUE(mNetd->networkGetDefault(&mStoredDefaultNetwork).isOk());
3738
Chiachang Wang00fc62f2019-12-04 20:38:26 +08003739 // Add test physical network 1 and set as default network.
Ken Chenab5f3472021-04-04 11:28:06 +08003740 auto config = makeNativeNetworkConfig(TEST_NETID1, NativeNetworkType::PHYSICAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +08003741 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08003742 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Chiachang Wang00fc62f2019-12-04 20:38:26 +08003743 EXPECT_TRUE(mNetd->networkAddInterface(TEST_NETID1, sTun.name()).isOk());
3744 EXPECT_TRUE(mNetd->networkAddRoute(TEST_NETID1, sTun.name(), "2001:db8::/32", "").isOk());
3745 EXPECT_TRUE(mNetd->networkSetDefault(TEST_NETID1).isOk());
3746 // Add test physical network 2
Ken Chenab5f3472021-04-04 11:28:06 +08003747 config.netId = TEST_NETID2;
3748 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Chiachang Wang00fc62f2019-12-04 20:38:26 +08003749 EXPECT_TRUE(mNetd->networkAddInterface(TEST_NETID2, sTun2.name()).isOk());
3750
3751 // Get fwmark for network 1.
3752 MarkMaskParcel maskMarkNet1;
3753 ASSERT_TRUE(mNetd->getFwmarkForNetwork(TEST_NETID1, &maskMarkNet1).isOk());
3754
Ken Chen8738e1c2020-11-24 11:38:54 +08003755 uint32_t fwmarkTcp = createIpv6SocketAndCheckMark(SOCK_STREAM, V6_ADDR);
3756 uint32_t fwmarkUdp = createIpv6SocketAndCheckMark(SOCK_DGRAM, V6_ADDR);
Chiachang Wang00fc62f2019-12-04 20:38:26 +08003757 EXPECT_EQ(maskMarkNet1.mark, static_cast<int>(fwmarkTcp & maskMarkNet1.mask));
3758 EXPECT_EQ(maskMarkNet1.mark, static_cast<int>(fwmarkUdp & maskMarkNet1.mask));
3759
3760 // Get fwmark for network 2.
3761 MarkMaskParcel maskMarkNet2;
3762 ASSERT_TRUE(mNetd->getFwmarkForNetwork(TEST_NETID2, &maskMarkNet2).isOk());
3763 EXPECT_NE(maskMarkNet2.mark, static_cast<int>(fwmarkTcp & maskMarkNet2.mask));
3764 EXPECT_NE(maskMarkNet2.mark, static_cast<int>(fwmarkUdp & maskMarkNet2.mask));
3765
3766 // Remove test physical network.
3767 EXPECT_TRUE(mNetd->networkDestroy(TEST_NETID2).isOk());
3768 EXPECT_TRUE(mNetd->networkDestroy(TEST_NETID1).isOk());
3769}
Hungming Chen92571042020-02-20 17:01:31 +08003770
Lorenzo Colitti23554ba2020-11-05 01:43:46 +09003771TEST_F(NetdBinderTest, TestServiceDump) {
3772 sp<IBinder> binder = INetd::asBinder(mNetd);
3773 ASSERT_NE(nullptr, binder);
3774
3775 struct TestData {
3776 // Expected contents of the dump command.
3777 const std::string output;
3778 // A regex that might be helpful in matching relevant lines in the output.
3779 // Used to make it easier to add test cases for this code.
3780 const std::string hintRegex;
3781 };
3782 std::vector<TestData> testData;
3783
3784 // Send some IPCs and for each one add an element to testData telling us what to expect.
Ken Chenab5f3472021-04-04 11:28:06 +08003785 const auto& config = makeNativeNetworkConfig(TEST_DUMP_NETID, NativeNetworkType::PHYSICAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +08003786 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08003787 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Lorenzo Colitti23554ba2020-11-05 01:43:46 +09003788 testData.push_back(
Ken Chenab5f3472021-04-04 11:28:06 +08003789 {"networkCreate(NativeNetworkConfig{netId: 65123, networkType: PHYSICAL, "
Chiachang Wang6dd46152022-01-12 10:02:32 +08003790 "permission: 0, secure: false, vpnType: PLATFORM, excludeLocalRoutes: false})",
Ken Chenab5f3472021-04-04 11:28:06 +08003791 "networkCreate.*65123"});
3792
3793 EXPECT_EQ(EEXIST, mNetd->networkCreate(config).serviceSpecificErrorCode());
3794 testData.push_back(
3795 {"networkCreate(NativeNetworkConfig{netId: 65123, networkType: PHYSICAL, "
Chiachang Wang6dd46152022-01-12 10:02:32 +08003796 "permission: 0, secure: false, vpnType: PLATFORM, excludeLocalRoutes: false}) "
Ken Chenab5f3472021-04-04 11:28:06 +08003797 "-> ServiceSpecificException(17, \"File exists\")",
3798 "networkCreate.*65123.*17"});
Lorenzo Colitti23554ba2020-11-05 01:43:46 +09003799
3800 EXPECT_TRUE(mNetd->networkAddInterface(TEST_DUMP_NETID, sTun.name()).isOk());
Jooyung Hanf2422582020-11-04 14:21:46 +09003801 testData.push_back({StringPrintf("networkAddInterface(65123, %s)", sTun.name().c_str()),
Lorenzo Colitti23554ba2020-11-05 01:43:46 +09003802 StringPrintf("networkAddInterface.*65123.*%s", sTun.name().c_str())});
3803
3804 android::net::RouteInfoParcel parcel;
3805 parcel.ifName = sTun.name();
3806 parcel.destination = "2001:db8:dead:beef::/64";
3807 parcel.nextHop = "fe80::dead:beef";
3808 parcel.mtu = 1234;
3809 EXPECT_TRUE(mNetd->networkAddRouteParcel(TEST_DUMP_NETID, parcel).isOk());
3810 testData.push_back(
Jooyung Hanf2422582020-11-04 14:21:46 +09003811 {StringPrintf("networkAddRouteParcel(65123, RouteInfoParcel{destination:"
Lorenzo Colitti23554ba2020-11-05 01:43:46 +09003812 " 2001:db8:dead:beef::/64, ifName: %s, nextHop: fe80::dead:beef,"
Jooyung Hanf2422582020-11-04 14:21:46 +09003813 " mtu: 1234})",
Lorenzo Colitti23554ba2020-11-05 01:43:46 +09003814 sTun.name().c_str()),
3815 "networkAddRouteParcel.*65123.*dead:beef"});
3816
3817 EXPECT_TRUE(mNetd->networkDestroy(TEST_DUMP_NETID).isOk());
3818 testData.push_back({"networkDestroy(65123)", "networkDestroy.*65123"});
3819
3820 // Send the service dump request to netd.
Ken Chencf082a32022-01-15 10:58:55 +08003821 std::vector<std::string> lines = {};
3822 android::status_t ret = dumpService(binder, {}, lines);
3823 ASSERT_EQ(android::OK, ret) << "Error dumping service: " << android::statusToString(ret);
Lorenzo Colitti23554ba2020-11-05 01:43:46 +09003824
3825 // Basic regexp to match dump output lines. Matches the beginning and end of the line, and
3826 // puts the output of the command itself into the first match group.
3827 // Example: " 11-05 00:23:39.481 myCommand(args) <2.02ms>".
3828 const std::basic_regex lineRegex(
3829 "^ [0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}[.][0-9]{3} "
3830 "(.*)"
3831 " <[0-9]+[.][0-9]{2}ms>$");
3832
3833 // For each element of testdata, check that the expected output appears in the dump output.
3834 // If not, fail the test and use hintRegex to print similar lines to assist in debugging.
3835 for (const TestData& td : testData) {
3836 const bool found = std::any_of(lines.begin(), lines.end(), [&](const std::string& line) {
3837 std::smatch match;
3838 if (!std::regex_match(line, match, lineRegex)) return false;
3839 return (match.size() == 2) && (match[1].str() == td.output);
3840 });
3841 EXPECT_TRUE(found) << "Didn't find line '" << td.output << "' in dumpsys output.";
3842 if (found) continue;
3843 std::cerr << "Similar lines" << std::endl;
3844 for (const auto& line : lines) {
3845 if (std::regex_search(line, std::basic_regex(td.hintRegex))) {
Lorenzo Colitti6bc038c2020-11-12 13:42:59 +09003846 std::cerr << line << std::endl;
Lorenzo Colitti23554ba2020-11-05 01:43:46 +09003847 }
3848 }
3849 }
3850}
Ken Chen8738e1c2020-11-24 11:38:54 +08003851
3852namespace {
3853
3854// aliases for better reading
3855#define SYSTEM_DEFAULT_NETID TEST_NETID1
3856#define APP_DEFAULT_NETID TEST_NETID2
3857#define VPN_NETID TEST_NETID3
3858
3859void verifyAppUidRules(std::vector<bool>&& expectedResults, std::vector<UidRangeParcel>& uidRanges,
Ken Chen53360bf2021-12-10 02:41:05 +08003860 const std::string& iface, int32_t subPriority) {
Ken Chen8738e1c2020-11-24 11:38:54 +08003861 ASSERT_EQ(expectedResults.size(), uidRanges.size());
Ken Chen4e8ef9b2021-03-17 01:57:19 +08003862 if (iface.size()) {
3863 std::string action = StringPrintf("lookup %s ", iface.c_str());
chiachangwang776b68c2022-05-17 05:16:16 +00003864 std::string action_local = StringPrintf("lookup %s_local ", iface.c_str());
Ken Chen4e8ef9b2021-03-17 01:57:19 +08003865 for (unsigned long i = 0; i < uidRanges.size(); i++) {
Ken Chen4ea88462021-05-23 14:56:43 +08003866 EXPECT_EQ(expectedResults[i],
3867 ipRuleExistsForRange(RULE_PRIORITY_UID_EXPLICIT_NETWORK + subPriority,
3868 uidRanges[i], action));
3869 EXPECT_EQ(expectedResults[i],
3870 ipRuleExistsForRange(RULE_PRIORITY_UID_IMPLICIT_NETWORK + subPriority,
3871 uidRanges[i], action));
3872 EXPECT_EQ(expectedResults[i],
3873 ipRuleExistsForRange(RULE_PRIORITY_UID_DEFAULT_NETWORK + subPriority,
3874 uidRanges[i], action));
chiachangwang776b68c2022-05-17 05:16:16 +00003875 EXPECT_EQ(expectedResults[i], ipRuleExistsForRange(RULE_PRIORITY_UID_LOCAL_ROUTES,
3876 uidRanges[i], action_local));
Ken Chen4e8ef9b2021-03-17 01:57:19 +08003877 }
3878 } else {
3879 std::string action = "unreachable";
3880 for (unsigned long i = 0; i < uidRanges.size(); i++) {
Ken Chen4e8ef9b2021-03-17 01:57:19 +08003881 EXPECT_EQ(expectedResults[i],
Ken Chen4ea88462021-05-23 14:56:43 +08003882 ipRuleExistsForRange(RULE_PRIORITY_UID_EXPLICIT_NETWORK + subPriority,
3883 uidRanges[i], action));
3884 EXPECT_EQ(expectedResults[i],
3885 ipRuleExistsForRange(RULE_PRIORITY_UID_IMPLICIT_NETWORK + subPriority,
3886 uidRanges[i], action));
3887 EXPECT_EQ(expectedResults[i],
3888 ipRuleExistsForRange(RULE_PRIORITY_UID_DEFAULT_UNREACHABLE + subPriority,
3889 uidRanges[i], action));
Ken Chen4e8ef9b2021-03-17 01:57:19 +08003890 }
Ken Chen8738e1c2020-11-24 11:38:54 +08003891 }
3892}
3893
Ken Chen4ea88462021-05-23 14:56:43 +08003894void verifyAppUidRules(std::vector<bool>&& expectedResults, NativeUidRangeConfig& uidRangeConfig,
3895 const std::string& iface) {
3896 verifyAppUidRules(move(expectedResults), uidRangeConfig.uidRanges, iface,
3897 uidRangeConfig.subPriority);
3898}
3899
3900void verifyVpnUidRules(std::vector<bool>&& expectedResults, NativeUidRangeConfig& uidRangeConfig,
Chiachang Wang2e9443f2022-01-14 22:55:36 +08003901 const std::string& iface, bool secure, bool excludeLocalRoutes) {
Ken Chen4ea88462021-05-23 14:56:43 +08003902 ASSERT_EQ(expectedResults.size(), uidRangeConfig.uidRanges.size());
3903 std::string action = StringPrintf("lookup %s ", iface.c_str());
3904
Ken Chen53360bf2021-12-10 02:41:05 +08003905 int32_t priority;
Ken Chen4ea88462021-05-23 14:56:43 +08003906 if (secure) {
3907 priority = RULE_PRIORITY_SECURE_VPN;
3908 } else {
Chiachang Wang2e9443f2022-01-14 22:55:36 +08003909 // Set to no local exclusion here to reflect the default value of local exclusion.
3910 priority = excludeLocalRoutes ? RULE_PRIORITY_BYPASSABLE_VPN_LOCAL_EXCLUSION
3911 : RULE_PRIORITY_BYPASSABLE_VPN_NO_LOCAL_EXCLUSION;
Ken Chen4ea88462021-05-23 14:56:43 +08003912 }
3913 for (unsigned long i = 0; i < uidRangeConfig.uidRanges.size(); i++) {
3914 EXPECT_EQ(expectedResults[i], ipRuleExistsForRange(priority + uidRangeConfig.subPriority,
3915 uidRangeConfig.uidRanges[i], action));
3916 EXPECT_EQ(expectedResults[i],
3917 ipRuleExistsForRange(RULE_PRIORITY_EXPLICIT_NETWORK + uidRangeConfig.subPriority,
3918 uidRangeConfig.uidRanges[i], action));
3919 EXPECT_EQ(expectedResults[i],
3920 ipRuleExistsForRange(RULE_PRIORITY_OUTPUT_INTERFACE + uidRangeConfig.subPriority,
3921 uidRangeConfig.uidRanges[i], action, iface.c_str()));
3922 }
3923}
3924
Patrick Rohre2f1b5a2022-01-25 21:36:50 +01003925constexpr int SUB_PRIORITY_1 = UidRanges::SUB_PRIORITY_HIGHEST + 1;
3926constexpr int SUB_PRIORITY_2 = UidRanges::SUB_PRIORITY_HIGHEST + 2;
Ken Chen4ea88462021-05-23 14:56:43 +08003927
Ken Chen8738e1c2020-11-24 11:38:54 +08003928constexpr int IMPLICITLY_SELECT = 0;
3929constexpr int EXPLICITLY_SELECT = 1;
3930constexpr int UNCONNECTED_SOCKET = 2;
3931
3932// 1. Send data with the specified UID, on a connected or unconnected socket.
3933// 2. Verify if data is received from the specified fd. The fd should belong to a TUN, which has
3934// been assigned to the test network.
3935// 3. Verify if fwmark of data is correct.
3936// Note: This is a helper function used by per-app default network tests. It does not implement full
3937// fwmark logic in netd, and it's currently sufficient. Extension may be required for more
3938// complicated tests.
3939void expectPacketSentOnNetId(uid_t uid, unsigned netId, int fd, int selectionMode) {
3940 Fwmark fwmark;
3941 const bool doConnect = (selectionMode != UNCONNECTED_SOCKET);
3942 EXPECT_TRUE(sendIPv6PacketFromUid(uid, V6_ADDR, &fwmark, fd, doConnect));
3943
3944 Fwmark expected;
3945 expected.netId = netId;
3946 expected.explicitlySelected = (selectionMode == EXPLICITLY_SELECT);
3947 if (uid == AID_ROOT && selectionMode == EXPLICITLY_SELECT) {
3948 expected.protectedFromVpn = true;
3949 } else {
3950 expected.protectedFromVpn = false;
3951 }
3952 if (selectionMode == UNCONNECTED_SOCKET) {
3953 expected.permission = PERMISSION_NONE;
3954 } else {
3955 expected.permission = (uid == AID_ROOT) ? PERMISSION_SYSTEM : PERMISSION_NONE;
3956 }
3957
3958 EXPECT_EQ(expected.intValue, fwmark.intValue);
3959}
3960
Ken Chen4e8ef9b2021-03-17 01:57:19 +08003961void expectUnreachableError(uid_t uid, unsigned netId, int selectionMode) {
3962 Fwmark fwmark;
3963 const bool doConnect = (selectionMode != UNCONNECTED_SOCKET);
3964 EXPECT_TRUE(sendIPv6PacketFromUidFail(uid, V6_ADDR, &fwmark, doConnect, ENETUNREACH));
3965
3966 Fwmark expected;
3967 expected.netId = netId;
3968 expected.explicitlySelected = (selectionMode == EXPLICITLY_SELECT);
3969 if (uid == AID_ROOT && selectionMode == EXPLICITLY_SELECT) {
3970 expected.protectedFromVpn = true;
3971 } else {
3972 expected.protectedFromVpn = false;
3973 }
3974 if (selectionMode == UNCONNECTED_SOCKET) {
3975 expected.permission = PERMISSION_NONE;
3976 } else {
3977 expected.permission = (uid == AID_ROOT) ? PERMISSION_SYSTEM : PERMISSION_NONE;
3978 }
3979
3980 EXPECT_EQ(expected.intValue, fwmark.intValue);
3981}
3982
Ken Chen8738e1c2020-11-24 11:38:54 +08003983} // namespace
3984
Ken Chen868ae632021-02-24 17:50:08 +08003985// Verify whether API reject overlapped UID ranges
3986TEST_F(NetdBinderTest, PerAppDefaultNetwork_OverlappedUidRanges) {
Ken Chenab5f3472021-04-04 11:28:06 +08003987 const auto& config = makeNativeNetworkConfig(APP_DEFAULT_NETID, NativeNetworkType::PHYSICAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +08003988 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08003989 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Ken Chen868ae632021-02-24 17:50:08 +08003990 EXPECT_TRUE(mNetd->networkAddInterface(APP_DEFAULT_NETID, sTun.name()).isOk());
3991
3992 std::vector<UidRangeParcel> uidRanges = {makeUidRangeParcel(BASE_UID + 1, BASE_UID + 1),
3993 makeUidRangeParcel(BASE_UID + 10, BASE_UID + 12)};
3994 EXPECT_TRUE(mNetd->networkAddUidRanges(APP_DEFAULT_NETID, uidRanges).isOk());
3995
3996 binder::Status status;
3997 status = mNetd->networkAddUidRanges(APP_DEFAULT_NETID,
3998 {makeUidRangeParcel(BASE_UID + 1, BASE_UID + 1)});
3999 EXPECT_FALSE(status.isOk());
4000 EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode());
4001
4002 status = mNetd->networkAddUidRanges(APP_DEFAULT_NETID,
4003 {makeUidRangeParcel(BASE_UID + 9, BASE_UID + 10)});
4004 EXPECT_FALSE(status.isOk());
4005 EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode());
4006
4007 status = mNetd->networkAddUidRanges(APP_DEFAULT_NETID,
4008 {makeUidRangeParcel(BASE_UID + 11, BASE_UID + 11)});
4009 EXPECT_FALSE(status.isOk());
4010 EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode());
4011
4012 status = mNetd->networkAddUidRanges(APP_DEFAULT_NETID,
4013 {makeUidRangeParcel(BASE_UID + 12, BASE_UID + 13)});
4014 EXPECT_FALSE(status.isOk());
4015 EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode());
4016
4017 status = mNetd->networkAddUidRanges(APP_DEFAULT_NETID,
4018 {makeUidRangeParcel(BASE_UID + 9, BASE_UID + 13)});
4019 EXPECT_FALSE(status.isOk());
4020 EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode());
4021
4022 std::vector<UidRangeParcel> selfOverlappedUidRanges = {
4023 makeUidRangeParcel(BASE_UID + 20, BASE_UID + 20),
4024 makeUidRangeParcel(BASE_UID + 20, BASE_UID + 21)};
4025 status = mNetd->networkAddUidRanges(APP_DEFAULT_NETID, selfOverlappedUidRanges);
4026 EXPECT_FALSE(status.isOk());
4027 EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode());
4028}
4029
Ken Chen8738e1c2020-11-24 11:38:54 +08004030// Verify whether IP rules for app default network are correctly configured.
4031TEST_F(NetdBinderTest, PerAppDefaultNetwork_VerifyIpRules) {
Ken Chenab5f3472021-04-04 11:28:06 +08004032 const auto& config = makeNativeNetworkConfig(APP_DEFAULT_NETID, NativeNetworkType::PHYSICAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +08004033 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08004034 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
Ken Chen8738e1c2020-11-24 11:38:54 +08004035 EXPECT_TRUE(mNetd->networkAddInterface(APP_DEFAULT_NETID, sTun.name()).isOk());
4036
4037 std::vector<UidRangeParcel> uidRanges = {makeUidRangeParcel(BASE_UID + 8005, BASE_UID + 8012),
4038 makeUidRangeParcel(BASE_UID + 8090, BASE_UID + 8099)};
4039
4040 EXPECT_TRUE(mNetd->networkAddUidRanges(APP_DEFAULT_NETID, uidRanges).isOk());
Ken Chen4ea88462021-05-23 14:56:43 +08004041 verifyAppUidRules({true, true} /*expectedResults*/, uidRanges, sTun.name(),
Patrick Rohre2f1b5a2022-01-25 21:36:50 +01004042 UidRanges::SUB_PRIORITY_HIGHEST);
Ken Chen8738e1c2020-11-24 11:38:54 +08004043 EXPECT_TRUE(mNetd->networkRemoveUidRanges(APP_DEFAULT_NETID, {uidRanges.at(0)}).isOk());
Ken Chen4ea88462021-05-23 14:56:43 +08004044 verifyAppUidRules({false, true} /*expectedResults*/, uidRanges, sTun.name(),
Patrick Rohre2f1b5a2022-01-25 21:36:50 +01004045 UidRanges::SUB_PRIORITY_HIGHEST);
Ken Chen8738e1c2020-11-24 11:38:54 +08004046 EXPECT_TRUE(mNetd->networkRemoveUidRanges(APP_DEFAULT_NETID, {uidRanges.at(1)}).isOk());
Ken Chen4ea88462021-05-23 14:56:43 +08004047 verifyAppUidRules({false, false} /*expectedResults*/, uidRanges, sTun.name(),
Patrick Rohre2f1b5a2022-01-25 21:36:50 +01004048 UidRanges::SUB_PRIORITY_HIGHEST);
Ken Chen4e8ef9b2021-03-17 01:57:19 +08004049
4050 EXPECT_TRUE(mNetd->networkAddUidRanges(INetd::UNREACHABLE_NET_ID, uidRanges).isOk());
Ken Chen4ea88462021-05-23 14:56:43 +08004051 verifyAppUidRules({true, true} /*expectedResults*/, uidRanges, "",
Patrick Rohre2f1b5a2022-01-25 21:36:50 +01004052 UidRanges::SUB_PRIORITY_HIGHEST);
Ken Chen4e8ef9b2021-03-17 01:57:19 +08004053 EXPECT_TRUE(mNetd->networkRemoveUidRanges(INetd::UNREACHABLE_NET_ID, {uidRanges.at(0)}).isOk());
Ken Chen4ea88462021-05-23 14:56:43 +08004054 verifyAppUidRules({false, true} /*expectedResults*/, uidRanges, "",
Patrick Rohre2f1b5a2022-01-25 21:36:50 +01004055 UidRanges::SUB_PRIORITY_HIGHEST);
Ken Chen4e8ef9b2021-03-17 01:57:19 +08004056 EXPECT_TRUE(mNetd->networkRemoveUidRanges(INetd::UNREACHABLE_NET_ID, {uidRanges.at(1)}).isOk());
Ken Chen4ea88462021-05-23 14:56:43 +08004057 verifyAppUidRules({false, false} /*expectedResults*/, uidRanges, "",
Patrick Rohre2f1b5a2022-01-25 21:36:50 +01004058 UidRanges::SUB_PRIORITY_HIGHEST);
Ken Chen8738e1c2020-11-24 11:38:54 +08004059}
4060
4061// Verify whether packets go through the right network with and without per-app default network.
4062// Meaning of Fwmark bits (from Fwmark.h):
4063// 0x0000ffff - Network ID
4064// 0x00010000 - Explicit mark bit
4065// 0x00020000 - VPN protect bit
4066// 0x000c0000 - Permission bits
4067TEST_F(NetdBinderTest, PerAppDefaultNetwork_ImplicitlySelectNetwork) {
4068 createDefaultAndOtherPhysicalNetwork(SYSTEM_DEFAULT_NETID, APP_DEFAULT_NETID);
4069
4070 int systemDefaultFd = sTun.getFdForTesting();
4071 int appDefaultFd = sTun2.getFdForTesting();
4072
4073 // Connections go through the system default network.
4074 expectPacketSentOnNetId(AID_ROOT, SYSTEM_DEFAULT_NETID, systemDefaultFd, IMPLICITLY_SELECT);
4075 expectPacketSentOnNetId(TEST_UID1, SYSTEM_DEFAULT_NETID, systemDefaultFd, IMPLICITLY_SELECT);
4076
4077 // Add TEST_UID1 to per-app default network.
4078 EXPECT_TRUE(mNetd->networkAddUidRanges(APP_DEFAULT_NETID,
4079 {makeUidRangeParcel(TEST_UID1, TEST_UID1)})
4080 .isOk());
4081 expectPacketSentOnNetId(AID_ROOT, SYSTEM_DEFAULT_NETID, systemDefaultFd, IMPLICITLY_SELECT);
4082 expectPacketSentOnNetId(TEST_UID1, APP_DEFAULT_NETID, appDefaultFd, IMPLICITLY_SELECT);
4083
4084 // Remove TEST_UID1 from per-app default network.
4085 EXPECT_TRUE(mNetd->networkRemoveUidRanges(APP_DEFAULT_NETID,
4086 {makeUidRangeParcel(TEST_UID1, TEST_UID1)})
4087 .isOk());
4088 expectPacketSentOnNetId(AID_ROOT, SYSTEM_DEFAULT_NETID, systemDefaultFd, IMPLICITLY_SELECT);
4089 expectPacketSentOnNetId(TEST_UID1, SYSTEM_DEFAULT_NETID, systemDefaultFd, IMPLICITLY_SELECT);
Ken Chen4e8ef9b2021-03-17 01:57:19 +08004090
4091 // Prohibit TEST_UID1 from using the default network.
4092 EXPECT_TRUE(mNetd->networkAddUidRanges(INetd::UNREACHABLE_NET_ID,
4093 {makeUidRangeParcel(TEST_UID1, TEST_UID1)})
4094 .isOk());
4095 expectPacketSentOnNetId(AID_ROOT, SYSTEM_DEFAULT_NETID, systemDefaultFd, IMPLICITLY_SELECT);
4096 expectUnreachableError(TEST_UID1, INetd::UNREACHABLE_NET_ID, IMPLICITLY_SELECT);
4097
4098 // restore IP rules
4099 EXPECT_TRUE(mNetd->networkRemoveUidRanges(INetd::UNREACHABLE_NET_ID,
4100 {makeUidRangeParcel(TEST_UID1, TEST_UID1)})
4101 .isOk());
Ken Chen8738e1c2020-11-24 11:38:54 +08004102}
4103
4104// Verify whether packets go through the right network when app explicitly selects a network.
4105TEST_F(NetdBinderTest, PerAppDefaultNetwork_ExplicitlySelectNetwork) {
4106 createDefaultAndOtherPhysicalNetwork(SYSTEM_DEFAULT_NETID, APP_DEFAULT_NETID);
4107
4108 int systemDefaultFd = sTun.getFdForTesting();
4109 int appDefaultFd = sTun2.getFdForTesting();
4110
4111 // Explicitly select the system default network.
4112 setNetworkForProcess(SYSTEM_DEFAULT_NETID);
4113 // Connections go through the system default network.
4114 expectPacketSentOnNetId(AID_ROOT, SYSTEM_DEFAULT_NETID, systemDefaultFd, EXPLICITLY_SELECT);
4115 expectPacketSentOnNetId(TEST_UID1, SYSTEM_DEFAULT_NETID, systemDefaultFd, EXPLICITLY_SELECT);
4116
Ken Chen4e8ef9b2021-03-17 01:57:19 +08004117 // Set TEST_UID1 to default unreachable, which won't affect the explicitly selected network.
4118 // Connections go through the system default network.
4119 EXPECT_TRUE(mNetd->networkAddUidRanges(INetd::UNREACHABLE_NET_ID,
4120 {makeUidRangeParcel(TEST_UID1, TEST_UID1)})
4121 .isOk());
4122 expectPacketSentOnNetId(AID_ROOT, SYSTEM_DEFAULT_NETID, systemDefaultFd, EXPLICITLY_SELECT);
4123 expectPacketSentOnNetId(TEST_UID1, SYSTEM_DEFAULT_NETID, systemDefaultFd, EXPLICITLY_SELECT);
4124
4125 // restore IP rules
4126 EXPECT_TRUE(mNetd->networkRemoveUidRanges(INetd::UNREACHABLE_NET_ID,
4127 {makeUidRangeParcel(TEST_UID1, TEST_UID1)})
4128 .isOk());
4129
Ken Chen8738e1c2020-11-24 11:38:54 +08004130 // Add TEST_UID1 to per-app default network, which won't affect the explicitly selected network.
4131 EXPECT_TRUE(mNetd->networkAddUidRanges(APP_DEFAULT_NETID,
4132 {makeUidRangeParcel(TEST_UID1, TEST_UID1)})
4133 .isOk());
4134 expectPacketSentOnNetId(AID_ROOT, SYSTEM_DEFAULT_NETID, systemDefaultFd, EXPLICITLY_SELECT);
4135 expectPacketSentOnNetId(TEST_UID1, SYSTEM_DEFAULT_NETID, systemDefaultFd, EXPLICITLY_SELECT);
4136
4137 // Explicitly select the per-app default network.
4138 setNetworkForProcess(APP_DEFAULT_NETID);
4139 // Connections go through the per-app default network.
4140 expectPacketSentOnNetId(AID_ROOT, APP_DEFAULT_NETID, appDefaultFd, EXPLICITLY_SELECT);
4141 expectPacketSentOnNetId(TEST_UID1, APP_DEFAULT_NETID, appDefaultFd, EXPLICITLY_SELECT);
4142}
4143
4144// Verify whether packets go through the right network if app does not implicitly or explicitly
4145// select any network.
4146TEST_F(NetdBinderTest, PerAppDefaultNetwork_UnconnectedSocket) {
4147 createDefaultAndOtherPhysicalNetwork(SYSTEM_DEFAULT_NETID, APP_DEFAULT_NETID);
4148
4149 int systemDefaultFd = sTun.getFdForTesting();
4150 int appDefaultFd = sTun2.getFdForTesting();
4151
4152 // Connections go through the system default network.
4153 expectPacketSentOnNetId(AID_ROOT, NETID_UNSET, systemDefaultFd, UNCONNECTED_SOCKET);
4154 expectPacketSentOnNetId(TEST_UID1, NETID_UNSET, systemDefaultFd, UNCONNECTED_SOCKET);
4155
4156 // Add TEST_UID1 to per-app default network. Traffic should go through the per-app default
4157 // network if UID is in range. Otherwise, go through the system default network.
4158 EXPECT_TRUE(mNetd->networkAddUidRanges(APP_DEFAULT_NETID,
4159 {makeUidRangeParcel(TEST_UID1, TEST_UID1)})
4160 .isOk());
4161 expectPacketSentOnNetId(AID_ROOT, NETID_UNSET, systemDefaultFd, UNCONNECTED_SOCKET);
4162 expectPacketSentOnNetId(TEST_UID1, NETID_UNSET, appDefaultFd, UNCONNECTED_SOCKET);
Ken Chen4e8ef9b2021-03-17 01:57:19 +08004163
Ken Chen55db3802021-03-30 13:47:49 +08004164 // Set TEST_UID1's default network to unreachable. Its traffic should still go through the
4165 // per-app default network. Other traffic go through the system default network.
4166 // PS: per-app default network take precedence over unreachable network. This should happens
4167 // only in the transition period when both rules are briefly set.
Ken Chen4e8ef9b2021-03-17 01:57:19 +08004168 EXPECT_TRUE(mNetd->networkAddUidRanges(INetd::UNREACHABLE_NET_ID,
4169 {makeUidRangeParcel(TEST_UID1, TEST_UID1)})
4170 .isOk());
4171 expectPacketSentOnNetId(AID_ROOT, NETID_UNSET, systemDefaultFd, UNCONNECTED_SOCKET);
Ken Chen55db3802021-03-30 13:47:49 +08004172 expectPacketSentOnNetId(TEST_UID1, NETID_UNSET, appDefaultFd, UNCONNECTED_SOCKET);
4173
4174 // Remove TEST_UID1's default network from OEM-paid network. Its traffic should get ENETUNREACH
4175 // error. Other traffic still go through the system default network.
4176 EXPECT_TRUE(mNetd->networkRemoveUidRanges(APP_DEFAULT_NETID,
4177 {makeUidRangeParcel(TEST_UID1, TEST_UID1)})
4178 .isOk());
4179 expectPacketSentOnNetId(AID_ROOT, NETID_UNSET, systemDefaultFd, UNCONNECTED_SOCKET);
Ken Chen4e8ef9b2021-03-17 01:57:19 +08004180 expectUnreachableError(TEST_UID1, NETID_UNSET, UNCONNECTED_SOCKET);
4181
4182 // restore IP rules
4183 EXPECT_TRUE(mNetd->networkRemoveUidRanges(INetd::UNREACHABLE_NET_ID,
4184 {makeUidRangeParcel(TEST_UID1, TEST_UID1)})
4185 .isOk());
Ken Chen8738e1c2020-11-24 11:38:54 +08004186}
4187
4188TEST_F(NetdBinderTest, PerAppDefaultNetwork_PermissionCheck) {
4189 createPhysicalNetwork(APP_DEFAULT_NETID, sTun2.name(), INetd::PERMISSION_SYSTEM);
4190
4191 { // uid is not in app range. Can not set network for process.
4192 ScopedUidChange scopedUidChange(TEST_UID1);
4193 EXPECT_EQ(-EACCES, setNetworkForProcess(APP_DEFAULT_NETID));
4194 }
4195
4196 EXPECT_TRUE(mNetd->networkAddUidRanges(APP_DEFAULT_NETID,
4197 {makeUidRangeParcel(TEST_UID1, TEST_UID1)})
4198 .isOk());
4199
4200 { // uid is in app range. Can set network for process.
4201 ScopedUidChange scopedUidChange(TEST_UID1);
4202 EXPECT_EQ(0, setNetworkForProcess(APP_DEFAULT_NETID));
4203 }
4204}
4205
4206class VpnParameterizedTest : public NetdBinderTest, public testing::WithParamInterface<bool> {};
4207
4208// Exercise secure and bypassable VPN.
4209INSTANTIATE_TEST_SUITE_P(PerAppDefaultNetwork, VpnParameterizedTest, testing::Bool(),
4210 [](const testing::TestParamInfo<bool>& info) {
4211 return info.param ? "SecureVPN" : "BypassableVPN";
4212 });
4213
4214// Verify per-app default network + VPN.
4215TEST_P(VpnParameterizedTest, ImplicitlySelectNetwork) {
4216 const bool isSecureVPN = GetParam();
4217 createVpnAndAppDefaultNetworkWithUid(
4218 SYSTEM_DEFAULT_NETID, APP_DEFAULT_NETID, VPN_NETID, isSecureVPN,
4219 {makeUidRangeParcel(TEST_UID2, TEST_UID1)} /* app range */,
4220 {makeUidRangeParcel(TEST_UID3, TEST_UID2)} /* VPN range */);
4221
4222 int systemDefaultFd = sTun.getFdForTesting();
4223 int appDefaultFd = sTun2.getFdForTesting();
4224 int vpnFd = sTun3.getFdForTesting();
4225
4226 // uid is neither in app range, nor in VPN range. Traffic goes through system default network.
4227 expectPacketSentOnNetId(AID_ROOT, SYSTEM_DEFAULT_NETID, systemDefaultFd, IMPLICITLY_SELECT);
4228 // uid is in VPN range, not in app range. Traffic goes through VPN.
4229 expectPacketSentOnNetId(TEST_UID3, (isSecureVPN ? SYSTEM_DEFAULT_NETID : VPN_NETID), vpnFd,
4230 IMPLICITLY_SELECT);
4231 // uid is in app range, not in VPN range. Traffic goes through per-app default network.
4232 expectPacketSentOnNetId(TEST_UID1, APP_DEFAULT_NETID, appDefaultFd, IMPLICITLY_SELECT);
4233 // uid is in both app and VPN range. Traffic goes through VPN.
4234 expectPacketSentOnNetId(TEST_UID2, (isSecureVPN ? APP_DEFAULT_NETID : VPN_NETID), vpnFd,
4235 IMPLICITLY_SELECT);
4236}
4237
4238class VpnAndSelectNetworkParameterizedTest
4239 : public NetdBinderTest,
4240 public testing::WithParamInterface<std::tuple<bool, int>> {};
4241
4242// Exercise the combination of different VPN types and different user selected networks. e.g.
4243// secure VPN + select on system default network
4244// secure VPN + select on app default network
4245// secure VPN + select on VPN
4246// bypassable VPN + select on system default network
4247// ...
4248INSTANTIATE_TEST_SUITE_P(PerAppDefaultNetwork, VpnAndSelectNetworkParameterizedTest,
4249 testing::Combine(testing::Bool(),
4250 testing::Values(SYSTEM_DEFAULT_NETID, APP_DEFAULT_NETID,
4251 VPN_NETID)),
4252 [](const testing::TestParamInfo<std::tuple<bool, int>>& info) {
4253 const std::string vpnType = std::get<0>(info.param)
4254 ? std::string("SecureVPN")
4255 : std::string("BypassableVPN");
4256 std::string selectedNetwork;
4257 switch (std::get<1>(info.param)) {
4258 case SYSTEM_DEFAULT_NETID:
4259 selectedNetwork = "SystemDefaultNetwork";
4260 break;
4261 case APP_DEFAULT_NETID:
4262 selectedNetwork = "AppDefaultNetwork";
4263 break;
4264 case VPN_NETID:
4265 selectedNetwork = "VPN";
4266 break;
4267 default:
4268 selectedNetwork = "InvalidParameter"; // Should not happen.
4269 }
4270 return vpnType + "_select" + selectedNetwork;
4271 });
4272
4273TEST_P(VpnAndSelectNetworkParameterizedTest, ExplicitlySelectNetwork) {
4274 bool isSecureVPN;
4275 int selectedNetId;
4276 std::tie(isSecureVPN, selectedNetId) = GetParam();
4277 createVpnAndAppDefaultNetworkWithUid(
4278 SYSTEM_DEFAULT_NETID, APP_DEFAULT_NETID, VPN_NETID, isSecureVPN,
4279 {makeUidRangeParcel(TEST_UID2, TEST_UID1)} /* app range */,
4280 {makeUidRangeParcel(TEST_UID3, TEST_UID2)} /* VPN range */);
4281
4282 int expectedFd = -1;
4283 switch (selectedNetId) {
4284 case SYSTEM_DEFAULT_NETID:
4285 expectedFd = sTun.getFdForTesting();
4286 break;
4287 case APP_DEFAULT_NETID:
4288 expectedFd = sTun2.getFdForTesting();
4289 break;
4290 case VPN_NETID:
4291 expectedFd = sTun3.getFdForTesting();
4292 break;
4293 default:
4294 GTEST_LOG_(ERROR) << "unexpected netId:" << selectedNetId; // Should not happen.
4295 }
4296
4297 // In all following permutations, Traffic should go through the specified network if a process
4298 // can select network for itself. The fwmark should contain process UID and the explicit select
4299 // bit.
4300 { // uid is neither in app range, nor in VPN range. Permission bits, protect bit, and explicit
4301 // select bit are all set because of AID_ROOT.
4302 ScopedUidChange scopedUidChange(AID_ROOT);
4303 EXPECT_EQ(0, setNetworkForProcess(selectedNetId));
4304 expectPacketSentOnNetId(AID_ROOT, selectedNetId, expectedFd, EXPLICITLY_SELECT);
4305 }
4306 { // uid is in VPN range, not in app range.
4307 ScopedUidChange scopedUidChange(TEST_UID3);
4308 // Cannot select non-VPN networks when uid is subject to secure VPN.
4309 if (isSecureVPN && selectedNetId != VPN_NETID) {
4310 EXPECT_EQ(-EPERM, setNetworkForProcess(selectedNetId));
4311 } else {
4312 EXPECT_EQ(0, setNetworkForProcess(selectedNetId));
4313 expectPacketSentOnNetId(TEST_UID3, selectedNetId, expectedFd, EXPLICITLY_SELECT);
4314 }
4315 }
4316 { // uid is in app range, not in VPN range.
4317 ScopedUidChange scopedUidChange(TEST_UID1);
4318 // Cannot select the VPN because the VPN does not applies to the UID.
4319 if (selectedNetId == VPN_NETID) {
4320 EXPECT_EQ(-EPERM, setNetworkForProcess(selectedNetId));
4321 } else {
4322 EXPECT_EQ(0, setNetworkForProcess(selectedNetId));
4323 expectPacketSentOnNetId(TEST_UID1, selectedNetId, expectedFd, EXPLICITLY_SELECT);
4324 }
4325 }
4326 { // uid is in both app range and VPN range.
4327 ScopedUidChange scopedUidChange(TEST_UID2);
4328 // Cannot select non-VPN networks when uid is subject to secure VPN.
4329 if (isSecureVPN && selectedNetId != VPN_NETID) {
4330 EXPECT_EQ(-EPERM, setNetworkForProcess(selectedNetId));
4331 } else {
4332 EXPECT_EQ(0, setNetworkForProcess(selectedNetId));
4333 expectPacketSentOnNetId(TEST_UID2, selectedNetId, expectedFd, EXPLICITLY_SELECT);
4334 }
4335 }
4336}
4337
4338TEST_P(VpnParameterizedTest, UnconnectedSocket) {
4339 const bool isSecureVPN = GetParam();
4340 createVpnAndAppDefaultNetworkWithUid(
4341 SYSTEM_DEFAULT_NETID, APP_DEFAULT_NETID, VPN_NETID, isSecureVPN,
4342 {makeUidRangeParcel(TEST_UID2, TEST_UID1)} /* app range */,
4343 {makeUidRangeParcel(TEST_UID3, TEST_UID2)} /* VPN range */);
4344
4345 int systemDefaultFd = sTun.getFdForTesting();
4346 int appDefaultFd = sTun2.getFdForTesting();
4347 int vpnFd = sTun3.getFdForTesting();
4348
4349 // uid is neither in app range, nor in VPN range. Traffic goes through system default network.
4350 expectPacketSentOnNetId(AID_ROOT, NETID_UNSET, systemDefaultFd, UNCONNECTED_SOCKET);
4351 // uid is in VPN range, not in app range. Traffic goes through VPN.
4352 expectPacketSentOnNetId(TEST_UID3, NETID_UNSET, vpnFd, UNCONNECTED_SOCKET);
4353 // uid is in app range, not in VPN range. Traffic goes through per-app default network.
4354 expectPacketSentOnNetId(TEST_UID1, NETID_UNSET, appDefaultFd, UNCONNECTED_SOCKET);
4355 // uid is in both app and VPN range. Traffic goes through VPN.
4356 expectPacketSentOnNetId(TEST_UID2, NETID_UNSET, vpnFd, UNCONNECTED_SOCKET);
4357}
Ken Chenab5f3472021-04-04 11:28:06 +08004358
4359TEST_F(NetdBinderTest, NetworkCreate) {
4360 auto config = makeNativeNetworkConfig(TEST_NETID1, NativeNetworkType::PHYSICAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +08004361 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08004362 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
4363 EXPECT_TRUE(mNetd->networkDestroy(config.netId).isOk());
4364
4365 config.networkType = NativeNetworkType::VIRTUAL;
4366 config.secure = true;
4367 config.vpnType = NativeVpnType::OEM;
4368 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
4369
4370 // invalid network type
4371 auto wrongConfig = makeNativeNetworkConfig(TEST_NETID2, static_cast<NativeNetworkType>(-1),
Chiachang Wang6dd46152022-01-12 10:02:32 +08004372 INetd::PERMISSION_NONE, false, false);
Ken Chenab5f3472021-04-04 11:28:06 +08004373 EXPECT_EQ(EINVAL, mNetd->networkCreate(wrongConfig).serviceSpecificErrorCode());
4374
4375 // invalid VPN type
4376 wrongConfig.networkType = NativeNetworkType::VIRTUAL;
4377 wrongConfig.vpnType = static_cast<NativeVpnType>(-1);
4378 EXPECT_EQ(EINVAL, mNetd->networkCreate(wrongConfig).serviceSpecificErrorCode());
4379}
Ken Chen4ea88462021-05-23 14:56:43 +08004380
4381// Verifies valid and invalid inputs on networkAddUidRangesParcel method.
4382TEST_F(NetdBinderTest, UidRangeSubPriority_ValidateInputs) {
4383 createVpnAndOtherPhysicalNetwork(SYSTEM_DEFAULT_NETID, APP_DEFAULT_NETID, VPN_NETID,
4384 /*isSecureVPN=*/true);
Ken Chen53360bf2021-12-10 02:41:05 +08004385 // Invalid priority -10 on a physical network.
Ken Chen4ea88462021-05-23 14:56:43 +08004386 NativeUidRangeConfig uidRangeConfig =
4387 makeNativeUidRangeConfig(APP_DEFAULT_NETID, {makeUidRangeParcel(BASE_UID, BASE_UID)},
Patrick Rohre2f1b5a2022-01-25 21:36:50 +01004388 UidRanges::SUB_PRIORITY_HIGHEST - 10);
Ken Chen4ea88462021-05-23 14:56:43 +08004389 binder::Status status = mNetd->networkAddUidRangesParcel(uidRangeConfig);
4390 EXPECT_FALSE(status.isOk());
4391 EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode());
4392
4393 // Invalid priority 1000 on a physical network.
Patrick Rohre6f198c2022-01-25 13:50:31 +01004394 uidRangeConfig.subPriority = UidRanges::SUB_PRIORITY_NO_DEFAULT + 1;
Ken Chen4ea88462021-05-23 14:56:43 +08004395 status = mNetd->networkAddUidRangesParcel(uidRangeConfig);
4396 EXPECT_FALSE(status.isOk());
4397 EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode());
4398
4399 // Virtual networks support only default priority.
4400 uidRangeConfig.netId = VPN_NETID;
4401 uidRangeConfig.subPriority = SUB_PRIORITY_1;
4402 status = mNetd->networkAddUidRangesParcel(uidRangeConfig);
4403 EXPECT_FALSE(status.isOk());
4404 EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode());
4405
4406 // For a single network, identical UID ranges with different priorities are allowed.
4407 uidRangeConfig.netId = APP_DEFAULT_NETID;
4408 uidRangeConfig.subPriority = SUB_PRIORITY_1;
4409 EXPECT_TRUE(mNetd->networkAddUidRangesParcel(uidRangeConfig).isOk());
4410 uidRangeConfig.subPriority = SUB_PRIORITY_2;
4411 EXPECT_TRUE(mNetd->networkAddUidRangesParcel(uidRangeConfig).isOk());
4412
4413 // For a single network, identical UID ranges with the same priority is invalid.
4414 status = mNetd->networkAddUidRangesParcel(uidRangeConfig);
4415 EXPECT_FALSE(status.isOk());
4416 EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode());
4417
4418 // Overlapping ranges is invalid.
4419 uidRangeConfig.uidRanges = {makeUidRangeParcel(BASE_UID + 1, BASE_UID + 1),
4420 makeUidRangeParcel(BASE_UID + 1, BASE_UID + 1)};
4421 status = mNetd->networkAddUidRangesParcel(uidRangeConfig);
4422 EXPECT_FALSE(status.isOk());
4423 EXPECT_EQ(EINVAL, status.serviceSpecificErrorCode());
4424}
4425
4426// Examines whether IP rules for app default network with subsidiary priorities are correctly added
4427// and removed.
4428TEST_F(NetdBinderTest, UidRangeSubPriority_VerifyPhysicalNwIpRules) {
4429 createPhysicalNetwork(TEST_NETID1, sTun.name());
4430 EXPECT_TRUE(mNetd->networkAddRoute(TEST_NETID1, sTun.name(), "::/0", "").isOk());
4431 createPhysicalNetwork(TEST_NETID2, sTun2.name());
4432 EXPECT_TRUE(mNetd->networkAddRoute(TEST_NETID2, sTun2.name(), "::/0", "").isOk());
4433
4434 // Adds priority 1 setting
4435 NativeUidRangeConfig uidRangeConfig1 = makeNativeUidRangeConfig(
4436 TEST_NETID1, {makeUidRangeParcel(BASE_UID, BASE_UID)}, SUB_PRIORITY_1);
4437 EXPECT_TRUE(mNetd->networkAddUidRangesParcel(uidRangeConfig1).isOk());
4438 verifyAppUidRules({true}, uidRangeConfig1, sTun.name());
4439 // Adds priority 2 setting
4440 NativeUidRangeConfig uidRangeConfig2 = makeNativeUidRangeConfig(
4441 TEST_NETID2, {makeUidRangeParcel(BASE_UID + 1, BASE_UID + 1)}, SUB_PRIORITY_2);
4442 EXPECT_TRUE(mNetd->networkAddUidRangesParcel(uidRangeConfig2).isOk());
4443 verifyAppUidRules({true}, uidRangeConfig2, sTun2.name());
4444 // Adds another priority 2 setting
4445 NativeUidRangeConfig uidRangeConfig3 = makeNativeUidRangeConfig(
4446 INetd::UNREACHABLE_NET_ID, {makeUidRangeParcel(BASE_UID + 2, BASE_UID + 2)},
4447 SUB_PRIORITY_2);
4448 EXPECT_TRUE(mNetd->networkAddUidRangesParcel(uidRangeConfig3).isOk());
4449 verifyAppUidRules({true}, uidRangeConfig3, "");
4450
4451 // Removes.
4452 EXPECT_TRUE(mNetd->networkRemoveUidRangesParcel(uidRangeConfig1).isOk());
4453 verifyAppUidRules({false}, uidRangeConfig1, sTun.name());
4454 verifyAppUidRules({true}, uidRangeConfig2, sTun2.name());
4455 verifyAppUidRules({true}, uidRangeConfig3, "");
4456 EXPECT_TRUE(mNetd->networkRemoveUidRangesParcel(uidRangeConfig2).isOk());
4457 verifyAppUidRules({false}, uidRangeConfig1, sTun.name());
4458 verifyAppUidRules({false}, uidRangeConfig2, sTun2.name());
4459 verifyAppUidRules({true}, uidRangeConfig3, "");
4460 EXPECT_TRUE(mNetd->networkRemoveUidRangesParcel(uidRangeConfig3).isOk());
4461 verifyAppUidRules({false}, uidRangeConfig1, sTun.name());
4462 verifyAppUidRules({false}, uidRangeConfig2, sTun2.name());
4463 verifyAppUidRules({false}, uidRangeConfig3, "");
4464}
4465
4466// Verify uid range rules on virtual network.
4467TEST_P(VpnParameterizedTest, UidRangeSubPriority_VerifyVpnIpRules) {
4468 const bool isSecureVPN = GetParam();
4469 constexpr int VPN_NETID2 = TEST_NETID2;
4470
4471 // Create 2 VPNs, using sTun and sTun2.
4472 auto config = makeNativeNetworkConfig(VPN_NETID, NativeNetworkType::VIRTUAL,
Chiachang Wang6dd46152022-01-12 10:02:32 +08004473 INetd::PERMISSION_NONE, isSecureVPN, false);
Ken Chen4ea88462021-05-23 14:56:43 +08004474 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
4475 EXPECT_TRUE(mNetd->networkAddInterface(VPN_NETID, sTun.name()).isOk());
4476
4477 config = makeNativeNetworkConfig(VPN_NETID2, NativeNetworkType::VIRTUAL, INetd::PERMISSION_NONE,
Chiachang Wang6dd46152022-01-12 10:02:32 +08004478 isSecureVPN, false);
Ken Chen4ea88462021-05-23 14:56:43 +08004479 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
4480 EXPECT_TRUE(mNetd->networkAddInterface(VPN_NETID2, sTun2.name()).isOk());
4481
4482 // Assign uid ranges to different VPNs. Check if rules match.
4483 NativeUidRangeConfig uidRangeConfig1 = makeNativeUidRangeConfig(
Patrick Rohre2f1b5a2022-01-25 21:36:50 +01004484 VPN_NETID, {makeUidRangeParcel(BASE_UID, BASE_UID)}, UidRanges::SUB_PRIORITY_HIGHEST);
Ken Chen4ea88462021-05-23 14:56:43 +08004485 EXPECT_TRUE(mNetd->networkAddUidRangesParcel(uidRangeConfig1).isOk());
Chiachang Wang2e9443f2022-01-14 22:55:36 +08004486 verifyVpnUidRules({true}, uidRangeConfig1, sTun.name(), isSecureVPN, false);
Ken Chen4ea88462021-05-23 14:56:43 +08004487
4488 NativeUidRangeConfig uidRangeConfig2 =
4489 makeNativeUidRangeConfig(VPN_NETID2, {makeUidRangeParcel(BASE_UID + 1, BASE_UID + 1)},
Patrick Rohre2f1b5a2022-01-25 21:36:50 +01004490 UidRanges::SUB_PRIORITY_HIGHEST);
Ken Chen4ea88462021-05-23 14:56:43 +08004491 EXPECT_TRUE(mNetd->networkAddUidRangesParcel(uidRangeConfig2).isOk());
Chiachang Wang2e9443f2022-01-14 22:55:36 +08004492 verifyVpnUidRules({true}, uidRangeConfig2, sTun2.name(), isSecureVPN, false);
Ken Chen4ea88462021-05-23 14:56:43 +08004493
4494 // Remove uid configs one-by-one. Check if rules match.
4495 EXPECT_TRUE(mNetd->networkRemoveUidRangesParcel(uidRangeConfig1).isOk());
Chiachang Wang2e9443f2022-01-14 22:55:36 +08004496 verifyVpnUidRules({false}, uidRangeConfig1, sTun.name(), isSecureVPN, false);
4497 verifyVpnUidRules({true}, uidRangeConfig2, sTun2.name(), isSecureVPN, false);
Ken Chen4ea88462021-05-23 14:56:43 +08004498 EXPECT_TRUE(mNetd->networkRemoveUidRangesParcel(uidRangeConfig2).isOk());
Chiachang Wang2e9443f2022-01-14 22:55:36 +08004499 verifyVpnUidRules({false}, uidRangeConfig1, sTun.name(), isSecureVPN, false);
4500 verifyVpnUidRules({false}, uidRangeConfig2, sTun2.name(), isSecureVPN, false);
4501}
4502
4503// Verify VPN ip rule on bypassable/secureVPN virtual network with local routes excluded
4504TEST_P(VpnParameterizedTest, VerifyVpnIpRules_excludeLocalRoutes) {
4505 const bool isSecureVPN = GetParam();
4506 // Create VPN with local route excluded
4507 auto config = makeNativeNetworkConfig(VPN_NETID, NativeNetworkType::VIRTUAL,
4508 INetd::PERMISSION_NONE, isSecureVPN, true);
4509 EXPECT_TRUE(mNetd->networkCreate(config).isOk());
4510 EXPECT_TRUE(mNetd->networkAddInterface(VPN_NETID, sTun.name()).isOk());
4511
4512 // Assign uid ranges to VPN. Check if rules match.
4513 NativeUidRangeConfig uidRangeConfig1 = makeNativeUidRangeConfig(
Patrick Rohre2f1b5a2022-01-25 21:36:50 +01004514 VPN_NETID, {makeUidRangeParcel(BASE_UID, BASE_UID)}, UidRanges::SUB_PRIORITY_HIGHEST);
Chiachang Wang2e9443f2022-01-14 22:55:36 +08004515 EXPECT_TRUE(mNetd->networkAddUidRangesParcel(uidRangeConfig1).isOk());
4516 verifyVpnUidRules({true}, uidRangeConfig1, sTun.name(), isSecureVPN, true);
4517
4518 // Remove uid configs. Check if rules match.
4519 EXPECT_TRUE(mNetd->networkRemoveUidRangesParcel(uidRangeConfig1).isOk());
4520 verifyVpnUidRules({false}, uidRangeConfig1, sTun.name(), isSecureVPN, true);
Ken Chen4ea88462021-05-23 14:56:43 +08004521}
4522
4523// Verify if packets go through the right network when subsidiary priority and VPN works together.
4524//
4525// Test config:
4526// +----------+------------------------+-------------------------------------------+
4527// | Priority | UID | Assigned Network |
4528// +----------+------------------------+-------------------------------------------+
4529// | 0 | TEST_UID1 | VPN bypassable (VPN_NETID) |
4530// +----------+------------------------+-------------------------------------------+
4531// | 1 | TEST_UID1, TEST_UID2, | Physical Network 1 (APP_DEFAULT_1_NETID) |
4532// | 1 | TEST_UID3 | Physical Network 2 (APP_DEFAULT_2_NETID) |
4533// | 1 | TEST_UID5 | Unreachable Network (UNREACHABLE_NET_ID) |
4534// +----------+------------------------+-------------------------------------------+
4535// | 2 | TEST_UID3 | Physical Network 1 (APP_DEFAULT_1_NETID) |
4536// | 2 | TEST_UID4, TEST_UID5 | Physical Network 2 (APP_DEFAULT_2_NETID) |
4537// +----------+------------------------+-------------------------------------------+
4538//
4539// Expected results:
4540// +-----------+------------------------+
4541// | UID | Using Network |
4542// +-----------+------------------------+
4543// | TEST_UID1 | VPN |
4544// | TEST_UID2 | Physical Network 1 |
4545// | TEST_UID3 | Physical Network 2 |
4546// | TEST_UID4 | Physical Network 2 |
4547// | TEST_UID5 | Unreachable Network |
4548// | TEST_UID6 | System Default Network |
4549// +-----------+------------------------+
4550//
4551// SYSTEM_DEFAULT_NETID uses sTun.
4552// APP_DEFAULT_1_NETID uses sTun2.
4553// VPN_NETID uses sTun3.
4554// APP_DEFAULT_2_NETID uses sTun4.
4555//
4556TEST_F(NetdBinderTest, UidRangeSubPriority_ImplicitlySelectNetwork) {
4557 constexpr int APP_DEFAULT_1_NETID = TEST_NETID2;
4558 constexpr int APP_DEFAULT_2_NETID = TEST_NETID4;
4559
Ken Chena43e7ce2021-07-08 17:09:42 +08004560 static const struct TestData {
4561 uint32_t subPriority;
4562 std::vector<UidRangeParcel> uidRanges;
4563 unsigned int netId;
4564 } kTestData[] = {
Patrick Rohre2f1b5a2022-01-25 21:36:50 +01004565 {UidRanges::SUB_PRIORITY_HIGHEST, {makeUidRangeParcel(TEST_UID1)}, VPN_NETID},
Ken Chena43e7ce2021-07-08 17:09:42 +08004566 {SUB_PRIORITY_1,
4567 {makeUidRangeParcel(TEST_UID1), makeUidRangeParcel(TEST_UID2)},
4568 APP_DEFAULT_1_NETID},
4569 {SUB_PRIORITY_1, {makeUidRangeParcel(TEST_UID3)}, APP_DEFAULT_2_NETID},
4570 {SUB_PRIORITY_1, {makeUidRangeParcel(TEST_UID5)}, INetd::UNREACHABLE_NET_ID},
4571 {SUB_PRIORITY_2, {makeUidRangeParcel(TEST_UID3)}, APP_DEFAULT_1_NETID},
4572 {SUB_PRIORITY_2,
4573 {makeUidRangeParcel(TEST_UID4), makeUidRangeParcel(TEST_UID5)},
4574 APP_DEFAULT_2_NETID},
4575 };
4576
Ken Chen4ea88462021-05-23 14:56:43 +08004577 // Creates 4 networks.
4578 createVpnAndOtherPhysicalNetwork(SYSTEM_DEFAULT_NETID, APP_DEFAULT_1_NETID, VPN_NETID,
4579 /*isSecureVPN=*/false);
4580 createPhysicalNetwork(APP_DEFAULT_2_NETID, sTun4.name());
4581 EXPECT_TRUE(mNetd->networkAddRoute(APP_DEFAULT_2_NETID, sTun4.name(), "::/0", "").isOk());
4582
Ken Chena43e7ce2021-07-08 17:09:42 +08004583 for (const auto& td : kTestData) {
4584 NativeUidRangeConfig uidRangeConfig =
4585 makeNativeUidRangeConfig(td.netId, td.uidRanges, td.subPriority);
4586 EXPECT_TRUE(mNetd->networkAddUidRangesParcel(uidRangeConfig).isOk());
4587 }
Ken Chen4ea88462021-05-23 14:56:43 +08004588
4589 int systemDefaultFd = sTun.getFdForTesting();
4590 int appDefault_1_Fd = sTun2.getFdForTesting();
4591 int vpnFd = sTun3.getFdForTesting();
4592 int appDefault_2_Fd = sTun4.getFdForTesting();
4593 // Verify routings.
4594 expectPacketSentOnNetId(TEST_UID1, VPN_NETID, vpnFd, IMPLICITLY_SELECT);
4595 expectPacketSentOnNetId(TEST_UID2, APP_DEFAULT_1_NETID, appDefault_1_Fd, IMPLICITLY_SELECT);
4596 expectPacketSentOnNetId(TEST_UID3, APP_DEFAULT_2_NETID, appDefault_2_Fd, IMPLICITLY_SELECT);
4597 expectPacketSentOnNetId(TEST_UID4, APP_DEFAULT_2_NETID, appDefault_2_Fd, IMPLICITLY_SELECT);
4598 expectUnreachableError(TEST_UID5, INetd::UNREACHABLE_NET_ID, IMPLICITLY_SELECT);
4599 expectPacketSentOnNetId(TEST_UID6, SYSTEM_DEFAULT_NETID, systemDefaultFd, IMPLICITLY_SELECT);
4600
4601 // Remove test rules from the unreachable network.
Ken Chena43e7ce2021-07-08 17:09:42 +08004602 for (const auto& td : kTestData) {
4603 if (td.netId == INetd::UNREACHABLE_NET_ID) {
4604 NativeUidRangeConfig uidRangeConfig =
4605 makeNativeUidRangeConfig(td.netId, td.uidRanges, td.subPriority);
4606 EXPECT_TRUE(mNetd->networkRemoveUidRangesParcel(uidRangeConfig).isOk());
4607 }
4608 }
Taras Antoshchuk35987de2021-09-21 17:45:15 +02004609}
Patrick Rohre6f198c2022-01-25 13:50:31 +01004610
4611class PerAppNetworkPermissionsTest : public NetdBinderTest {
4612 public:
4613 int bindSocketToNetwork(int sock, int netId, bool explicitlySelected) {
4614 ScopedUidChange uidChange(AID_ROOT);
4615 Fwmark fwmark;
4616 fwmark.explicitlySelected = explicitlySelected;
4617 fwmark.netId = netId;
4618 return setsockopt(sock, SOL_SOCKET, SO_MARK, &(fwmark.intValue), sizeof(fwmark.intValue));
4619 }
4620
4621 void changeNetworkPermissionForUid(int netId, int uid, bool add) {
4622 auto nativeUidRangeConfig = makeNativeUidRangeConfig(netId, {makeUidRangeParcel(uid, uid)},
4623 UidRanges::SUB_PRIORITY_NO_DEFAULT);
4624 ScopedUidChange rootUid(AID_ROOT);
4625 if (add) {
4626 EXPECT_TRUE(mNetd->networkAddUidRangesParcel(nativeUidRangeConfig).isOk());
4627 } else {
4628 EXPECT_TRUE(mNetd->networkRemoveUidRangesParcel(nativeUidRangeConfig).isOk());
4629 }
4630 }
4631
4632 protected:
4633 static inline const sockaddr_in6 TEST_SOCKADDR_IN6 = {
4634 .sin6_family = AF_INET6,
4635 .sin6_port = 42,
4636 .sin6_addr = V6_ADDR,
4637 };
4638 std::array<char, 4096> mTestBuf;
4639};
4640
4641TEST_F(PerAppNetworkPermissionsTest, HasExplicitAccess) {
4642 // TEST_NETID1 -> restricted network
4643 createPhysicalNetwork(TEST_NETID1, sTun.name(), INetd::PERMISSION_SYSTEM);
4644 EXPECT_TRUE(mNetd->networkAddRoute(TEST_NETID1, sTun.name(), "::/0", "").isOk());
4645
4646 // Change uid to uid without PERMISSION_SYSTEM
4647 ScopedUidChange testUid(TEST_UID1);
4648 unique_fd sock(socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0));
4649 EXPECT_EQ(bindSocketToNetwork(sock, TEST_NETID1, true /*explicitlySelected*/), 0);
4650
4651 // Test without permissions should fail
4652 EXPECT_EQ(connect(sock, (sockaddr*)&TEST_SOCKADDR_IN6, sizeof(TEST_SOCKADDR_IN6)), -1);
4653
4654 // Test access with permission succeeds and packet is routed correctly
4655 changeNetworkPermissionForUid(TEST_NETID1, TEST_UID1, true /*add*/);
4656 EXPECT_EQ(connect(sock, (sockaddr*)&TEST_SOCKADDR_IN6, sizeof(TEST_SOCKADDR_IN6)), 0);
4657 EXPECT_EQ(send(sock, "foo", sizeof("foo"), 0), (int)sizeof("foo"));
4658 EXPECT_GT(read(sTun.getFdForTesting(), mTestBuf.data(), mTestBuf.size()), 0);
4659
4660 // Test removing permissions.
4661 // Note: Send will still succeed as the destination is cached in
4662 // sock.sk_dest_cache. Try another connect instead.
4663 changeNetworkPermissionForUid(TEST_NETID1, TEST_UID1, false /*add*/);
4664 EXPECT_EQ(-1, connect(sock, (sockaddr*)&TEST_SOCKADDR_IN6, sizeof(TEST_SOCKADDR_IN6)));
4665}
4666
4667TEST_F(PerAppNetworkPermissionsTest, HasImplicitAccess) {
4668 // TEST_NETID1 -> restricted network
4669 createPhysicalNetwork(TEST_NETID1, sTun.name(), INetd::PERMISSION_SYSTEM);
4670 EXPECT_TRUE(mNetd->networkAddRoute(TEST_NETID1, sTun.name(), "::/0", "").isOk());
4671
4672 // Change uid to uid without PERMISSION_SYSTEM
4673 ScopedUidChange testUid(TEST_UID1);
4674 unique_fd sock(socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0));
4675 EXPECT_EQ(bindSocketToNetwork(sock, TEST_NETID1, false /*explicitlySelected*/), 0);
4676
4677 // Note: we cannot call connect() when implicitly selecting the network as
4678 // the fwmark would get reset to the default network.
4679 // Call connect which should bind socket to default network
4680 EXPECT_EQ(sendto(sock, "foo", sizeof("foo"), 0, (sockaddr*)&TEST_SOCKADDR_IN6,
4681 sizeof(TEST_SOCKADDR_IN6)),
4682 -1);
4683
4684 // Test access with permission succeeds and packet is routed correctly
4685 changeNetworkPermissionForUid(TEST_NETID1, TEST_UID1, true /*add*/);
4686 EXPECT_EQ(sendto(sock, "foo", sizeof("foo"), 0, (sockaddr*)&TEST_SOCKADDR_IN6,
4687 sizeof(TEST_SOCKADDR_IN6)),
4688 (int)sizeof("foo"));
4689 EXPECT_GT(read(sTun.getFdForTesting(), mTestBuf.data(), mTestBuf.size()), 0);
4690}
4691
4692TEST_F(PerAppNetworkPermissionsTest, DoesNotAffectDefaultNetworkSelection) {
4693 // TEST_NETID1 -> default network
4694 // TEST_NETID2 -> restricted network
4695 createPhysicalNetwork(TEST_NETID1, sTun.name(), INetd::PERMISSION_NONE);
4696 createPhysicalNetwork(TEST_NETID2, sTun2.name(), INetd::PERMISSION_SYSTEM);
4697 EXPECT_TRUE(mNetd->networkAddRoute(TEST_NETID1, sTun.name(), "::/0", "").isOk());
4698 EXPECT_TRUE(mNetd->networkAddRoute(TEST_NETID2, sTun2.name(), "::/0", "").isOk());
4699 mNetd->networkSetDefault(TEST_NETID1);
4700
4701 changeNetworkPermissionForUid(TEST_NETID2, TEST_UID1, true /*add*/);
4702
4703 // Change uid to uid without PERMISSION_SYSTEM
4704 ScopedUidChange testUid(TEST_UID1);
4705 unique_fd sock(socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0));
4706
4707 // Connect should select default network
4708 EXPECT_EQ(connect(sock, (sockaddr*)&TEST_SOCKADDR_IN6, sizeof(TEST_SOCKADDR_IN6)), 0);
4709 EXPECT_EQ(send(sock, "foo", sizeof("foo"), 0), (int)sizeof("foo"));
4710 EXPECT_GT(read(sTun.getFdForTesting(), mTestBuf.data(), mTestBuf.size()), 0);
4711}
4712
4713TEST_F(PerAppNetworkPermissionsTest, PermissionDoesNotAffectPerAppDefaultNetworkSelection) {
4714 // TEST_NETID1 -> restricted app default network
4715 // TEST_NETID2 -> restricted network
4716 createPhysicalNetwork(TEST_NETID1, sTun.name(), INetd::PERMISSION_SYSTEM);
4717 createPhysicalNetwork(TEST_NETID2, sTun2.name(), INetd::PERMISSION_SYSTEM);
4718 EXPECT_TRUE(mNetd->networkAddRoute(TEST_NETID1, sTun.name(), "::/0", "").isOk());
4719 EXPECT_TRUE(mNetd->networkAddRoute(TEST_NETID2, sTun2.name(), "::/0", "").isOk());
4720
4721 auto nativeUidRangeConfig = makeNativeUidRangeConfig(
4722 TEST_NETID1, {makeUidRangeParcel(TEST_UID1, TEST_UID1)}, 0 /*subPriority*/);
4723 EXPECT_TRUE(mNetd->networkAddUidRangesParcel(nativeUidRangeConfig).isOk());
4724 changeNetworkPermissionForUid(TEST_NETID2, TEST_UID1, true /*add*/);
4725
4726 // Change uid to uid without PERMISSION_SYSTEM
4727 ScopedUidChange testUid(TEST_UID1);
4728 unique_fd sock(socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0));
4729
4730 // Connect should select app default network
4731 EXPECT_EQ(connect(sock, (sockaddr*)&TEST_SOCKADDR_IN6, sizeof(TEST_SOCKADDR_IN6)), 0);
4732 EXPECT_EQ(send(sock, "foo", sizeof("foo"), 0), (int)sizeof("foo"));
4733 EXPECT_GT(read(sTun.getFdForTesting(), mTestBuf.data(), mTestBuf.size()), 0);
4734}
4735
4736TEST_F(PerAppNetworkPermissionsTest, PermissionOnlyAffectsUid) {
4737 // TEST_NETID1 -> restricted network
4738 // TEST_NETID2 -> restricted network
4739 createPhysicalNetwork(TEST_NETID1, sTun.name(), INetd::PERMISSION_SYSTEM);
4740 createPhysicalNetwork(TEST_NETID2, sTun2.name(), INetd::PERMISSION_SYSTEM);
4741 EXPECT_TRUE(mNetd->networkAddRoute(TEST_NETID1, sTun.name(), "::/0", "").isOk());
4742 EXPECT_TRUE(mNetd->networkAddRoute(TEST_NETID2, sTun2.name(), "::/0", "").isOk());
4743
4744 // test that neither TEST_UID1, nor TEST_UID2 have access without permission
4745 {
4746 // TEST_UID1
4747 ScopedUidChange testUid(TEST_UID1);
4748 unique_fd sock(socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0));
4749 // TEST_NETID1
4750 EXPECT_EQ(bindSocketToNetwork(sock, TEST_NETID1, true /*explicitlySelected*/), 0);
4751 EXPECT_EQ(connect(sock, (sockaddr*)&TEST_SOCKADDR_IN6, sizeof(TEST_SOCKADDR_IN6)), -1);
4752 // TEST_NETID2
4753 EXPECT_EQ(bindSocketToNetwork(sock, TEST_NETID2, true /*explicitlySelected*/), 0);
4754 EXPECT_EQ(connect(sock, (sockaddr*)&TEST_SOCKADDR_IN6, sizeof(TEST_SOCKADDR_IN6)), -1);
4755 }
4756 {
4757 // TEST_UID2
4758 ScopedUidChange testUid(TEST_UID2);
4759 unique_fd sock(socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0));
4760 // TEST_NETID1
4761 EXPECT_EQ(bindSocketToNetwork(sock, TEST_NETID1, true /*explicitlySelected*/), 0);
4762 EXPECT_EQ(connect(sock, (sockaddr*)&TEST_SOCKADDR_IN6, sizeof(TEST_SOCKADDR_IN6)), -1);
4763 // TEST_NETID2
4764 EXPECT_EQ(bindSocketToNetwork(sock, TEST_NETID2, true /*explicitlySelected*/), 0);
4765 EXPECT_EQ(connect(sock, (sockaddr*)&TEST_SOCKADDR_IN6, sizeof(TEST_SOCKADDR_IN6)), -1);
4766 }
4767
4768 changeNetworkPermissionForUid(TEST_NETID1, TEST_UID1, true);
4769
4770 // test that TEST_UID1 has access to TEST_UID1
4771 {
4772 // TEST_UID1
4773 ScopedUidChange testUid(TEST_UID1);
4774 unique_fd sock(socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0));
4775 // TEST_NETID1
4776 EXPECT_EQ(bindSocketToNetwork(sock, TEST_NETID1, true /*explicitlySelected*/), 0);
4777 EXPECT_EQ(connect(sock, (sockaddr*)&TEST_SOCKADDR_IN6, sizeof(TEST_SOCKADDR_IN6)), 0);
4778 // TEST_NETID2
4779 EXPECT_EQ(bindSocketToNetwork(sock, TEST_NETID2, true /*explicitlySelected*/), 0);
4780 EXPECT_EQ(connect(sock, (sockaddr*)&TEST_SOCKADDR_IN6, sizeof(TEST_SOCKADDR_IN6)), -1);
4781 }
4782 {
4783 // TEST_UID2
4784 ScopedUidChange testUid(TEST_UID2);
4785 unique_fd sock(socket(AF_INET6, SOCK_DGRAM | SOCK_CLOEXEC, 0));
4786 // TEST_NETID1
4787 EXPECT_EQ(bindSocketToNetwork(sock, TEST_NETID1, true /*explicitlySelected*/), 0);
4788 EXPECT_EQ(connect(sock, (sockaddr*)&TEST_SOCKADDR_IN6, sizeof(TEST_SOCKADDR_IN6)), -1);
4789 // TEST_NETID2
4790 EXPECT_EQ(bindSocketToNetwork(sock, TEST_NETID2, true /*explicitlySelected*/), 0);
4791 EXPECT_EQ(connect(sock, (sockaddr*)&TEST_SOCKADDR_IN6, sizeof(TEST_SOCKADDR_IN6)), -1);
4792 }
4793}
paulhu72742952022-02-09 21:24:09 +08004794
4795class MDnsBinderTest : public ::testing::Test {
4796 public:
4797 MDnsBinderTest() {
4798 sp<IServiceManager> sm = android::defaultServiceManager();
4799 sp<IBinder> binder = sm->getService(String16("mdns"));
4800 if (binder != nullptr) {
4801 mMDns = android::interface_cast<IMDns>(binder);
4802 }
4803 }
4804
4805 void SetUp() override { ASSERT_NE(nullptr, mMDns.get()); }
4806
4807 void TearDown() override {}
4808
4809 protected:
4810 sp<IMDns> mMDns;
4811};
4812
4813class TestMDnsListener : public android::net::mdns::aidl::BnMDnsEventListener {
4814 public:
4815 Status onServiceRegistrationStatus(const RegistrationInfo& /* status */) override {
4816 return Status::ok();
4817 }
4818 Status onServiceDiscoveryStatus(const DiscoveryInfo& /* status */) override {
4819 return Status::ok();
4820 }
4821 Status onServiceResolutionStatus(const ResolutionInfo& /* status */) override {
4822 return Status::ok();
4823 }
4824 Status onGettingServiceAddressStatus(const GetAddressInfo& /* status */) override {
4825 return Status::ok();
4826 }
4827};
4828
4829TEST_F(MDnsBinderTest, EventListenerTest) {
4830 // Register a null listener.
4831 binder::Status status = mMDns->registerEventListener(nullptr);
4832 EXPECT_FALSE(status.isOk());
4833
4834 // Unregister a null listener.
4835 status = mMDns->unregisterEventListener(nullptr);
4836 EXPECT_FALSE(status.isOk());
4837
4838 // Register the test listener.
4839 android::sp<TestMDnsListener> testListener = new TestMDnsListener();
4840 status = mMDns->registerEventListener(testListener);
4841 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
4842
4843 // Register the duplicated listener
4844 status = mMDns->registerEventListener(testListener);
4845 EXPECT_FALSE(status.isOk());
4846
4847 // Unregister the test listener
4848 status = mMDns->unregisterEventListener(testListener);
4849 EXPECT_TRUE(status.isOk()) << status.exceptionMessage();
4850}