blob: fb7f83942694191b2efdc29657ca4e1760b555e0 [file] [log] [blame]
Lorenzo Colittie4d626e2016-02-02 17:19:04 +09001/**
2 * Copyright (c) 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
17#define LOG_TAG "Netd"
18
Luke Huangcaebcbb2018-09-27 20:37:14 +080019#include <cinttypes>
Xiao Ma33d562a2018-12-16 16:27:38 +090020#include <numeric>
Ben Schwartz4204ecf2017-10-02 12:35:48 -040021#include <set>
Xiao Ma64b15b72019-03-20 11:33:15 +090022#include <string>
Erik Kline38e51f12018-09-06 20:14:44 +090023#include <tuple>
Lorenzo Colitti89faa342016-02-26 11:38:47 +090024#include <vector>
25
Chenbo Fengf5663d82018-11-08 16:10:48 -080026#include <android-base/file.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090027#include <android-base/stringprintf.h>
Ben Schwartz4204ecf2017-10-02 12:35:48 -040028#include <android-base/strings.h>
Luke Huange3f11812019-05-02 18:10:15 +080029#include <binder/IPCThreadState.h>
30#include <binder/IServiceManager.h>
31#include <binder/Status.h>
Robin Lee2cf56172016-09-13 18:55:42 +090032#include <cutils/properties.h>
Logan Chien3f461482018-04-23 14:31:32 +080033#include <log/log.h>
Luke Huange3f11812019-05-02 18:10:15 +080034#include <netdutils/DumpWriter.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090035#include <utils/Errors.h>
Pierre Imaibeedec32016-04-13 06:44:51 +090036#include <utils/String16.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090037
Luke Huange3f11812019-05-02 18:10:15 +080038#include "BinderUtil.h"
Lorenzo Colitti89faa342016-02-26 11:38:47 +090039#include "Controllers.h"
Chiachang Wang00fc62f2019-12-04 20:38:26 +080040#include "Fwmark.h"
Erik Kline55b06f82016-07-04 09:57:18 +090041#include "InterfaceController.h"
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090042#include "NetdNativeService.h"
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090043#include "NetdPermissions.h"
Luke Huang0e5e69d2019-03-06 15:42:38 +080044#include "OemNetdListener.h"
Luke Huangb670d162018-08-23 20:01:13 +080045#include "Permission.h"
Erik Kline85890042018-05-25 19:19:11 +090046#include "Process.h"
Robin Leeb8087362016-03-30 18:43:08 +010047#include "RouteController.h"
Lorenzo Colitti563d98b2016-04-24 13:13:14 +090048#include "SockDiag.h"
Robin Leeb8087362016-03-30 18:43:08 +010049#include "UidRanges.h"
Xiao Ma33d562a2018-12-16 16:27:38 +090050#include "android/net/BnNetd.h"
Bernie Innocenti189eb502018-10-01 23:10:18 +090051#include "netid_client.h" // NETID_UNSET
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090052
53using android::base::StringPrintf;
Chenbo Fengf5663d82018-11-08 16:10:48 -080054using android::base::WriteStringToFile;
Luke Huangcaebcbb2018-09-27 20:37:14 +080055using android::net::TetherStatsParcel;
Luke Huang94658ac2018-10-18 19:35:12 +090056using android::net::UidRangeParcel;
Luke Huangb257d612019-03-14 21:19:13 +080057using android::netdutils::DumpWriter;
58using android::netdutils::ScopedIndent;
Luke Huange203a152018-11-23 11:47:28 +080059using android::os::ParcelFileDescriptor;
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090060
61namespace android {
62namespace net {
63
64namespace {
Erik Klineb31fd692018-06-06 20:50:11 +090065const char OPT_SHORT[] = "--short";
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090066
Automerger Merge Worker2b0f5862020-03-05 12:25:24 +000067// The input permissions should be equivalent that this function would return ok if any of them is
68// granted.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090069binder::Status checkAnyPermission(const std::vector<const char*>& permissions) {
Luke Huanga38b65c2018-09-26 16:31:03 +080070 pid_t pid = IPCThreadState::self()->getCallingPid();
71 uid_t uid = IPCThreadState::self()->getCallingUid();
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090072
Automerger Merge Worker2b0f5862020-03-05 12:25:24 +000073 // TODO: Do the pure permission check in this function. Have another method
74 // (e.g. checkNetworkStackPermission) to wrap AID_SYSTEM and
75 // AID_NETWORK_STACK uid check.
Luke Huanga38b65c2018-09-26 16:31:03 +080076 // If the caller is the system UID, don't check permissions.
77 // Otherwise, if the system server's binder thread pool is full, and all the threads are
78 // blocked on a thread that's waiting for us to complete, we deadlock. http://b/69389492
79 //
80 // From a security perspective, there is currently no difference, because:
Automerger Merge Workeraa65d712020-03-05 10:29:36 +000081 // 1. The system server has the NETWORK_STACK permission, which grants access to all the
82 // IPCs in this file.
Luke Huanga38b65c2018-09-26 16:31:03 +080083 // 2. AID_SYSTEM always has all permissions. See ActivityManager#checkComponentPermission.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090084 if (uid == AID_SYSTEM) {
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090085 return binder::Status::ok();
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090086 }
Automerger Merge Worker2b0f5862020-03-05 12:25:24 +000087 // AID_NETWORK_STACK own MAINLINE_NETWORK_STACK permission, don't IPC to system server to check
88 // MAINLINE_NETWORK_STACK permission. Cross-process(netd, networkstack and system server)
89 // deadlock: http://b/149766727
90 if (uid == AID_NETWORK_STACK) {
91 for (const char* permission : permissions) {
92 if (std::strcmp(permission, PERM_MAINLINE_NETWORK_STACK) == 0) {
93 return binder::Status::ok();
94 }
95 }
96 }
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090097
98 for (const char* permission : permissions) {
99 if (checkPermission(String16(permission), pid, uid)) {
100 return binder::Status::ok();
101 }
102 }
103
104 auto err = StringPrintf("UID %d / PID %d does not have any of the following permissions: %s",
105 uid, pid, android::base::Join(permissions, ',').c_str());
106 return binder::Status::fromExceptionCode(binder::Status::EX_SECURITY, err.c_str());
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900107}
108
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900109#define ENFORCE_ANY_PERMISSION(...) \
110 do { \
111 binder::Status status = checkAnyPermission({__VA_ARGS__}); \
112 if (!status.isOk()) { \
113 return status; \
114 } \
115 } while (0)
Robin Lee2cf56172016-09-13 18:55:42 +0900116
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900117#define NETD_LOCKING_RPC(lock, ... /* permissions */) \
118 ENFORCE_ANY_PERMISSION(__VA_ARGS__); \
Bernie Innocentiabf8a342018-08-10 15:17:16 +0900119 std::lock_guard _lock(lock);
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900120
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900121#define NETD_BIG_LOCK_RPC(... /* permissions */) NETD_LOCKING_RPC(gBigNetdLock, __VA_ARGS__)
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900122
Luke Huangf7782042018-08-08 13:13:04 +0800123#define RETURN_BINDER_STATUS_IF_NOT_OK(logEntry, res) \
124 do { \
125 if (!isOk((res))) { \
126 logErrorStatus((logEntry), (res)); \
127 return asBinderStatus((res)); \
128 } \
129 } while (0)
130
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900131#define ENFORCE_NETWORK_STACK_PERMISSIONS() \
132 ENFORCE_ANY_PERMISSION(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK)
133
Luke Huangf7782042018-08-08 13:13:04 +0800134void logErrorStatus(netdutils::LogEntry& logEntry, const netdutils::Status& status) {
135 gLog.log(logEntry.returns(status.code()).withAutomaticDuration());
136}
137
Bernie Innocenti97f388f2018-10-16 19:17:08 +0900138binder::Status asBinderStatus(const netdutils::Status& status) {
139 if (isOk(status)) {
140 return binder::Status::ok();
141 }
142 return binder::Status::fromServiceSpecificError(status.code(), status.msg().c_str());
143}
144
Lorenzo Colittie801d3c2020-02-18 00:00:35 +0900145template <typename T>
146binder::Status asBinderStatus(const base::Result<T> result) {
147 if (result.ok()) return binder::Status::ok();
148
149 return binder::Status::fromServiceSpecificError(result.error().code(),
150 result.error().message().c_str());
151}
152
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900153inline binder::Status statusFromErrcode(int ret) {
154 if (ret) {
155 return binder::Status::fromServiceSpecificError(-ret, strerror(-ret));
156 }
157 return binder::Status::ok();
158}
159
Erik Klineb31fd692018-06-06 20:50:11 +0900160bool contains(const Vector<String16>& words, const String16& word) {
161 for (const auto& w : words) {
162 if (w == word) return true;
163 }
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900164
Erik Klineb31fd692018-06-06 20:50:11 +0900165 return false;
166}
167
168} // namespace
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900169
Luke Huange3f11812019-05-02 18:10:15 +0800170NetdNativeService::NetdNativeService() {
171 // register log callback to BnNetd::logFunc
172 BnNetd::logFunc = std::bind(binderCallLogFn, std::placeholders::_1,
173 [](const std::string& msg) { gLog.info("%s", msg.c_str()); });
174}
175
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900176status_t NetdNativeService::start() {
177 IPCThreadState::self()->disableBackgroundScheduling(true);
Erik Klineb31fd692018-06-06 20:50:11 +0900178 const status_t ret = BinderService<NetdNativeService>::publish();
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900179 if (ret != android::OK) {
180 return ret;
181 }
182 sp<ProcessState> ps(ProcessState::self());
183 ps->startThreadPool();
184 ps->giveThreadPoolName();
Xiao Ma33d562a2018-12-16 16:27:38 +0900185
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900186 return android::OK;
187}
188
Hugo Benichi7b314e12018-01-15 21:54:00 +0900189status_t NetdNativeService::dump(int fd, const Vector<String16> &args) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900190 const binder::Status dump_permission = checkAnyPermission({PERM_DUMP});
Erik Kline2d3a1632016-03-15 16:33:48 +0900191 if (!dump_permission.isOk()) {
192 const String8 msg(dump_permission.toString8());
193 write(fd, msg.string(), msg.size());
194 return PERMISSION_DENIED;
195 }
196
197 // This method does not grab any locks. If individual classes need locking
198 // their dump() methods MUST handle locking appropriately.
Hugo Benichi7b314e12018-01-15 21:54:00 +0900199
Erik Kline2d3a1632016-03-15 16:33:48 +0900200 DumpWriter dw(fd);
Hugo Benichi7b314e12018-01-15 21:54:00 +0900201
202 if (!args.isEmpty() && args[0] == TcpSocketMonitor::DUMP_KEYWORD) {
203 dw.blankline();
204 gCtls->tcpSocketMonitor.dump(dw);
205 dw.blankline();
206 return NO_ERROR;
207 }
208
Chenbo Fengef297172018-03-26 10:53:33 -0700209 if (!args.isEmpty() && args[0] == TrafficController::DUMP_KEYWORD) {
210 dw.blankline();
211 gCtls->trafficCtrl.dump(dw, true);
212 dw.blankline();
213 return NO_ERROR;
214 }
215
Erik Kline85890042018-05-25 19:19:11 +0900216 process::dump(dw);
Erik Kline2d3a1632016-03-15 16:33:48 +0900217 dw.blankline();
218 gCtls->netCtrl.dump(dw);
219 dw.blankline();
220
Chenbo Fengef297172018-03-26 10:53:33 -0700221 gCtls->trafficCtrl.dump(dw, false);
222 dw.blankline();
223
Benedict Wongaf855432018-05-10 17:07:37 -0700224 gCtls->xfrmCtrl.dump(dw);
225 dw.blankline();
226
Maciej Żenczykowski55262712019-03-29 23:44:56 -0700227 gCtls->clatdCtrl.dump(dw);
228 dw.blankline();
229
Lorenzo Colitti52db3912020-02-17 23:59:45 +0900230 gCtls->tetherCtrl.dump(dw);
231 dw.blankline();
232
Erik Klineb31fd692018-06-06 20:50:11 +0900233 {
234 ScopedIndent indentLog(dw);
235 if (contains(args, String16(OPT_SHORT))) {
236 dw.println("Log: <omitted>");
237 } else {
238 dw.println("Log:");
239 ScopedIndent indentLogEntries(dw);
240 gLog.forEachEntry([&dw](const std::string& entry) mutable { dw.println(entry); });
241 }
242 dw.blankline();
243 }
244
Luke Huang528af602018-08-29 19:06:05 +0800245 {
246 ScopedIndent indentLog(dw);
247 if (contains(args, String16(OPT_SHORT))) {
248 dw.println("UnsolicitedLog: <omitted>");
249 } else {
250 dw.println("UnsolicitedLog:");
251 ScopedIndent indentLogEntries(dw);
252 gUnsolicitedLog.forEachEntry(
253 [&dw](const std::string& entry) mutable { dw.println(entry); });
254 }
255 dw.blankline();
256 }
257
Erik Kline2d3a1632016-03-15 16:33:48 +0900258 return NO_ERROR;
259}
260
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900261binder::Status NetdNativeService::isAlive(bool *alive) {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000262 NETD_BIG_LOCK_RPC(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900263
264 *alive = true;
Erik Klineb31fd692018-06-06 20:50:11 +0900265
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900266 return binder::Status::ok();
267}
268
Erik Klinef52d4522018-03-14 15:01:46 +0900269binder::Status NetdNativeService::firewallReplaceUidChain(const std::string& chainName,
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900270 bool isWhitelist, const std::vector<int32_t>& uids, bool *ret) {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000271 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Erik Klinef52d4522018-03-14 15:01:46 +0900272 int err = gCtls->firewallCtrl.replaceUidChain(chainName, isWhitelist, uids);
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900273 *ret = (err == 0);
274 return binder::Status::ok();
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900275}
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900276
277binder::Status NetdNativeService::bandwidthEnableDataSaver(bool enable, bool *ret) {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000278 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900279 int err = gCtls->bandwidthCtrl.enableDataSaver(enable);
280 *ret = (err == 0);
281 return binder::Status::ok();
282}
283
Luke Huang531f5d32018-08-03 15:19:05 +0800284binder::Status NetdNativeService::bandwidthSetInterfaceQuota(const std::string& ifName,
285 int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900286 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800287 int res = gCtls->bandwidthCtrl.setInterfaceQuota(ifName, bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800288 return statusFromErrcode(res);
289}
290
291binder::Status NetdNativeService::bandwidthRemoveInterfaceQuota(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900292 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800293 int res = gCtls->bandwidthCtrl.removeInterfaceQuota(ifName);
Luke Huang531f5d32018-08-03 15:19:05 +0800294 return statusFromErrcode(res);
295}
296
297binder::Status NetdNativeService::bandwidthSetInterfaceAlert(const std::string& ifName,
298 int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900299 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800300 int res = gCtls->bandwidthCtrl.setInterfaceAlert(ifName, bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800301 return statusFromErrcode(res);
302}
303
304binder::Status NetdNativeService::bandwidthRemoveInterfaceAlert(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900305 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800306 int res = gCtls->bandwidthCtrl.removeInterfaceAlert(ifName);
Luke Huang531f5d32018-08-03 15:19:05 +0800307 return statusFromErrcode(res);
308}
309
310binder::Status NetdNativeService::bandwidthSetGlobalAlert(int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900311 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800312 int res = gCtls->bandwidthCtrl.setGlobalAlert(bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800313 return statusFromErrcode(res);
314}
315
316binder::Status NetdNativeService::bandwidthAddNaughtyApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900317 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800318 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
319 int res = gCtls->bandwidthCtrl.addNaughtyApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800320 return statusFromErrcode(res);
321}
322
323binder::Status NetdNativeService::bandwidthRemoveNaughtyApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900324 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800325 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
326 int res = gCtls->bandwidthCtrl.removeNaughtyApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800327 return statusFromErrcode(res);
328}
329
330binder::Status NetdNativeService::bandwidthAddNiceApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900331 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800332 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
333 int res = gCtls->bandwidthCtrl.addNiceApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800334 return statusFromErrcode(res);
335}
336
337binder::Status NetdNativeService::bandwidthRemoveNiceApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900338 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800339 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
340 int res = gCtls->bandwidthCtrl.removeNiceApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800341 return statusFromErrcode(res);
342}
343
Luke Huangb670d162018-08-23 20:01:13 +0800344binder::Status NetdNativeService::networkCreatePhysical(int32_t netId, int32_t permission) {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000345 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +0800346 int ret = gCtls->netCtrl.createPhysicalNetwork(netId, convertPermission(permission));
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900347 return statusFromErrcode(ret);
348}
349
cken67cd14c2018-12-05 17:26:59 +0900350binder::Status NetdNativeService::networkCreateVpn(int32_t netId, bool secure) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900351 ENFORCE_NETWORK_STACK_PERMISSIONS();
cken67cd14c2018-12-05 17:26:59 +0900352 int ret = gCtls->netCtrl.createVirtualNetwork(netId, secure);
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900353 return statusFromErrcode(ret);
354}
355
356binder::Status NetdNativeService::networkDestroy(int32_t netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900357 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangd33a8f42019-03-14 16:10:04 +0800358 // NetworkController::destroyNetwork is thread-safe.
Mike Yu4fe1b9c2019-01-29 17:50:19 +0800359 const int ret = gCtls->netCtrl.destroyNetwork(netId);
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900360 return statusFromErrcode(ret);
361}
362
363binder::Status NetdNativeService::networkAddInterface(int32_t netId, const std::string& iface) {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000364 ENFORCE_NETWORK_STACK_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900365 int ret = gCtls->netCtrl.addInterfaceToNetwork(netId, iface.c_str());
366 return statusFromErrcode(ret);
367}
368
369binder::Status NetdNativeService::networkRemoveInterface(int32_t netId, const std::string& iface) {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000370 ENFORCE_NETWORK_STACK_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900371 int ret = gCtls->netCtrl.removeInterfaceFromNetwork(netId, iface.c_str());
372 return statusFromErrcode(ret);
373}
374
Luke Huang94658ac2018-10-18 19:35:12 +0900375binder::Status NetdNativeService::networkAddUidRanges(
376 int32_t netId, const std::vector<UidRangeParcel>& uidRangeArray) {
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900377 // NetworkController::addUsersToNetwork is thread-safe.
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000378 ENFORCE_NETWORK_STACK_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900379 int ret = gCtls->netCtrl.addUsersToNetwork(netId, UidRanges(uidRangeArray));
380 return statusFromErrcode(ret);
381}
382
Luke Huang94658ac2018-10-18 19:35:12 +0900383binder::Status NetdNativeService::networkRemoveUidRanges(
384 int32_t netId, const std::vector<UidRangeParcel>& uidRangeArray) {
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900385 // NetworkController::removeUsersFromNetwork is thread-safe.
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000386 ENFORCE_NETWORK_STACK_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900387 int ret = gCtls->netCtrl.removeUsersFromNetwork(netId, UidRanges(uidRangeArray));
388 return statusFromErrcode(ret);
389}
390
Luke Huang94658ac2018-10-18 19:35:12 +0900391binder::Status NetdNativeService::networkRejectNonSecureVpn(
392 bool add, const std::vector<UidRangeParcel>& uidRangeArray) {
Robin Leeb8087362016-03-30 18:43:08 +0100393 // TODO: elsewhere RouteController is only used from the tethering and network controllers, so
394 // it should be possible to use the same lock as NetworkController. However, every call through
395 // the CommandListener "network" command will need to hold this lock too, not just the ones that
396 // read/modify network internal state (that is sufficient for ::dump() because it doesn't
397 // look at routes, but it's not enough here).
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000398 NETD_BIG_LOCK_RPC(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900399 UidRanges uidRanges(uidRangeArray);
Robin Leeb8087362016-03-30 18:43:08 +0100400
401 int err;
402 if (add) {
403 err = RouteController::addUsersToRejectNonSecureNetworkRule(uidRanges);
404 } else {
405 err = RouteController::removeUsersFromRejectNonSecureNetworkRule(uidRanges);
406 }
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900407 return statusFromErrcode(err);
Robin Leeb8087362016-03-30 18:43:08 +0100408}
409
Luke Huang94658ac2018-10-18 19:35:12 +0900410binder::Status NetdNativeService::socketDestroy(const std::vector<UidRangeParcel>& uids,
411 const std::vector<int32_t>& skipUids) {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000412 ENFORCE_NETWORK_STACK_PERMISSIONS();
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900413
414 SockDiag sd;
415 if (!sd.open()) {
416 return binder::Status::fromServiceSpecificError(EIO,
417 String8("Could not open SOCK_DIAG socket"));
418 }
419
420 UidRanges uidRanges(uids);
Lorenzo Colittie5c3c992016-07-26 17:53:50 +0900421 int err = sd.destroySockets(uidRanges, std::set<uid_t>(skipUids.begin(), skipUids.end()),
422 true /* excludeLoopback */);
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900423 if (err) {
424 return binder::Status::fromServiceSpecificError(-err,
425 String8::format("destroySockets: %s", strerror(-err)));
426 }
Pierre Imaibeedec32016-04-13 06:44:51 +0900427 return binder::Status::ok();
428}
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900429
Erik Klinef48e4dd2016-07-18 04:02:07 +0900430binder::Status NetdNativeService::tetherApplyDnsInterfaces(bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900431 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Erik Klinef48e4dd2016-07-18 04:02:07 +0900432 *ret = gCtls->tetherCtrl.applyDnsInterfaces();
433 return binder::Status::ok();
434}
435
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900436namespace {
437
Luke Huangcaebcbb2018-09-27 20:37:14 +0800438void tetherAddStatsByInterface(TetherController::TetherStats* tetherStatsParcel,
439 const TetherController::TetherStats& tetherStats) {
440 if (tetherStatsParcel->extIface == tetherStats.extIface) {
441 tetherStatsParcel->rxBytes += tetherStats.rxBytes;
442 tetherStatsParcel->rxPackets += tetherStats.rxPackets;
443 tetherStatsParcel->txBytes += tetherStats.txBytes;
444 tetherStatsParcel->txPackets += tetherStats.txPackets;
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900445 }
Luke Huangcaebcbb2018-09-27 20:37:14 +0800446}
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900447
Luke Huangcaebcbb2018-09-27 20:37:14 +0800448TetherStatsParcel toTetherStatsParcel(const TetherController::TetherStats& stats) {
449 TetherStatsParcel result;
450 result.iface = stats.extIface;
451 result.rxBytes = stats.rxBytes;
452 result.rxPackets = stats.rxPackets;
453 result.txBytes = stats.txBytes;
454 result.txPackets = stats.txPackets;
455 return result;
456}
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900457
Luke Huangcaebcbb2018-09-27 20:37:14 +0800458void setTetherStatsParcelVecByInterface(std::vector<TetherStatsParcel>* tetherStatsVec,
459 const TetherController::TetherStatsList& statsList) {
460 std::map<std::string, TetherController::TetherStats> statsMap;
461 for (const auto& stats : statsList) {
462 auto iter = statsMap.find(stats.extIface);
463 if (iter != statsMap.end()) {
464 tetherAddStatsByInterface(&(iter->second), stats);
465 } else {
466 statsMap.insert(
467 std::pair<std::string, TetherController::TetherStats>(stats.extIface, stats));
468 }
469 }
470 for (auto iter = statsMap.begin(); iter != statsMap.end(); iter++) {
471 tetherStatsVec->push_back(toTetherStatsParcel(iter->second));
472 }
473}
474
475std::vector<std::string> tetherStatsParcelVecToStringVec(std::vector<TetherStatsParcel>* tVec) {
476 std::vector<std::string> result;
477 for (const auto& t : *tVec) {
478 result.push_back(StringPrintf("%s:%" PRId64 ",%" PRId64 ",%" PRId64 ",%" PRId64,
479 t.iface.c_str(), t.rxBytes, t.rxPackets, t.txBytes,
480 t.txPackets));
481 }
482 return result;
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900483}
484
485} // namespace
486
Luke Huangcaebcbb2018-09-27 20:37:14 +0800487binder::Status NetdNativeService::tetherGetStats(
488 std::vector<TetherStatsParcel>* tetherStatsParcelVec) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900489 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti5192bf72017-09-04 13:30:59 +0900490 const auto& statsList = gCtls->tetherCtrl.getTetherStats();
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900491 if (!isOk(statsList)) {
Nathan Harold28ccfef2018-03-16 19:02:47 -0700492 return asBinderStatus(statsList);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900493 }
Luke Huangcaebcbb2018-09-27 20:37:14 +0800494 setTetherStatsParcelVecByInterface(tetherStatsParcelVec, statsList.value());
495 auto statsResults = tetherStatsParcelVecToStringVec(tetherStatsParcelVec);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900496 return binder::Status::ok();
497}
498
Erik Kline53c20882016-08-02 15:22:53 +0900499binder::Status NetdNativeService::interfaceAddAddress(const std::string &ifName,
500 const std::string &addrString, int prefixLength) {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000501 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline53c20882016-08-02 15:22:53 +0900502 const int err = InterfaceController::addAddress(
503 ifName.c_str(), addrString.c_str(), prefixLength);
504 if (err != 0) {
505 return binder::Status::fromServiceSpecificError(-err,
506 String8::format("InterfaceController error: %s", strerror(-err)));
507 }
508 return binder::Status::ok();
509}
510
511binder::Status NetdNativeService::interfaceDelAddress(const std::string &ifName,
512 const std::string &addrString, int prefixLength) {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000513 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline53c20882016-08-02 15:22:53 +0900514 const int err = InterfaceController::delAddress(
515 ifName.c_str(), addrString.c_str(), prefixLength);
516 if (err != 0) {
517 return binder::Status::fromServiceSpecificError(-err,
518 String8::format("InterfaceController error: %s", strerror(-err)));
519 }
520 return binder::Status::ok();
521}
522
Erik Kline38e51f12018-09-06 20:14:44 +0900523namespace {
Erik Kline55b06f82016-07-04 09:57:18 +0900524
Erik Kline38e51f12018-09-06 20:14:44 +0900525std::tuple<binder::Status, const char*, const char*> getPathComponents(int32_t ipversion,
526 int32_t category) {
527 const char* ipversionStr = nullptr;
528 switch (ipversion) {
Erik Kline55b06f82016-07-04 09:57:18 +0900529 case INetd::IPV4:
Erik Kline38e51f12018-09-06 20:14:44 +0900530 ipversionStr = "ipv4";
Erik Kline55b06f82016-07-04 09:57:18 +0900531 break;
532 case INetd::IPV6:
Erik Kline38e51f12018-09-06 20:14:44 +0900533 ipversionStr = "ipv6";
Erik Kline55b06f82016-07-04 09:57:18 +0900534 break;
535 default:
Erik Kline38e51f12018-09-06 20:14:44 +0900536 return {binder::Status::fromServiceSpecificError(EAFNOSUPPORT, "Bad IP version"),
537 nullptr, nullptr};
Erik Kline55b06f82016-07-04 09:57:18 +0900538 }
539
Erik Kline38e51f12018-09-06 20:14:44 +0900540 const char* whichStr = nullptr;
541 switch (category) {
Erik Kline55b06f82016-07-04 09:57:18 +0900542 case INetd::CONF:
543 whichStr = "conf";
544 break;
545 case INetd::NEIGH:
546 whichStr = "neigh";
547 break;
548 default:
Erik Kline38e51f12018-09-06 20:14:44 +0900549 return {binder::Status::fromServiceSpecificError(EINVAL, "Bad category"), nullptr,
550 nullptr};
Erik Kline55b06f82016-07-04 09:57:18 +0900551 }
552
Erik Kline38e51f12018-09-06 20:14:44 +0900553 return {binder::Status::ok(), ipversionStr, whichStr};
554}
555
556} // namespace
557
558binder::Status NetdNativeService::getProcSysNet(int32_t ipversion, int32_t which,
559 const std::string& ifname,
560 const std::string& parameter, std::string* value) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900561 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline38e51f12018-09-06 20:14:44 +0900562 const auto pathParts = getPathComponents(ipversion, which);
563 const auto& pathStatus = std::get<0>(pathParts);
564 if (!pathStatus.isOk()) {
Erik Kline38e51f12018-09-06 20:14:44 +0900565 return pathStatus;
Erik Kline55b06f82016-07-04 09:57:18 +0900566 }
Erik Kline38e51f12018-09-06 20:14:44 +0900567
568 const int err = InterfaceController::getParameter(std::get<1>(pathParts),
569 std::get<2>(pathParts), ifname.c_str(),
570 parameter.c_str(), value);
Erik Kline38e51f12018-09-06 20:14:44 +0900571 return statusFromErrcode(err);
572}
573
574binder::Status NetdNativeService::setProcSysNet(int32_t ipversion, int32_t which,
575 const std::string& ifname,
576 const std::string& parameter,
577 const std::string& value) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900578 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline38e51f12018-09-06 20:14:44 +0900579 const auto pathParts = getPathComponents(ipversion, which);
580 const auto& pathStatus = std::get<0>(pathParts);
581 if (!pathStatus.isOk()) {
Erik Kline38e51f12018-09-06 20:14:44 +0900582 return pathStatus;
583 }
584
585 const int err = InterfaceController::setParameter(std::get<1>(pathParts),
586 std::get<2>(pathParts), ifname.c_str(),
587 parameter.c_str(), value.c_str());
Erik Kline38e51f12018-09-06 20:14:44 +0900588 return statusFromErrcode(err);
Erik Kline55b06f82016-07-04 09:57:18 +0900589}
590
Luke Huange203a152018-11-23 11:47:28 +0800591binder::Status NetdNativeService::ipSecSetEncapSocketOwner(const ParcelFileDescriptor& socket,
592 int newUid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900593 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wongb2daefb2017-12-06 22:05:46 -0800594
595 uid_t callerUid = IPCThreadState::self()->getCallingUid();
Luke Huange203a152018-11-23 11:47:28 +0800596 return asBinderStatus(
597 gCtls->xfrmCtrl.ipSecSetEncapSocketOwner(socket.get(), newUid, callerUid));
Benedict Wongb2daefb2017-12-06 22:05:46 -0800598}
599
Nathan Harold1a371532017-01-30 12:30:48 -0800600binder::Status NetdNativeService::ipSecAllocateSpi(
601 int32_t transformId,
Nathan Haroldda54f122018-01-09 16:42:57 -0800602 const std::string& sourceAddress,
603 const std::string& destinationAddress,
Nathan Harold1a371532017-01-30 12:30:48 -0800604 int32_t inSpi,
605 int32_t* outSpi) {
606 // Necessary locking done in IpSecService and kernel
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000607 ENFORCE_NETWORK_STACK_PERMISSIONS();
ludi6e8eccd2017-08-14 14:40:37 -0700608 return asBinderStatus(gCtls->xfrmCtrl.ipSecAllocateSpi(
Nathan Harold1a371532017-01-30 12:30:48 -0800609 transformId,
Nathan Haroldda54f122018-01-09 16:42:57 -0800610 sourceAddress,
611 destinationAddress,
Nathan Harold1a371532017-01-30 12:30:48 -0800612 inSpi,
613 outSpi));
614}
615
616binder::Status NetdNativeService::ipSecAddSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700617 int32_t transformId, int32_t mode, const std::string& sourceAddress,
618 const std::string& destinationAddress, int32_t underlyingNetId, int32_t spi,
619 int32_t markValue, int32_t markMask, const std::string& authAlgo,
620 const std::vector<uint8_t>& authKey, int32_t authTruncBits, const std::string& cryptAlgo,
621 const std::vector<uint8_t>& cryptKey, int32_t cryptTruncBits, const std::string& aeadAlgo,
622 const std::vector<uint8_t>& aeadKey, int32_t aeadIcvBits, int32_t encapType,
623 int32_t encapLocalPort, int32_t encapRemotePort, int32_t interfaceId) {
Nathan Harold1a371532017-01-30 12:30:48 -0800624 // Necessary locking done in IpSecService and kernel
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000625 ENFORCE_NETWORK_STACK_PERMISSIONS();
ludi6e8eccd2017-08-14 14:40:37 -0700626 return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityAssociation(
Benedict Wongad600cb2018-05-14 17:22:35 -0700627 transformId, mode, sourceAddress, destinationAddress, underlyingNetId, spi, markValue,
628 markMask, authAlgo, authKey, authTruncBits, cryptAlgo, cryptKey, cryptTruncBits,
Benedict Wonga450e722018-05-07 10:29:02 -0700629 aeadAlgo, aeadKey, aeadIcvBits, encapType, encapLocalPort, encapRemotePort,
630 interfaceId));
Nathan Harold1a371532017-01-30 12:30:48 -0800631}
632
633binder::Status NetdNativeService::ipSecDeleteSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700634 int32_t transformId, const std::string& sourceAddress,
635 const std::string& destinationAddress, int32_t spi, int32_t markValue, int32_t markMask,
636 int32_t interfaceId) {
Nathan Harold1a371532017-01-30 12:30:48 -0800637 // Necessary locking done in IpSecService and kernel
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000638 ENFORCE_NETWORK_STACK_PERMISSIONS();
ludi6e8eccd2017-08-14 14:40:37 -0700639 return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700640 transformId, sourceAddress, destinationAddress, spi, markValue, markMask, interfaceId));
Nathan Harold1a371532017-01-30 12:30:48 -0800641}
642
643binder::Status NetdNativeService::ipSecApplyTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800644 const ParcelFileDescriptor& socket, int32_t transformId, int32_t direction,
645 const std::string& sourceAddress, const std::string& destinationAddress, int32_t spi) {
Nathan Harold1a371532017-01-30 12:30:48 -0800646 // Necessary locking done in IpSecService and kernel
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000647 ENFORCE_NETWORK_STACK_PERMISSIONS();
ludi6e8eccd2017-08-14 14:40:37 -0700648 return asBinderStatus(gCtls->xfrmCtrl.ipSecApplyTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800649 socket.get(), transformId, direction, sourceAddress, destinationAddress, spi));
Nathan Harold1a371532017-01-30 12:30:48 -0800650}
651
652binder::Status NetdNativeService::ipSecRemoveTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800653 const ParcelFileDescriptor& socket) {
Nathan Harold1a371532017-01-30 12:30:48 -0800654 // Necessary locking done in IpSecService and kernel
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000655 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huange203a152018-11-23 11:47:28 +0800656 return asBinderStatus(gCtls->xfrmCtrl.ipSecRemoveTransportModeTransform(socket.get()));
Nathan Harold1a371532017-01-30 12:30:48 -0800657}
658
Benedict Wonga04ffa72018-05-09 21:42:42 -0700659binder::Status NetdNativeService::ipSecAddSecurityPolicy(int32_t transformId, int32_t selAddrFamily,
660 int32_t direction,
Benedict Wongad600cb2018-05-14 17:22:35 -0700661 const std::string& tmplSrcAddress,
662 const std::string& tmplDstAddress,
663 int32_t spi, int32_t markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700664 int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800665 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900666 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong84a8dca2018-01-19 12:12:17 -0800667 return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityPolicy(
Benedict Wonga04ffa72018-05-09 21:42:42 -0700668 transformId, selAddrFamily, direction, tmplSrcAddress, tmplDstAddress, spi, markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700669 markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800670}
671
Benedict Wonga450e722018-05-07 10:29:02 -0700672binder::Status NetdNativeService::ipSecUpdateSecurityPolicy(
673 int32_t transformId, int32_t selAddrFamily, int32_t direction,
674 const std::string& tmplSrcAddress, const std::string& tmplDstAddress, int32_t spi,
675 int32_t markValue, int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800676 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900677 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong84a8dca2018-01-19 12:12:17 -0800678 return asBinderStatus(gCtls->xfrmCtrl.ipSecUpdateSecurityPolicy(
Benedict Wonga04ffa72018-05-09 21:42:42 -0700679 transformId, selAddrFamily, direction, tmplSrcAddress, tmplDstAddress, spi, markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700680 markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800681}
682
Benedict Wonga04ffa72018-05-09 21:42:42 -0700683binder::Status NetdNativeService::ipSecDeleteSecurityPolicy(int32_t transformId,
684 int32_t selAddrFamily,
685 int32_t direction, int32_t markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700686 int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800687 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900688 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong84a8dca2018-01-19 12:12:17 -0800689 return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityPolicy(
Benedict Wonga450e722018-05-07 10:29:02 -0700690 transformId, selAddrFamily, direction, markValue, markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800691}
692
Benedict Wong319f17e2018-05-15 17:06:44 -0700693binder::Status NetdNativeService::ipSecAddTunnelInterface(const std::string& deviceName,
694 const std::string& localAddress,
695 const std::string& remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700696 int32_t iKey, int32_t oKey,
697 int32_t interfaceId) {
manojboopathi8707f232018-01-02 14:45:47 -0800698 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900699 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700700 netdutils::Status result = gCtls->xfrmCtrl.ipSecAddTunnelInterface(
Benedict Wonga450e722018-05-07 10:29:02 -0700701 deviceName, localAddress, remoteAddress, iKey, oKey, interfaceId, false);
Benedict Wong319f17e2018-05-15 17:06:44 -0700702 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800703}
704
Benedict Wong319f17e2018-05-15 17:06:44 -0700705binder::Status NetdNativeService::ipSecUpdateTunnelInterface(const std::string& deviceName,
706 const std::string& localAddress,
707 const std::string& remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700708 int32_t iKey, int32_t oKey,
709 int32_t interfaceId) {
manojboopathi8707f232018-01-02 14:45:47 -0800710 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900711 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700712 netdutils::Status result = gCtls->xfrmCtrl.ipSecAddTunnelInterface(
Benedict Wonga450e722018-05-07 10:29:02 -0700713 deviceName, localAddress, remoteAddress, iKey, oKey, interfaceId, true);
Benedict Wong319f17e2018-05-15 17:06:44 -0700714 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800715}
716
Benedict Wong319f17e2018-05-15 17:06:44 -0700717binder::Status NetdNativeService::ipSecRemoveTunnelInterface(const std::string& deviceName) {
manojboopathi8707f232018-01-02 14:45:47 -0800718 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900719 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700720 netdutils::Status result = gCtls->xfrmCtrl.ipSecRemoveTunnelInterface(deviceName);
Benedict Wong319f17e2018-05-15 17:06:44 -0700721 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800722}
723
Joel Scherpelzde937962017-06-01 13:20:21 +0900724binder::Status NetdNativeService::setIPv6AddrGenMode(const std::string& ifName,
725 int32_t mode) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900726 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700727 return asBinderStatus(InterfaceController::setIPv6AddrGenMode(ifName, mode));
Joel Scherpelzde937962017-06-01 13:20:21 +0900728}
729
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900730binder::Status NetdNativeService::wakeupAddInterface(const std::string& ifName,
731 const std::string& prefix, int32_t mark,
732 int32_t mask) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900733 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700734 return asBinderStatus(gCtls->wakeupCtrl.addInterface(ifName, prefix, mark, mask));
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900735}
736
737binder::Status NetdNativeService::wakeupDelInterface(const std::string& ifName,
738 const std::string& prefix, int32_t mark,
739 int32_t mask) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900740 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700741 return asBinderStatus(gCtls->wakeupCtrl.delInterface(ifName, prefix, mark, mask));
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900742}
743
Chenbo Feng873ae142019-04-10 12:26:06 -0700744binder::Status NetdNativeService::trafficSwapActiveStatsMap() {
745 ENFORCE_NETWORK_STACK_PERMISSIONS();
746 return asBinderStatus(gCtls->trafficCtrl.swapActiveStatsMap());
747}
748
Luke Huang0051a622018-07-23 20:30:16 +0800749binder::Status NetdNativeService::idletimerAddInterface(const std::string& ifName, int32_t timeout,
750 const std::string& classLabel) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900751 NETD_LOCKING_RPC(gCtls->idletimerCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang0051a622018-07-23 20:30:16 +0800752 int res =
753 gCtls->idletimerCtrl.addInterfaceIdletimer(ifName.c_str(), timeout, classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +0800754 return statusFromErrcode(res);
755}
756
757binder::Status NetdNativeService::idletimerRemoveInterface(const std::string& ifName,
758 int32_t timeout,
759 const std::string& classLabel) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900760 NETD_LOCKING_RPC(gCtls->idletimerCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang0051a622018-07-23 20:30:16 +0800761 int res = gCtls->idletimerCtrl.removeInterfaceIdletimer(ifName.c_str(), timeout,
762 classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +0800763 return statusFromErrcode(res);
764}
Luke Huanga67dd562018-07-17 19:58:25 +0800765
766binder::Status NetdNativeService::strictUidCleartextPenalty(int32_t uid, int32_t policyPenalty) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900767 NETD_LOCKING_RPC(gCtls->strictCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huanga67dd562018-07-17 19:58:25 +0800768 StrictPenalty penalty;
769 switch (policyPenalty) {
770 case INetd::PENALTY_POLICY_REJECT:
771 penalty = REJECT;
772 break;
773 case INetd::PENALTY_POLICY_LOG:
774 penalty = LOG;
775 break;
776 case INetd::PENALTY_POLICY_ACCEPT:
777 penalty = ACCEPT;
778 break;
779 default:
780 return statusFromErrcode(-EINVAL);
781 break;
782 }
783 int res = gCtls->strictCtrl.setUidCleartextPenalty((uid_t) uid, penalty);
Luke Huanga67dd562018-07-17 19:58:25 +0800784 return statusFromErrcode(res);
785}
Luke Huange64fa382018-07-24 16:38:22 +0800786
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +0900787binder::Status NetdNativeService::clatdStart(const std::string& ifName,
788 const std::string& nat64Prefix, std::string* v6Addr) {
Maciej Żenczykowski56280272019-03-30 03:32:51 -0700789 ENFORCE_ANY_PERMISSION(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +0900790 int res = gCtls->clatdCtrl.startClatd(ifName.c_str(), nat64Prefix, v6Addr);
Luke Huang6d301232018-08-01 14:05:18 +0800791 return statusFromErrcode(res);
792}
793
794binder::Status NetdNativeService::clatdStop(const std::string& ifName) {
Maciej Żenczykowski56280272019-03-30 03:32:51 -0700795 ENFORCE_ANY_PERMISSION(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang6d301232018-08-01 14:05:18 +0800796 int res = gCtls->clatdCtrl.stopClatd(ifName.c_str());
Luke Huang6d301232018-08-01 14:05:18 +0800797 return statusFromErrcode(res);
798}
Luke Huanga67dd562018-07-17 19:58:25 +0800799
Luke Huang457d4702018-08-16 15:39:15 +0800800binder::Status NetdNativeService::ipfwdEnabled(bool* status) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900801 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang728cf4c2019-03-14 19:43:02 +0800802 *status = (gCtls->tetherCtrl.getIpfwdRequesterList().size() > 0) ? true : false;
803 return binder::Status::ok();
804}
805
806binder::Status NetdNativeService::ipfwdGetRequesterList(std::vector<std::string>* requesterList) {
807 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
808 for (const auto& requester : gCtls->tetherCtrl.getIpfwdRequesterList()) {
809 requesterList->push_back(requester);
810 }
Luke Huang457d4702018-08-16 15:39:15 +0800811 return binder::Status::ok();
812}
813
814binder::Status NetdNativeService::ipfwdEnableForwarding(const std::string& requester) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900815 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang457d4702018-08-16 15:39:15 +0800816 int res = (gCtls->tetherCtrl.enableForwarding(requester.c_str())) ? 0 : -EREMOTEIO;
Luke Huang457d4702018-08-16 15:39:15 +0800817 return statusFromErrcode(res);
818}
819
820binder::Status NetdNativeService::ipfwdDisableForwarding(const std::string& requester) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900821 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang457d4702018-08-16 15:39:15 +0800822 int res = (gCtls->tetherCtrl.disableForwarding(requester.c_str())) ? 0 : -EREMOTEIO;
Luke Huang457d4702018-08-16 15:39:15 +0800823 return statusFromErrcode(res);
824}
825
826binder::Status NetdNativeService::ipfwdAddInterfaceForward(const std::string& fromIface,
827 const std::string& toIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900828 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang457d4702018-08-16 15:39:15 +0800829 int res = RouteController::enableTethering(fromIface.c_str(), toIface.c_str());
Luke Huang457d4702018-08-16 15:39:15 +0800830 return statusFromErrcode(res);
831}
832
833binder::Status NetdNativeService::ipfwdRemoveInterfaceForward(const std::string& fromIface,
834 const std::string& toIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900835 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang457d4702018-08-16 15:39:15 +0800836 int res = RouteController::disableTethering(fromIface.c_str(), toIface.c_str());
Luke Huang457d4702018-08-16 15:39:15 +0800837 return statusFromErrcode(res);
838}
839
Luke Huangf7782042018-08-08 13:13:04 +0800840namespace {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000841
Luke Huangf7782042018-08-08 13:13:04 +0800842std::string addCurlyBrackets(const std::string& s) {
843 return "{" + s + "}";
844}
845
846} // namespace
Xiao Ma33d562a2018-12-16 16:27:38 +0900847
Luke Huangf7782042018-08-08 13:13:04 +0800848binder::Status NetdNativeService::interfaceGetList(std::vector<std::string>* interfaceListResult) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900849 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800850 const auto& ifaceList = InterfaceController::getIfaceNames();
Luke Huangf7782042018-08-08 13:13:04 +0800851
852 interfaceListResult->clear();
853 interfaceListResult->reserve(ifaceList.value().size());
854 interfaceListResult->insert(end(*interfaceListResult), begin(ifaceList.value()),
855 end(ifaceList.value()));
856
Luke Huangf7782042018-08-08 13:13:04 +0800857 return binder::Status::ok();
858}
859
860std::string interfaceConfigurationParcelToString(const InterfaceConfigurationParcel& cfg) {
861 std::vector<std::string> result{cfg.ifName, cfg.hwAddr, cfg.ipv4Addr,
862 std::to_string(cfg.prefixLength)};
863 result.insert(end(result), begin(cfg.flags), end(cfg.flags));
864 return addCurlyBrackets(base::Join(result, ", "));
865}
866
867binder::Status NetdNativeService::interfaceGetCfg(
868 const std::string& ifName, InterfaceConfigurationParcel* interfaceGetCfgResult) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900869 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800870 auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__).arg(ifName);
871
872 const auto& cfgRes = InterfaceController::getCfg(ifName);
873 RETURN_BINDER_STATUS_IF_NOT_OK(entry, cfgRes);
874
875 *interfaceGetCfgResult = cfgRes.value();
876 gLog.log(entry.returns(interfaceConfigurationParcelToString(*interfaceGetCfgResult))
877 .withAutomaticDuration());
878 return binder::Status::ok();
879}
880
881binder::Status NetdNativeService::interfaceSetCfg(const InterfaceConfigurationParcel& cfg) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900882 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800883 auto entry = gLog.newEntry()
884 .prettyFunction(__PRETTY_FUNCTION__)
885 .arg(interfaceConfigurationParcelToString(cfg));
886
887 const auto& res = InterfaceController::setCfg(cfg);
888 RETURN_BINDER_STATUS_IF_NOT_OK(entry, res);
889
890 gLog.log(entry.withAutomaticDuration());
891 return binder::Status::ok();
892}
893
894binder::Status NetdNativeService::interfaceSetIPv6PrivacyExtensions(const std::string& ifName,
895 bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900896 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800897 int res = InterfaceController::setIPv6PrivacyExtensions(ifName.c_str(), enable);
Luke Huangf7782042018-08-08 13:13:04 +0800898 return statusFromErrcode(res);
899}
900
901binder::Status NetdNativeService::interfaceClearAddrs(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900902 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800903 int res = InterfaceController::clearAddrs(ifName.c_str());
Luke Huangf7782042018-08-08 13:13:04 +0800904 return statusFromErrcode(res);
905}
906
907binder::Status NetdNativeService::interfaceSetEnableIPv6(const std::string& ifName, bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900908 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800909 int res = InterfaceController::setEnableIPv6(ifName.c_str(), enable);
Luke Huangf7782042018-08-08 13:13:04 +0800910 return statusFromErrcode(res);
911}
912
913binder::Status NetdNativeService::interfaceSetMtu(const std::string& ifName, int32_t mtuValue) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900914 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800915 std::string mtu = std::to_string(mtuValue);
916 int res = InterfaceController::setMtu(ifName.c_str(), mtu.c_str());
Luke Huangf7782042018-08-08 13:13:04 +0800917 return statusFromErrcode(res);
918}
919
Luke Huangb5733d72018-08-21 17:17:19 +0800920binder::Status NetdNativeService::tetherStart(const std::vector<std::string>& dhcpRanges) {
Chiachang Wang08cb2112019-12-10 09:53:24 +0800921 TetherConfigParcel config;
922 config.usingLegacyDnsProxy = true;
923 config.dhcpRanges = dhcpRanges;
924 return tetherStartWithConfiguration(config);
Luke Huang91bd3e12019-08-20 11:33:52 +0800925}
926
Chiachang Wang08cb2112019-12-10 09:53:24 +0800927binder::Status NetdNativeService::tetherStartWithConfiguration(const TetherConfigParcel& config) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900928 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Chiachang Wang08cb2112019-12-10 09:53:24 +0800929 if (config.dhcpRanges.size() % 2 == 1) {
Luke Huangb5733d72018-08-21 17:17:19 +0800930 return statusFromErrcode(-EINVAL);
931 }
Chiachang Wang08cb2112019-12-10 09:53:24 +0800932 // TODO: Pass TetherConfigParcel directly.
933 int res = gCtls->tetherCtrl.startTethering(config.usingLegacyDnsProxy, config.dhcpRanges);
Luke Huangb5733d72018-08-21 17:17:19 +0800934 return statusFromErrcode(res);
935}
936
937binder::Status NetdNativeService::tetherStop() {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900938 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800939 int res = gCtls->tetherCtrl.stopTethering();
Luke Huangb5733d72018-08-21 17:17:19 +0800940 return statusFromErrcode(res);
941}
942
943binder::Status NetdNativeService::tetherIsEnabled(bool* enabled) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900944 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800945 *enabled = gCtls->tetherCtrl.isTetheringStarted();
Luke Huangb5733d72018-08-21 17:17:19 +0800946 return binder::Status::ok();
947}
948
949binder::Status NetdNativeService::tetherInterfaceAdd(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900950 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800951 int res = gCtls->tetherCtrl.tetherInterface(ifName.c_str());
Luke Huangb5733d72018-08-21 17:17:19 +0800952 return statusFromErrcode(res);
953}
954
955binder::Status NetdNativeService::tetherInterfaceRemove(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900956 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800957 int res = gCtls->tetherCtrl.untetherInterface(ifName.c_str());
Luke Huangb5733d72018-08-21 17:17:19 +0800958 return statusFromErrcode(res);
959}
960
961binder::Status NetdNativeService::tetherInterfaceList(std::vector<std::string>* ifList) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900962 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800963 for (const auto& ifname : gCtls->tetherCtrl.getTetheredInterfaceList()) {
964 ifList->push_back(ifname);
965 }
Luke Huangb5733d72018-08-21 17:17:19 +0800966 return binder::Status::ok();
967}
968
969binder::Status NetdNativeService::tetherDnsSet(int32_t netId,
970 const std::vector<std::string>& dnsAddrs) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900971 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800972 int res = gCtls->tetherCtrl.setDnsForwarders(netId, dnsAddrs);
Luke Huangb5733d72018-08-21 17:17:19 +0800973 return statusFromErrcode(res);
974}
975
976binder::Status NetdNativeService::tetherDnsList(std::vector<std::string>* dnsList) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900977 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800978 for (const auto& fwdr : gCtls->tetherCtrl.getDnsForwarders()) {
979 dnsList->push_back(fwdr);
980 }
Luke Huangb5733d72018-08-21 17:17:19 +0800981 return binder::Status::ok();
982}
983
Tyler Wearfa94a272019-12-05 15:01:48 -0800984binder::Status NetdNativeService::networkAddRouteParcel(int32_t netId,
985 const RouteInfoParcel& route) {
986 // Public methods of NetworkController are thread-safe.
987 ENFORCE_NETWORK_STACK_PERMISSIONS();
988 bool legacy = false;
989 uid_t uid = 0; // UID is only meaningful for legacy routes.
990
991 // convert Parcel to parameters
992 int res = gCtls->netCtrl.addRoute(netId, route.ifName.c_str(), route.destination.c_str(),
993 route.nextHop.empty() ? nullptr : route.nextHop.c_str(),
994 legacy, uid, route.mtu);
995 return statusFromErrcode(res);
996}
997
998binder::Status NetdNativeService::networkUpdateRouteParcel(int32_t netId,
999 const RouteInfoParcel& route) {
1000 // Public methods of NetworkController are thread-safe.
1001 ENFORCE_NETWORK_STACK_PERMISSIONS();
1002 bool legacy = false;
1003 uid_t uid = 0; // UID is only meaningful for legacy routes.
1004
1005 // convert Parcel to parameters
1006 int res = gCtls->netCtrl.updateRoute(netId, route.ifName.c_str(), route.destination.c_str(),
1007 route.nextHop.empty() ? nullptr : route.nextHop.c_str(),
1008 legacy, uid, route.mtu);
1009 return statusFromErrcode(res);
1010}
1011
1012binder::Status NetdNativeService::networkRemoveRouteParcel(int32_t netId,
1013 const RouteInfoParcel& route) {
1014 return networkRemoveRoute(netId, route.ifName, route.destination, route.nextHop);
1015}
1016
Luke Huangb670d162018-08-23 20:01:13 +08001017binder::Status NetdNativeService::networkAddRoute(int32_t netId, const std::string& ifName,
1018 const std::string& destination,
1019 const std::string& nextHop) {
1020 // Public methods of NetworkController are thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001021 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001022 bool legacy = false;
1023 uid_t uid = 0; // UID is only meaningful for legacy routes.
1024 int res = gCtls->netCtrl.addRoute(netId, ifName.c_str(), destination.c_str(),
Tyler Wearfa94a272019-12-05 15:01:48 -08001025 nextHop.empty() ? nullptr : nextHop.c_str(), legacy, uid, 0);
Luke Huangb670d162018-08-23 20:01:13 +08001026 return statusFromErrcode(res);
1027}
1028
1029binder::Status NetdNativeService::networkRemoveRoute(int32_t netId, const std::string& ifName,
1030 const std::string& destination,
1031 const std::string& nextHop) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001032 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001033 bool legacy = false;
1034 uid_t uid = 0; // UID is only meaningful for legacy routes.
1035 int res = gCtls->netCtrl.removeRoute(netId, ifName.c_str(), destination.c_str(),
1036 nextHop.empty() ? nullptr : nextHop.c_str(), legacy, uid);
Luke Huangb670d162018-08-23 20:01:13 +08001037 return statusFromErrcode(res);
1038}
1039
1040binder::Status NetdNativeService::networkAddLegacyRoute(int32_t netId, const std::string& ifName,
1041 const std::string& destination,
1042 const std::string& nextHop, int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001043 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001044 bool legacy = true;
1045 int res = gCtls->netCtrl.addRoute(netId, ifName.c_str(), destination.c_str(),
1046 nextHop.empty() ? nullptr : nextHop.c_str(), legacy,
Tyler Wearfa94a272019-12-05 15:01:48 -08001047 (uid_t)uid, 0);
Luke Huangb670d162018-08-23 20:01:13 +08001048 return statusFromErrcode(res);
1049}
1050
1051binder::Status NetdNativeService::networkRemoveLegacyRoute(int32_t netId, const std::string& ifName,
1052 const std::string& destination,
1053 const std::string& nextHop,
1054 int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001055 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001056 bool legacy = true;
1057 int res = gCtls->netCtrl.removeRoute(netId, ifName.c_str(), destination.c_str(),
1058 nextHop.empty() ? nullptr : nextHop.c_str(), legacy,
1059 (uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001060 return statusFromErrcode(res);
1061}
1062
1063binder::Status NetdNativeService::networkGetDefault(int32_t* netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001064 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001065 *netId = gCtls->netCtrl.getDefaultNetwork();
Luke Huangb670d162018-08-23 20:01:13 +08001066 return binder::Status::ok();
1067}
1068
1069binder::Status NetdNativeService::networkSetDefault(int32_t netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001070 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001071 int res = gCtls->netCtrl.setDefaultNetwork(netId);
Luke Huangb670d162018-08-23 20:01:13 +08001072 return statusFromErrcode(res);
1073}
1074
1075binder::Status NetdNativeService::networkClearDefault() {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001076 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001077 unsigned netId = NETID_UNSET;
1078 int res = gCtls->netCtrl.setDefaultNetwork(netId);
Luke Huangb670d162018-08-23 20:01:13 +08001079 return statusFromErrcode(res);
1080}
1081
1082std::vector<uid_t> NetdNativeService::intsToUids(const std::vector<int32_t>& intUids) {
1083 return {begin(intUids), end(intUids)};
1084}
1085
1086Permission NetdNativeService::convertPermission(int32_t permission) {
1087 switch (permission) {
1088 case INetd::PERMISSION_NETWORK:
1089 return Permission::PERMISSION_NETWORK;
1090 case INetd::PERMISSION_SYSTEM:
1091 return Permission::PERMISSION_SYSTEM;
1092 default:
1093 return Permission::PERMISSION_NONE;
1094 }
1095}
1096
1097binder::Status NetdNativeService::networkSetPermissionForNetwork(int32_t netId,
1098 int32_t permission) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001099 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001100 std::vector<unsigned> netIds = {(unsigned) netId};
1101 int res = gCtls->netCtrl.setPermissionForNetworks(convertPermission(permission), netIds);
Luke Huangb670d162018-08-23 20:01:13 +08001102 return statusFromErrcode(res);
1103}
1104
1105binder::Status NetdNativeService::networkSetPermissionForUser(int32_t permission,
1106 const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001107 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001108 gCtls->netCtrl.setPermissionForUsers(convertPermission(permission), intsToUids(uids));
Luke Huangb670d162018-08-23 20:01:13 +08001109 return binder::Status::ok();
1110}
1111
1112binder::Status NetdNativeService::networkClearPermissionForUser(const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001113 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001114 Permission permission = Permission::PERMISSION_NONE;
1115 gCtls->netCtrl.setPermissionForUsers(permission, intsToUids(uids));
Luke Huangb670d162018-08-23 20:01:13 +08001116 return binder::Status::ok();
1117}
1118
1119binder::Status NetdNativeService::NetdNativeService::networkSetProtectAllow(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001120 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001121 std::vector<uid_t> uids = {(uid_t) uid};
1122 gCtls->netCtrl.allowProtect(uids);
Luke Huangb670d162018-08-23 20:01:13 +08001123 return binder::Status::ok();
1124}
1125
1126binder::Status NetdNativeService::networkSetProtectDeny(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001127 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001128 std::vector<uid_t> uids = {(uid_t) uid};
1129 gCtls->netCtrl.denyProtect(uids);
Luke Huangb670d162018-08-23 20:01:13 +08001130 return binder::Status::ok();
1131}
1132
1133binder::Status NetdNativeService::networkCanProtect(int32_t uid, bool* ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001134 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001135 *ret = gCtls->netCtrl.canProtect((uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001136 return binder::Status::ok();
1137}
1138
Chenbo Feng48eaed32018-12-26 17:40:21 -08001139binder::Status NetdNativeService::trafficSetNetPermForUids(int32_t permission,
1140 const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001141 ENFORCE_NETWORK_STACK_PERMISSIONS();
Chenbo Feng48eaed32018-12-26 17:40:21 -08001142 gCtls->trafficCtrl.setPermissionForUids(permission, intsToUids(uids));
Chenbo Feng48eaed32018-12-26 17:40:21 -08001143 return binder::Status::ok();
1144}
1145
Luke Huange64fa382018-07-24 16:38:22 +08001146binder::Status NetdNativeService::firewallSetFirewallType(int32_t firewallType) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001147 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001148 auto type = static_cast<FirewallType>(firewallType);
1149
1150 int res = gCtls->firewallCtrl.setFirewallType(type);
Luke Huange64fa382018-07-24 16:38:22 +08001151 return statusFromErrcode(res);
1152}
1153
1154binder::Status NetdNativeService::firewallSetInterfaceRule(const std::string& ifName,
1155 int32_t firewallRule) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001156 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001157 auto rule = static_cast<FirewallRule>(firewallRule);
1158
1159 int res = gCtls->firewallCtrl.setInterfaceRule(ifName.c_str(), rule);
Luke Huange64fa382018-07-24 16:38:22 +08001160 return statusFromErrcode(res);
1161}
1162
1163binder::Status NetdNativeService::firewallSetUidRule(int32_t childChain, int32_t uid,
1164 int32_t firewallRule) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001165 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001166 auto chain = static_cast<ChildChain>(childChain);
1167 auto rule = static_cast<FirewallRule>(firewallRule);
1168
1169 int res = gCtls->firewallCtrl.setUidRule(chain, uid, rule);
Luke Huange64fa382018-07-24 16:38:22 +08001170 return statusFromErrcode(res);
1171}
1172
1173binder::Status NetdNativeService::firewallEnableChildChain(int32_t childChain, bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001174 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001175 auto chain = static_cast<ChildChain>(childChain);
1176
1177 int res = gCtls->firewallCtrl.enableChildChains(chain, enable);
Luke Huange64fa382018-07-24 16:38:22 +08001178 return statusFromErrcode(res);
1179}
1180
Rubin Xuec27ff22019-01-08 21:33:03 +00001181binder::Status NetdNativeService::firewallAddUidInterfaceRules(const std::string& ifName,
1182 const std::vector<int32_t>& uids) {
1183 ENFORCE_NETWORK_STACK_PERMISSIONS();
1184
1185 return asBinderStatus(gCtls->trafficCtrl.addUidInterfaceRules(
1186 RouteController::getIfIndex(ifName.c_str()), uids));
1187}
1188
1189binder::Status NetdNativeService::firewallRemoveUidInterfaceRules(
1190 const std::vector<int32_t>& uids) {
1191 ENFORCE_NETWORK_STACK_PERMISSIONS();
1192
1193 return asBinderStatus(gCtls->trafficCtrl.removeUidInterfaceRules(uids));
1194}
1195
Luke Huang19b49c52018-10-22 12:12:05 +09001196binder::Status NetdNativeService::tetherAddForward(const std::string& intIface,
1197 const std::string& extIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001198 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang19b49c52018-10-22 12:12:05 +09001199
1200 int res = gCtls->tetherCtrl.enableNat(intIface.c_str(), extIface.c_str());
Luke Huang19b49c52018-10-22 12:12:05 +09001201 return statusFromErrcode(res);
1202}
1203
1204binder::Status NetdNativeService::tetherRemoveForward(const std::string& intIface,
1205 const std::string& extIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001206 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangae038f82018-11-05 11:17:31 +09001207 int res = gCtls->tetherCtrl.disableNat(intIface.c_str(), extIface.c_str());
Luke Huang19b49c52018-10-22 12:12:05 +09001208 return statusFromErrcode(res);
1209}
1210
Chenbo Fengf5663d82018-11-08 16:10:48 -08001211binder::Status NetdNativeService::setTcpRWmemorySize(const std::string& rmemValues,
1212 const std::string& wmemValues) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001213 ENFORCE_NETWORK_STACK_PERMISSIONS();
Chenbo Fengf5663d82018-11-08 16:10:48 -08001214 if (!WriteStringToFile(rmemValues, TCP_RMEM_PROC_FILE)) {
1215 int ret = -errno;
Chenbo Fengf5663d82018-11-08 16:10:48 -08001216 return statusFromErrcode(ret);
1217 }
1218
1219 if (!WriteStringToFile(wmemValues, TCP_WMEM_PROC_FILE)) {
1220 int ret = -errno;
Chenbo Fengf5663d82018-11-08 16:10:48 -08001221 return statusFromErrcode(ret);
1222 }
Chenbo Fengf5663d82018-11-08 16:10:48 -08001223 return binder::Status::ok();
1224}
1225
Luke Huang528af602018-08-29 19:06:05 +08001226binder::Status NetdNativeService::registerUnsolicitedEventListener(
1227 const android::sp<android::net::INetdUnsolicitedEventListener>& listener) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001228 ENFORCE_NETWORK_STACK_PERMISSIONS();
Bernie Innocenti9ee088d2019-02-01 17:14:32 +09001229 gCtls->eventReporter.registerUnsolEventListener(listener);
Luke Huang528af602018-08-29 19:06:05 +08001230 return binder::Status::ok();
1231}
1232
Luke Huange60bfd82019-04-26 11:39:31 +08001233binder::Status NetdNativeService::getOemNetd(android::sp<android::IBinder>* listener) {
1234 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang0e5e69d2019-03-06 15:42:38 +08001235 *listener = com::android::internal::net::OemNetdListener::getListener();
1236
Luke Huange60bfd82019-04-26 11:39:31 +08001237 return binder::Status::ok();
1238}
1239
Chiachang Wang00fc62f2019-12-04 20:38:26 +08001240binder::Status NetdNativeService::getFwmarkForNetwork(int32_t netId, MarkMaskParcel* markMask) {
1241 ENFORCE_NETWORK_STACK_PERMISSIONS();
1242
1243 Fwmark fwmark;
1244 fwmark.netId = netId;
1245 markMask->mask = FWMARK_NET_ID_MASK;
1246 markMask->mark = fwmark.intValue;
1247 return binder::Status::ok();
1248}
1249
Lorenzo Colittie801d3c2020-02-18 00:00:35 +09001250binder::Status NetdNativeService::tetherRuleAddDownstreamIpv6(
1251 int intIfaceIndex, int extIfaceIndex, const std::vector<uint8_t>& ipAddress,
1252 const std::vector<uint8_t>& srcL2Address, const std::vector<uint8_t>& dstL2Address) {
1253 ENFORCE_NETWORK_STACK_PERMISSIONS();
1254
1255 return asBinderStatus(gCtls->tetherCtrl.addDownstreamIpv6Rule(
1256 intIfaceIndex, extIfaceIndex, ipAddress, srcL2Address, dstL2Address));
1257}
1258
1259binder::Status NetdNativeService::tetherRuleRemoveDownstreamIpv6(
1260 int extIfaceIndex, const std::vector<uint8_t>& ipAddress) {
1261 ENFORCE_NETWORK_STACK_PERMISSIONS();
1262
1263 return asBinderStatus(gCtls->tetherCtrl.removeDownstreamIpv6Rule(extIfaceIndex, ipAddress));
1264}
1265
Lorenzo Colittie4d626e2016-02-02 17:19:04 +09001266} // namespace net
1267} // namespace android