blob: 59e8b273c0dee0ea3f4a482e82e58d12ee67347c [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
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090067binder::Status checkAnyPermission(const std::vector<const char*>& permissions) {
Luke Huanga38b65c2018-09-26 16:31:03 +080068 pid_t pid = IPCThreadState::self()->getCallingPid();
69 uid_t uid = IPCThreadState::self()->getCallingUid();
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090070
Luke Huanga38b65c2018-09-26 16:31:03 +080071 // If the caller is the system UID, don't check permissions.
72 // Otherwise, if the system server's binder thread pool is full, and all the threads are
73 // blocked on a thread that's waiting for us to complete, we deadlock. http://b/69389492
74 //
75 // From a security perspective, there is currently no difference, because:
Automerger Merge Workeraa65d712020-03-05 10:29:36 +000076 // 1. The system server has the NETWORK_STACK permission, which grants access to all the
77 // IPCs in this file.
Luke Huanga38b65c2018-09-26 16:31:03 +080078 // 2. AID_SYSTEM always has all permissions. See ActivityManager#checkComponentPermission.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090079 if (uid == AID_SYSTEM) {
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090080 return binder::Status::ok();
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090081 }
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090082
83 for (const char* permission : permissions) {
84 if (checkPermission(String16(permission), pid, uid)) {
85 return binder::Status::ok();
86 }
87 }
88
89 auto err = StringPrintf("UID %d / PID %d does not have any of the following permissions: %s",
90 uid, pid, android::base::Join(permissions, ',').c_str());
91 return binder::Status::fromExceptionCode(binder::Status::EX_SECURITY, err.c_str());
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090092}
93
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090094#define ENFORCE_ANY_PERMISSION(...) \
95 do { \
96 binder::Status status = checkAnyPermission({__VA_ARGS__}); \
97 if (!status.isOk()) { \
98 return status; \
99 } \
100 } while (0)
Robin Lee2cf56172016-09-13 18:55:42 +0900101
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900102#define NETD_LOCKING_RPC(lock, ... /* permissions */) \
103 ENFORCE_ANY_PERMISSION(__VA_ARGS__); \
Bernie Innocentiabf8a342018-08-10 15:17:16 +0900104 std::lock_guard _lock(lock);
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900105
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900106#define NETD_BIG_LOCK_RPC(... /* permissions */) NETD_LOCKING_RPC(gBigNetdLock, __VA_ARGS__)
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900107
Luke Huangf7782042018-08-08 13:13:04 +0800108#define RETURN_BINDER_STATUS_IF_NOT_OK(logEntry, res) \
109 do { \
110 if (!isOk((res))) { \
111 logErrorStatus((logEntry), (res)); \
112 return asBinderStatus((res)); \
113 } \
114 } while (0)
115
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900116#define ENFORCE_NETWORK_STACK_PERMISSIONS() \
117 ENFORCE_ANY_PERMISSION(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK)
118
Luke Huangf7782042018-08-08 13:13:04 +0800119void logErrorStatus(netdutils::LogEntry& logEntry, const netdutils::Status& status) {
120 gLog.log(logEntry.returns(status.code()).withAutomaticDuration());
121}
122
Bernie Innocenti97f388f2018-10-16 19:17:08 +0900123binder::Status asBinderStatus(const netdutils::Status& status) {
124 if (isOk(status)) {
125 return binder::Status::ok();
126 }
127 return binder::Status::fromServiceSpecificError(status.code(), status.msg().c_str());
128}
129
Lorenzo Colittie801d3c2020-02-18 00:00:35 +0900130template <typename T>
131binder::Status asBinderStatus(const base::Result<T> result) {
132 if (result.ok()) return binder::Status::ok();
133
134 return binder::Status::fromServiceSpecificError(result.error().code(),
135 result.error().message().c_str());
136}
137
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900138inline binder::Status statusFromErrcode(int ret) {
139 if (ret) {
140 return binder::Status::fromServiceSpecificError(-ret, strerror(-ret));
141 }
142 return binder::Status::ok();
143}
144
Erik Klineb31fd692018-06-06 20:50:11 +0900145bool contains(const Vector<String16>& words, const String16& word) {
146 for (const auto& w : words) {
147 if (w == word) return true;
148 }
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900149
Erik Klineb31fd692018-06-06 20:50:11 +0900150 return false;
151}
152
153} // namespace
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900154
Luke Huange3f11812019-05-02 18:10:15 +0800155NetdNativeService::NetdNativeService() {
156 // register log callback to BnNetd::logFunc
157 BnNetd::logFunc = std::bind(binderCallLogFn, std::placeholders::_1,
158 [](const std::string& msg) { gLog.info("%s", msg.c_str()); });
159}
160
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900161status_t NetdNativeService::start() {
162 IPCThreadState::self()->disableBackgroundScheduling(true);
Erik Klineb31fd692018-06-06 20:50:11 +0900163 const status_t ret = BinderService<NetdNativeService>::publish();
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900164 if (ret != android::OK) {
165 return ret;
166 }
167 sp<ProcessState> ps(ProcessState::self());
168 ps->startThreadPool();
169 ps->giveThreadPoolName();
Xiao Ma33d562a2018-12-16 16:27:38 +0900170
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900171 return android::OK;
172}
173
Hugo Benichi7b314e12018-01-15 21:54:00 +0900174status_t NetdNativeService::dump(int fd, const Vector<String16> &args) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900175 const binder::Status dump_permission = checkAnyPermission({PERM_DUMP});
Erik Kline2d3a1632016-03-15 16:33:48 +0900176 if (!dump_permission.isOk()) {
177 const String8 msg(dump_permission.toString8());
178 write(fd, msg.string(), msg.size());
179 return PERMISSION_DENIED;
180 }
181
182 // This method does not grab any locks. If individual classes need locking
183 // their dump() methods MUST handle locking appropriately.
Hugo Benichi7b314e12018-01-15 21:54:00 +0900184
Erik Kline2d3a1632016-03-15 16:33:48 +0900185 DumpWriter dw(fd);
Hugo Benichi7b314e12018-01-15 21:54:00 +0900186
187 if (!args.isEmpty() && args[0] == TcpSocketMonitor::DUMP_KEYWORD) {
188 dw.blankline();
189 gCtls->tcpSocketMonitor.dump(dw);
190 dw.blankline();
191 return NO_ERROR;
192 }
193
Chenbo Fengef297172018-03-26 10:53:33 -0700194 if (!args.isEmpty() && args[0] == TrafficController::DUMP_KEYWORD) {
195 dw.blankline();
196 gCtls->trafficCtrl.dump(dw, true);
197 dw.blankline();
198 return NO_ERROR;
199 }
200
Erik Kline85890042018-05-25 19:19:11 +0900201 process::dump(dw);
Erik Kline2d3a1632016-03-15 16:33:48 +0900202 dw.blankline();
203 gCtls->netCtrl.dump(dw);
204 dw.blankline();
205
Chenbo Fengef297172018-03-26 10:53:33 -0700206 gCtls->trafficCtrl.dump(dw, false);
207 dw.blankline();
208
Benedict Wongaf855432018-05-10 17:07:37 -0700209 gCtls->xfrmCtrl.dump(dw);
210 dw.blankline();
211
Maciej Żenczykowski55262712019-03-29 23:44:56 -0700212 gCtls->clatdCtrl.dump(dw);
213 dw.blankline();
214
Lorenzo Colitti52db3912020-02-17 23:59:45 +0900215 gCtls->tetherCtrl.dump(dw);
216 dw.blankline();
217
Erik Klineb31fd692018-06-06 20:50:11 +0900218 {
219 ScopedIndent indentLog(dw);
220 if (contains(args, String16(OPT_SHORT))) {
221 dw.println("Log: <omitted>");
222 } else {
223 dw.println("Log:");
224 ScopedIndent indentLogEntries(dw);
225 gLog.forEachEntry([&dw](const std::string& entry) mutable { dw.println(entry); });
226 }
227 dw.blankline();
228 }
229
Luke Huang528af602018-08-29 19:06:05 +0800230 {
231 ScopedIndent indentLog(dw);
232 if (contains(args, String16(OPT_SHORT))) {
233 dw.println("UnsolicitedLog: <omitted>");
234 } else {
235 dw.println("UnsolicitedLog:");
236 ScopedIndent indentLogEntries(dw);
237 gUnsolicitedLog.forEachEntry(
238 [&dw](const std::string& entry) mutable { dw.println(entry); });
239 }
240 dw.blankline();
241 }
242
Erik Kline2d3a1632016-03-15 16:33:48 +0900243 return NO_ERROR;
244}
245
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900246binder::Status NetdNativeService::isAlive(bool *alive) {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000247 NETD_BIG_LOCK_RPC(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900248
249 *alive = true;
Erik Klineb31fd692018-06-06 20:50:11 +0900250
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900251 return binder::Status::ok();
252}
253
Erik Klinef52d4522018-03-14 15:01:46 +0900254binder::Status NetdNativeService::firewallReplaceUidChain(const std::string& chainName,
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900255 bool isWhitelist, const std::vector<int32_t>& uids, bool *ret) {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000256 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Erik Klinef52d4522018-03-14 15:01:46 +0900257 int err = gCtls->firewallCtrl.replaceUidChain(chainName, isWhitelist, uids);
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900258 *ret = (err == 0);
259 return binder::Status::ok();
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900260}
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900261
262binder::Status NetdNativeService::bandwidthEnableDataSaver(bool enable, bool *ret) {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000263 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900264 int err = gCtls->bandwidthCtrl.enableDataSaver(enable);
265 *ret = (err == 0);
266 return binder::Status::ok();
267}
268
Luke Huang531f5d32018-08-03 15:19:05 +0800269binder::Status NetdNativeService::bandwidthSetInterfaceQuota(const std::string& ifName,
270 int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900271 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800272 int res = gCtls->bandwidthCtrl.setInterfaceQuota(ifName, bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800273 return statusFromErrcode(res);
274}
275
276binder::Status NetdNativeService::bandwidthRemoveInterfaceQuota(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900277 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800278 int res = gCtls->bandwidthCtrl.removeInterfaceQuota(ifName);
Luke Huang531f5d32018-08-03 15:19:05 +0800279 return statusFromErrcode(res);
280}
281
282binder::Status NetdNativeService::bandwidthSetInterfaceAlert(const std::string& ifName,
283 int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900284 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800285 int res = gCtls->bandwidthCtrl.setInterfaceAlert(ifName, bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800286 return statusFromErrcode(res);
287}
288
289binder::Status NetdNativeService::bandwidthRemoveInterfaceAlert(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900290 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800291 int res = gCtls->bandwidthCtrl.removeInterfaceAlert(ifName);
Luke Huang531f5d32018-08-03 15:19:05 +0800292 return statusFromErrcode(res);
293}
294
295binder::Status NetdNativeService::bandwidthSetGlobalAlert(int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900296 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800297 int res = gCtls->bandwidthCtrl.setGlobalAlert(bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800298 return statusFromErrcode(res);
299}
300
301binder::Status NetdNativeService::bandwidthAddNaughtyApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900302 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800303 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
304 int res = gCtls->bandwidthCtrl.addNaughtyApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800305 return statusFromErrcode(res);
306}
307
308binder::Status NetdNativeService::bandwidthRemoveNaughtyApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900309 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800310 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
311 int res = gCtls->bandwidthCtrl.removeNaughtyApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800312 return statusFromErrcode(res);
313}
314
315binder::Status NetdNativeService::bandwidthAddNiceApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900316 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800317 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
318 int res = gCtls->bandwidthCtrl.addNiceApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800319 return statusFromErrcode(res);
320}
321
322binder::Status NetdNativeService::bandwidthRemoveNiceApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900323 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800324 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
325 int res = gCtls->bandwidthCtrl.removeNiceApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800326 return statusFromErrcode(res);
327}
328
Luke Huangb670d162018-08-23 20:01:13 +0800329binder::Status NetdNativeService::networkCreatePhysical(int32_t netId, int32_t permission) {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000330 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +0800331 int ret = gCtls->netCtrl.createPhysicalNetwork(netId, convertPermission(permission));
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900332 return statusFromErrcode(ret);
333}
334
cken67cd14c2018-12-05 17:26:59 +0900335binder::Status NetdNativeService::networkCreateVpn(int32_t netId, bool secure) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900336 ENFORCE_NETWORK_STACK_PERMISSIONS();
cken67cd14c2018-12-05 17:26:59 +0900337 int ret = gCtls->netCtrl.createVirtualNetwork(netId, secure);
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900338 return statusFromErrcode(ret);
339}
340
341binder::Status NetdNativeService::networkDestroy(int32_t netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900342 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangd33a8f42019-03-14 16:10:04 +0800343 // NetworkController::destroyNetwork is thread-safe.
Mike Yu4fe1b9c2019-01-29 17:50:19 +0800344 const int ret = gCtls->netCtrl.destroyNetwork(netId);
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900345 return statusFromErrcode(ret);
346}
347
348binder::Status NetdNativeService::networkAddInterface(int32_t netId, const std::string& iface) {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000349 ENFORCE_NETWORK_STACK_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900350 int ret = gCtls->netCtrl.addInterfaceToNetwork(netId, iface.c_str());
351 return statusFromErrcode(ret);
352}
353
354binder::Status NetdNativeService::networkRemoveInterface(int32_t netId, const std::string& iface) {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000355 ENFORCE_NETWORK_STACK_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900356 int ret = gCtls->netCtrl.removeInterfaceFromNetwork(netId, iface.c_str());
357 return statusFromErrcode(ret);
358}
359
Luke Huang94658ac2018-10-18 19:35:12 +0900360binder::Status NetdNativeService::networkAddUidRanges(
361 int32_t netId, const std::vector<UidRangeParcel>& uidRangeArray) {
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900362 // NetworkController::addUsersToNetwork is thread-safe.
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000363 ENFORCE_NETWORK_STACK_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900364 int ret = gCtls->netCtrl.addUsersToNetwork(netId, UidRanges(uidRangeArray));
365 return statusFromErrcode(ret);
366}
367
Luke Huang94658ac2018-10-18 19:35:12 +0900368binder::Status NetdNativeService::networkRemoveUidRanges(
369 int32_t netId, const std::vector<UidRangeParcel>& uidRangeArray) {
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900370 // NetworkController::removeUsersFromNetwork is thread-safe.
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000371 ENFORCE_NETWORK_STACK_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900372 int ret = gCtls->netCtrl.removeUsersFromNetwork(netId, UidRanges(uidRangeArray));
373 return statusFromErrcode(ret);
374}
375
Luke Huang94658ac2018-10-18 19:35:12 +0900376binder::Status NetdNativeService::networkRejectNonSecureVpn(
377 bool add, const std::vector<UidRangeParcel>& uidRangeArray) {
Robin Leeb8087362016-03-30 18:43:08 +0100378 // TODO: elsewhere RouteController is only used from the tethering and network controllers, so
379 // it should be possible to use the same lock as NetworkController. However, every call through
380 // the CommandListener "network" command will need to hold this lock too, not just the ones that
381 // read/modify network internal state (that is sufficient for ::dump() because it doesn't
382 // look at routes, but it's not enough here).
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000383 NETD_BIG_LOCK_RPC(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900384 UidRanges uidRanges(uidRangeArray);
Robin Leeb8087362016-03-30 18:43:08 +0100385
386 int err;
387 if (add) {
388 err = RouteController::addUsersToRejectNonSecureNetworkRule(uidRanges);
389 } else {
390 err = RouteController::removeUsersFromRejectNonSecureNetworkRule(uidRanges);
391 }
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900392 return statusFromErrcode(err);
Robin Leeb8087362016-03-30 18:43:08 +0100393}
394
Luke Huang94658ac2018-10-18 19:35:12 +0900395binder::Status NetdNativeService::socketDestroy(const std::vector<UidRangeParcel>& uids,
396 const std::vector<int32_t>& skipUids) {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000397 ENFORCE_NETWORK_STACK_PERMISSIONS();
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900398
399 SockDiag sd;
400 if (!sd.open()) {
401 return binder::Status::fromServiceSpecificError(EIO,
402 String8("Could not open SOCK_DIAG socket"));
403 }
404
405 UidRanges uidRanges(uids);
Lorenzo Colittie5c3c992016-07-26 17:53:50 +0900406 int err = sd.destroySockets(uidRanges, std::set<uid_t>(skipUids.begin(), skipUids.end()),
407 true /* excludeLoopback */);
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900408 if (err) {
409 return binder::Status::fromServiceSpecificError(-err,
410 String8::format("destroySockets: %s", strerror(-err)));
411 }
Pierre Imaibeedec32016-04-13 06:44:51 +0900412 return binder::Status::ok();
413}
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900414
Erik Klinef48e4dd2016-07-18 04:02:07 +0900415binder::Status NetdNativeService::tetherApplyDnsInterfaces(bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900416 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Erik Klinef48e4dd2016-07-18 04:02:07 +0900417 *ret = gCtls->tetherCtrl.applyDnsInterfaces();
418 return binder::Status::ok();
419}
420
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900421namespace {
422
Luke Huangcaebcbb2018-09-27 20:37:14 +0800423void tetherAddStatsByInterface(TetherController::TetherStats* tetherStatsParcel,
424 const TetherController::TetherStats& tetherStats) {
425 if (tetherStatsParcel->extIface == tetherStats.extIface) {
426 tetherStatsParcel->rxBytes += tetherStats.rxBytes;
427 tetherStatsParcel->rxPackets += tetherStats.rxPackets;
428 tetherStatsParcel->txBytes += tetherStats.txBytes;
429 tetherStatsParcel->txPackets += tetherStats.txPackets;
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900430 }
Luke Huangcaebcbb2018-09-27 20:37:14 +0800431}
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900432
Luke Huangcaebcbb2018-09-27 20:37:14 +0800433TetherStatsParcel toTetherStatsParcel(const TetherController::TetherStats& stats) {
434 TetherStatsParcel result;
435 result.iface = stats.extIface;
436 result.rxBytes = stats.rxBytes;
437 result.rxPackets = stats.rxPackets;
438 result.txBytes = stats.txBytes;
439 result.txPackets = stats.txPackets;
440 return result;
441}
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900442
Luke Huangcaebcbb2018-09-27 20:37:14 +0800443void setTetherStatsParcelVecByInterface(std::vector<TetherStatsParcel>* tetherStatsVec,
444 const TetherController::TetherStatsList& statsList) {
445 std::map<std::string, TetherController::TetherStats> statsMap;
446 for (const auto& stats : statsList) {
447 auto iter = statsMap.find(stats.extIface);
448 if (iter != statsMap.end()) {
449 tetherAddStatsByInterface(&(iter->second), stats);
450 } else {
451 statsMap.insert(
452 std::pair<std::string, TetherController::TetherStats>(stats.extIface, stats));
453 }
454 }
455 for (auto iter = statsMap.begin(); iter != statsMap.end(); iter++) {
456 tetherStatsVec->push_back(toTetherStatsParcel(iter->second));
457 }
458}
459
460std::vector<std::string> tetherStatsParcelVecToStringVec(std::vector<TetherStatsParcel>* tVec) {
461 std::vector<std::string> result;
462 for (const auto& t : *tVec) {
463 result.push_back(StringPrintf("%s:%" PRId64 ",%" PRId64 ",%" PRId64 ",%" PRId64,
464 t.iface.c_str(), t.rxBytes, t.rxPackets, t.txBytes,
465 t.txPackets));
466 }
467 return result;
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900468}
469
470} // namespace
471
Luke Huangcaebcbb2018-09-27 20:37:14 +0800472binder::Status NetdNativeService::tetherGetStats(
473 std::vector<TetherStatsParcel>* tetherStatsParcelVec) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900474 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti5192bf72017-09-04 13:30:59 +0900475 const auto& statsList = gCtls->tetherCtrl.getTetherStats();
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900476 if (!isOk(statsList)) {
Nathan Harold28ccfef2018-03-16 19:02:47 -0700477 return asBinderStatus(statsList);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900478 }
Luke Huangcaebcbb2018-09-27 20:37:14 +0800479 setTetherStatsParcelVecByInterface(tetherStatsParcelVec, statsList.value());
480 auto statsResults = tetherStatsParcelVecToStringVec(tetherStatsParcelVec);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900481 return binder::Status::ok();
482}
483
Erik Kline53c20882016-08-02 15:22:53 +0900484binder::Status NetdNativeService::interfaceAddAddress(const std::string &ifName,
485 const std::string &addrString, int prefixLength) {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000486 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline53c20882016-08-02 15:22:53 +0900487 const int err = InterfaceController::addAddress(
488 ifName.c_str(), addrString.c_str(), prefixLength);
489 if (err != 0) {
490 return binder::Status::fromServiceSpecificError(-err,
491 String8::format("InterfaceController error: %s", strerror(-err)));
492 }
493 return binder::Status::ok();
494}
495
496binder::Status NetdNativeService::interfaceDelAddress(const std::string &ifName,
497 const std::string &addrString, int prefixLength) {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000498 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline53c20882016-08-02 15:22:53 +0900499 const int err = InterfaceController::delAddress(
500 ifName.c_str(), addrString.c_str(), prefixLength);
501 if (err != 0) {
502 return binder::Status::fromServiceSpecificError(-err,
503 String8::format("InterfaceController error: %s", strerror(-err)));
504 }
505 return binder::Status::ok();
506}
507
Erik Kline38e51f12018-09-06 20:14:44 +0900508namespace {
Erik Kline55b06f82016-07-04 09:57:18 +0900509
Erik Kline38e51f12018-09-06 20:14:44 +0900510std::tuple<binder::Status, const char*, const char*> getPathComponents(int32_t ipversion,
511 int32_t category) {
512 const char* ipversionStr = nullptr;
513 switch (ipversion) {
Erik Kline55b06f82016-07-04 09:57:18 +0900514 case INetd::IPV4:
Erik Kline38e51f12018-09-06 20:14:44 +0900515 ipversionStr = "ipv4";
Erik Kline55b06f82016-07-04 09:57:18 +0900516 break;
517 case INetd::IPV6:
Erik Kline38e51f12018-09-06 20:14:44 +0900518 ipversionStr = "ipv6";
Erik Kline55b06f82016-07-04 09:57:18 +0900519 break;
520 default:
Erik Kline38e51f12018-09-06 20:14:44 +0900521 return {binder::Status::fromServiceSpecificError(EAFNOSUPPORT, "Bad IP version"),
522 nullptr, nullptr};
Erik Kline55b06f82016-07-04 09:57:18 +0900523 }
524
Erik Kline38e51f12018-09-06 20:14:44 +0900525 const char* whichStr = nullptr;
526 switch (category) {
Erik Kline55b06f82016-07-04 09:57:18 +0900527 case INetd::CONF:
528 whichStr = "conf";
529 break;
530 case INetd::NEIGH:
531 whichStr = "neigh";
532 break;
533 default:
Erik Kline38e51f12018-09-06 20:14:44 +0900534 return {binder::Status::fromServiceSpecificError(EINVAL, "Bad category"), nullptr,
535 nullptr};
Erik Kline55b06f82016-07-04 09:57:18 +0900536 }
537
Erik Kline38e51f12018-09-06 20:14:44 +0900538 return {binder::Status::ok(), ipversionStr, whichStr};
539}
540
541} // namespace
542
543binder::Status NetdNativeService::getProcSysNet(int32_t ipversion, int32_t which,
544 const std::string& ifname,
545 const std::string& parameter, std::string* value) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900546 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline38e51f12018-09-06 20:14:44 +0900547 const auto pathParts = getPathComponents(ipversion, which);
548 const auto& pathStatus = std::get<0>(pathParts);
549 if (!pathStatus.isOk()) {
Erik Kline38e51f12018-09-06 20:14:44 +0900550 return pathStatus;
Erik Kline55b06f82016-07-04 09:57:18 +0900551 }
Erik Kline38e51f12018-09-06 20:14:44 +0900552
553 const int err = InterfaceController::getParameter(std::get<1>(pathParts),
554 std::get<2>(pathParts), ifname.c_str(),
555 parameter.c_str(), value);
Erik Kline38e51f12018-09-06 20:14:44 +0900556 return statusFromErrcode(err);
557}
558
559binder::Status NetdNativeService::setProcSysNet(int32_t ipversion, int32_t which,
560 const std::string& ifname,
561 const std::string& parameter,
562 const std::string& value) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900563 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline38e51f12018-09-06 20:14:44 +0900564 const auto pathParts = getPathComponents(ipversion, which);
565 const auto& pathStatus = std::get<0>(pathParts);
566 if (!pathStatus.isOk()) {
Erik Kline38e51f12018-09-06 20:14:44 +0900567 return pathStatus;
568 }
569
570 const int err = InterfaceController::setParameter(std::get<1>(pathParts),
571 std::get<2>(pathParts), ifname.c_str(),
572 parameter.c_str(), value.c_str());
Erik Kline38e51f12018-09-06 20:14:44 +0900573 return statusFromErrcode(err);
Erik Kline55b06f82016-07-04 09:57:18 +0900574}
575
Luke Huange203a152018-11-23 11:47:28 +0800576binder::Status NetdNativeService::ipSecSetEncapSocketOwner(const ParcelFileDescriptor& socket,
577 int newUid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900578 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wongb2daefb2017-12-06 22:05:46 -0800579
580 uid_t callerUid = IPCThreadState::self()->getCallingUid();
Luke Huange203a152018-11-23 11:47:28 +0800581 return asBinderStatus(
582 gCtls->xfrmCtrl.ipSecSetEncapSocketOwner(socket.get(), newUid, callerUid));
Benedict Wongb2daefb2017-12-06 22:05:46 -0800583}
584
Nathan Harold1a371532017-01-30 12:30:48 -0800585binder::Status NetdNativeService::ipSecAllocateSpi(
586 int32_t transformId,
Nathan Haroldda54f122018-01-09 16:42:57 -0800587 const std::string& sourceAddress,
588 const std::string& destinationAddress,
Nathan Harold1a371532017-01-30 12:30:48 -0800589 int32_t inSpi,
590 int32_t* outSpi) {
591 // Necessary locking done in IpSecService and kernel
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000592 ENFORCE_NETWORK_STACK_PERMISSIONS();
ludi6e8eccd2017-08-14 14:40:37 -0700593 return asBinderStatus(gCtls->xfrmCtrl.ipSecAllocateSpi(
Nathan Harold1a371532017-01-30 12:30:48 -0800594 transformId,
Nathan Haroldda54f122018-01-09 16:42:57 -0800595 sourceAddress,
596 destinationAddress,
Nathan Harold1a371532017-01-30 12:30:48 -0800597 inSpi,
598 outSpi));
599}
600
601binder::Status NetdNativeService::ipSecAddSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700602 int32_t transformId, int32_t mode, const std::string& sourceAddress,
603 const std::string& destinationAddress, int32_t underlyingNetId, int32_t spi,
604 int32_t markValue, int32_t markMask, const std::string& authAlgo,
605 const std::vector<uint8_t>& authKey, int32_t authTruncBits, const std::string& cryptAlgo,
606 const std::vector<uint8_t>& cryptKey, int32_t cryptTruncBits, const std::string& aeadAlgo,
607 const std::vector<uint8_t>& aeadKey, int32_t aeadIcvBits, int32_t encapType,
608 int32_t encapLocalPort, int32_t encapRemotePort, int32_t interfaceId) {
Nathan Harold1a371532017-01-30 12:30:48 -0800609 // Necessary locking done in IpSecService and kernel
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000610 ENFORCE_NETWORK_STACK_PERMISSIONS();
ludi6e8eccd2017-08-14 14:40:37 -0700611 return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityAssociation(
Benedict Wongad600cb2018-05-14 17:22:35 -0700612 transformId, mode, sourceAddress, destinationAddress, underlyingNetId, spi, markValue,
613 markMask, authAlgo, authKey, authTruncBits, cryptAlgo, cryptKey, cryptTruncBits,
Benedict Wonga450e722018-05-07 10:29:02 -0700614 aeadAlgo, aeadKey, aeadIcvBits, encapType, encapLocalPort, encapRemotePort,
615 interfaceId));
Nathan Harold1a371532017-01-30 12:30:48 -0800616}
617
618binder::Status NetdNativeService::ipSecDeleteSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700619 int32_t transformId, const std::string& sourceAddress,
620 const std::string& destinationAddress, int32_t spi, int32_t markValue, int32_t markMask,
621 int32_t interfaceId) {
Nathan Harold1a371532017-01-30 12:30:48 -0800622 // Necessary locking done in IpSecService and kernel
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000623 ENFORCE_NETWORK_STACK_PERMISSIONS();
ludi6e8eccd2017-08-14 14:40:37 -0700624 return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700625 transformId, sourceAddress, destinationAddress, spi, markValue, markMask, interfaceId));
Nathan Harold1a371532017-01-30 12:30:48 -0800626}
627
628binder::Status NetdNativeService::ipSecApplyTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800629 const ParcelFileDescriptor& socket, int32_t transformId, int32_t direction,
630 const std::string& sourceAddress, const std::string& destinationAddress, int32_t spi) {
Nathan Harold1a371532017-01-30 12:30:48 -0800631 // Necessary locking done in IpSecService and kernel
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000632 ENFORCE_NETWORK_STACK_PERMISSIONS();
ludi6e8eccd2017-08-14 14:40:37 -0700633 return asBinderStatus(gCtls->xfrmCtrl.ipSecApplyTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800634 socket.get(), transformId, direction, sourceAddress, destinationAddress, spi));
Nathan Harold1a371532017-01-30 12:30:48 -0800635}
636
637binder::Status NetdNativeService::ipSecRemoveTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800638 const ParcelFileDescriptor& socket) {
Nathan Harold1a371532017-01-30 12:30:48 -0800639 // Necessary locking done in IpSecService and kernel
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000640 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huange203a152018-11-23 11:47:28 +0800641 return asBinderStatus(gCtls->xfrmCtrl.ipSecRemoveTransportModeTransform(socket.get()));
Nathan Harold1a371532017-01-30 12:30:48 -0800642}
643
Benedict Wonga04ffa72018-05-09 21:42:42 -0700644binder::Status NetdNativeService::ipSecAddSecurityPolicy(int32_t transformId, int32_t selAddrFamily,
645 int32_t direction,
Benedict Wongad600cb2018-05-14 17:22:35 -0700646 const std::string& tmplSrcAddress,
647 const std::string& tmplDstAddress,
648 int32_t spi, int32_t markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700649 int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800650 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900651 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong84a8dca2018-01-19 12:12:17 -0800652 return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityPolicy(
Benedict Wonga04ffa72018-05-09 21:42:42 -0700653 transformId, selAddrFamily, direction, tmplSrcAddress, tmplDstAddress, spi, markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700654 markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800655}
656
Benedict Wonga450e722018-05-07 10:29:02 -0700657binder::Status NetdNativeService::ipSecUpdateSecurityPolicy(
658 int32_t transformId, int32_t selAddrFamily, int32_t direction,
659 const std::string& tmplSrcAddress, const std::string& tmplDstAddress, int32_t spi,
660 int32_t markValue, int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800661 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900662 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong84a8dca2018-01-19 12:12:17 -0800663 return asBinderStatus(gCtls->xfrmCtrl.ipSecUpdateSecurityPolicy(
Benedict Wonga04ffa72018-05-09 21:42:42 -0700664 transformId, selAddrFamily, direction, tmplSrcAddress, tmplDstAddress, spi, markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700665 markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800666}
667
Benedict Wonga04ffa72018-05-09 21:42:42 -0700668binder::Status NetdNativeService::ipSecDeleteSecurityPolicy(int32_t transformId,
669 int32_t selAddrFamily,
670 int32_t direction, int32_t markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700671 int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800672 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900673 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong84a8dca2018-01-19 12:12:17 -0800674 return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityPolicy(
Benedict Wonga450e722018-05-07 10:29:02 -0700675 transformId, selAddrFamily, direction, markValue, markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800676}
677
Benedict Wong319f17e2018-05-15 17:06:44 -0700678binder::Status NetdNativeService::ipSecAddTunnelInterface(const std::string& deviceName,
679 const std::string& localAddress,
680 const std::string& remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700681 int32_t iKey, int32_t oKey,
682 int32_t interfaceId) {
manojboopathi8707f232018-01-02 14:45:47 -0800683 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900684 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700685 netdutils::Status result = gCtls->xfrmCtrl.ipSecAddTunnelInterface(
Benedict Wonga450e722018-05-07 10:29:02 -0700686 deviceName, localAddress, remoteAddress, iKey, oKey, interfaceId, false);
Benedict Wong319f17e2018-05-15 17:06:44 -0700687 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800688}
689
Benedict Wong319f17e2018-05-15 17:06:44 -0700690binder::Status NetdNativeService::ipSecUpdateTunnelInterface(const std::string& deviceName,
691 const std::string& localAddress,
692 const std::string& remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700693 int32_t iKey, int32_t oKey,
694 int32_t interfaceId) {
manojboopathi8707f232018-01-02 14:45:47 -0800695 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900696 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700697 netdutils::Status result = gCtls->xfrmCtrl.ipSecAddTunnelInterface(
Benedict Wonga450e722018-05-07 10:29:02 -0700698 deviceName, localAddress, remoteAddress, iKey, oKey, interfaceId, true);
Benedict Wong319f17e2018-05-15 17:06:44 -0700699 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800700}
701
Benedict Wong319f17e2018-05-15 17:06:44 -0700702binder::Status NetdNativeService::ipSecRemoveTunnelInterface(const std::string& deviceName) {
manojboopathi8707f232018-01-02 14:45:47 -0800703 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900704 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700705 netdutils::Status result = gCtls->xfrmCtrl.ipSecRemoveTunnelInterface(deviceName);
Benedict Wong319f17e2018-05-15 17:06:44 -0700706 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800707}
708
Joel Scherpelzde937962017-06-01 13:20:21 +0900709binder::Status NetdNativeService::setIPv6AddrGenMode(const std::string& ifName,
710 int32_t mode) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900711 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700712 return asBinderStatus(InterfaceController::setIPv6AddrGenMode(ifName, mode));
Joel Scherpelzde937962017-06-01 13:20:21 +0900713}
714
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900715binder::Status NetdNativeService::wakeupAddInterface(const std::string& ifName,
716 const std::string& prefix, int32_t mark,
717 int32_t mask) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900718 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700719 return asBinderStatus(gCtls->wakeupCtrl.addInterface(ifName, prefix, mark, mask));
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900720}
721
722binder::Status NetdNativeService::wakeupDelInterface(const std::string& ifName,
723 const std::string& prefix, int32_t mark,
724 int32_t mask) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900725 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700726 return asBinderStatus(gCtls->wakeupCtrl.delInterface(ifName, prefix, mark, mask));
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900727}
728
Chenbo Feng873ae142019-04-10 12:26:06 -0700729binder::Status NetdNativeService::trafficSwapActiveStatsMap() {
730 ENFORCE_NETWORK_STACK_PERMISSIONS();
731 return asBinderStatus(gCtls->trafficCtrl.swapActiveStatsMap());
732}
733
Luke Huang0051a622018-07-23 20:30:16 +0800734binder::Status NetdNativeService::idletimerAddInterface(const std::string& ifName, int32_t timeout,
735 const std::string& classLabel) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900736 NETD_LOCKING_RPC(gCtls->idletimerCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang0051a622018-07-23 20:30:16 +0800737 int res =
738 gCtls->idletimerCtrl.addInterfaceIdletimer(ifName.c_str(), timeout, classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +0800739 return statusFromErrcode(res);
740}
741
742binder::Status NetdNativeService::idletimerRemoveInterface(const std::string& ifName,
743 int32_t timeout,
744 const std::string& classLabel) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900745 NETD_LOCKING_RPC(gCtls->idletimerCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang0051a622018-07-23 20:30:16 +0800746 int res = gCtls->idletimerCtrl.removeInterfaceIdletimer(ifName.c_str(), timeout,
747 classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +0800748 return statusFromErrcode(res);
749}
Luke Huanga67dd562018-07-17 19:58:25 +0800750
751binder::Status NetdNativeService::strictUidCleartextPenalty(int32_t uid, int32_t policyPenalty) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900752 NETD_LOCKING_RPC(gCtls->strictCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huanga67dd562018-07-17 19:58:25 +0800753 StrictPenalty penalty;
754 switch (policyPenalty) {
755 case INetd::PENALTY_POLICY_REJECT:
756 penalty = REJECT;
757 break;
758 case INetd::PENALTY_POLICY_LOG:
759 penalty = LOG;
760 break;
761 case INetd::PENALTY_POLICY_ACCEPT:
762 penalty = ACCEPT;
763 break;
764 default:
765 return statusFromErrcode(-EINVAL);
766 break;
767 }
768 int res = gCtls->strictCtrl.setUidCleartextPenalty((uid_t) uid, penalty);
Luke Huanga67dd562018-07-17 19:58:25 +0800769 return statusFromErrcode(res);
770}
Luke Huange64fa382018-07-24 16:38:22 +0800771
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +0900772binder::Status NetdNativeService::clatdStart(const std::string& ifName,
773 const std::string& nat64Prefix, std::string* v6Addr) {
Maciej Żenczykowski56280272019-03-30 03:32:51 -0700774 ENFORCE_ANY_PERMISSION(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +0900775 int res = gCtls->clatdCtrl.startClatd(ifName.c_str(), nat64Prefix, v6Addr);
Luke Huang6d301232018-08-01 14:05:18 +0800776 return statusFromErrcode(res);
777}
778
779binder::Status NetdNativeService::clatdStop(const std::string& ifName) {
Maciej Żenczykowski56280272019-03-30 03:32:51 -0700780 ENFORCE_ANY_PERMISSION(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang6d301232018-08-01 14:05:18 +0800781 int res = gCtls->clatdCtrl.stopClatd(ifName.c_str());
Luke Huang6d301232018-08-01 14:05:18 +0800782 return statusFromErrcode(res);
783}
Luke Huanga67dd562018-07-17 19:58:25 +0800784
Luke Huang457d4702018-08-16 15:39:15 +0800785binder::Status NetdNativeService::ipfwdEnabled(bool* status) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900786 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang728cf4c2019-03-14 19:43:02 +0800787 *status = (gCtls->tetherCtrl.getIpfwdRequesterList().size() > 0) ? true : false;
788 return binder::Status::ok();
789}
790
791binder::Status NetdNativeService::ipfwdGetRequesterList(std::vector<std::string>* requesterList) {
792 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
793 for (const auto& requester : gCtls->tetherCtrl.getIpfwdRequesterList()) {
794 requesterList->push_back(requester);
795 }
Luke Huang457d4702018-08-16 15:39:15 +0800796 return binder::Status::ok();
797}
798
799binder::Status NetdNativeService::ipfwdEnableForwarding(const std::string& requester) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900800 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang457d4702018-08-16 15:39:15 +0800801 int res = (gCtls->tetherCtrl.enableForwarding(requester.c_str())) ? 0 : -EREMOTEIO;
Luke Huang457d4702018-08-16 15:39:15 +0800802 return statusFromErrcode(res);
803}
804
805binder::Status NetdNativeService::ipfwdDisableForwarding(const std::string& requester) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900806 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang457d4702018-08-16 15:39:15 +0800807 int res = (gCtls->tetherCtrl.disableForwarding(requester.c_str())) ? 0 : -EREMOTEIO;
Luke Huang457d4702018-08-16 15:39:15 +0800808 return statusFromErrcode(res);
809}
810
811binder::Status NetdNativeService::ipfwdAddInterfaceForward(const std::string& fromIface,
812 const std::string& toIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900813 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang457d4702018-08-16 15:39:15 +0800814 int res = RouteController::enableTethering(fromIface.c_str(), toIface.c_str());
Luke Huang457d4702018-08-16 15:39:15 +0800815 return statusFromErrcode(res);
816}
817
818binder::Status NetdNativeService::ipfwdRemoveInterfaceForward(const std::string& fromIface,
819 const std::string& toIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900820 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang457d4702018-08-16 15:39:15 +0800821 int res = RouteController::disableTethering(fromIface.c_str(), toIface.c_str());
Luke Huang457d4702018-08-16 15:39:15 +0800822 return statusFromErrcode(res);
823}
824
Luke Huangf7782042018-08-08 13:13:04 +0800825namespace {
Automerger Merge Workeraa65d712020-03-05 10:29:36 +0000826
Luke Huangf7782042018-08-08 13:13:04 +0800827std::string addCurlyBrackets(const std::string& s) {
828 return "{" + s + "}";
829}
830
831} // namespace
Xiao Ma33d562a2018-12-16 16:27:38 +0900832
Luke Huangf7782042018-08-08 13:13:04 +0800833binder::Status NetdNativeService::interfaceGetList(std::vector<std::string>* interfaceListResult) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900834 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800835 const auto& ifaceList = InterfaceController::getIfaceNames();
Luke Huangf7782042018-08-08 13:13:04 +0800836
837 interfaceListResult->clear();
838 interfaceListResult->reserve(ifaceList.value().size());
839 interfaceListResult->insert(end(*interfaceListResult), begin(ifaceList.value()),
840 end(ifaceList.value()));
841
Luke Huangf7782042018-08-08 13:13:04 +0800842 return binder::Status::ok();
843}
844
845std::string interfaceConfigurationParcelToString(const InterfaceConfigurationParcel& cfg) {
846 std::vector<std::string> result{cfg.ifName, cfg.hwAddr, cfg.ipv4Addr,
847 std::to_string(cfg.prefixLength)};
848 result.insert(end(result), begin(cfg.flags), end(cfg.flags));
849 return addCurlyBrackets(base::Join(result, ", "));
850}
851
852binder::Status NetdNativeService::interfaceGetCfg(
853 const std::string& ifName, InterfaceConfigurationParcel* interfaceGetCfgResult) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900854 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800855 auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__).arg(ifName);
856
857 const auto& cfgRes = InterfaceController::getCfg(ifName);
858 RETURN_BINDER_STATUS_IF_NOT_OK(entry, cfgRes);
859
860 *interfaceGetCfgResult = cfgRes.value();
861 gLog.log(entry.returns(interfaceConfigurationParcelToString(*interfaceGetCfgResult))
862 .withAutomaticDuration());
863 return binder::Status::ok();
864}
865
866binder::Status NetdNativeService::interfaceSetCfg(const InterfaceConfigurationParcel& cfg) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900867 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800868 auto entry = gLog.newEntry()
869 .prettyFunction(__PRETTY_FUNCTION__)
870 .arg(interfaceConfigurationParcelToString(cfg));
871
872 const auto& res = InterfaceController::setCfg(cfg);
873 RETURN_BINDER_STATUS_IF_NOT_OK(entry, res);
874
875 gLog.log(entry.withAutomaticDuration());
876 return binder::Status::ok();
877}
878
879binder::Status NetdNativeService::interfaceSetIPv6PrivacyExtensions(const std::string& ifName,
880 bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900881 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800882 int res = InterfaceController::setIPv6PrivacyExtensions(ifName.c_str(), enable);
Luke Huangf7782042018-08-08 13:13:04 +0800883 return statusFromErrcode(res);
884}
885
886binder::Status NetdNativeService::interfaceClearAddrs(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900887 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800888 int res = InterfaceController::clearAddrs(ifName.c_str());
Luke Huangf7782042018-08-08 13:13:04 +0800889 return statusFromErrcode(res);
890}
891
892binder::Status NetdNativeService::interfaceSetEnableIPv6(const std::string& ifName, bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900893 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800894 int res = InterfaceController::setEnableIPv6(ifName.c_str(), enable);
Luke Huangf7782042018-08-08 13:13:04 +0800895 return statusFromErrcode(res);
896}
897
898binder::Status NetdNativeService::interfaceSetMtu(const std::string& ifName, int32_t mtuValue) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900899 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800900 std::string mtu = std::to_string(mtuValue);
901 int res = InterfaceController::setMtu(ifName.c_str(), mtu.c_str());
Luke Huangf7782042018-08-08 13:13:04 +0800902 return statusFromErrcode(res);
903}
904
Luke Huangb5733d72018-08-21 17:17:19 +0800905binder::Status NetdNativeService::tetherStart(const std::vector<std::string>& dhcpRanges) {
Chiachang Wang08cb2112019-12-10 09:53:24 +0800906 TetherConfigParcel config;
907 config.usingLegacyDnsProxy = true;
908 config.dhcpRanges = dhcpRanges;
909 return tetherStartWithConfiguration(config);
Luke Huang91bd3e12019-08-20 11:33:52 +0800910}
911
Chiachang Wang08cb2112019-12-10 09:53:24 +0800912binder::Status NetdNativeService::tetherStartWithConfiguration(const TetherConfigParcel& config) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900913 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Chiachang Wang08cb2112019-12-10 09:53:24 +0800914 if (config.dhcpRanges.size() % 2 == 1) {
Luke Huangb5733d72018-08-21 17:17:19 +0800915 return statusFromErrcode(-EINVAL);
916 }
Chiachang Wang08cb2112019-12-10 09:53:24 +0800917 // TODO: Pass TetherConfigParcel directly.
918 int res = gCtls->tetherCtrl.startTethering(config.usingLegacyDnsProxy, config.dhcpRanges);
Luke Huangb5733d72018-08-21 17:17:19 +0800919 return statusFromErrcode(res);
920}
921
922binder::Status NetdNativeService::tetherStop() {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900923 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800924 int res = gCtls->tetherCtrl.stopTethering();
Luke Huangb5733d72018-08-21 17:17:19 +0800925 return statusFromErrcode(res);
926}
927
928binder::Status NetdNativeService::tetherIsEnabled(bool* enabled) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900929 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800930 *enabled = gCtls->tetherCtrl.isTetheringStarted();
Luke Huangb5733d72018-08-21 17:17:19 +0800931 return binder::Status::ok();
932}
933
934binder::Status NetdNativeService::tetherInterfaceAdd(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900935 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800936 int res = gCtls->tetherCtrl.tetherInterface(ifName.c_str());
Luke Huangb5733d72018-08-21 17:17:19 +0800937 return statusFromErrcode(res);
938}
939
940binder::Status NetdNativeService::tetherInterfaceRemove(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900941 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800942 int res = gCtls->tetherCtrl.untetherInterface(ifName.c_str());
Luke Huangb5733d72018-08-21 17:17:19 +0800943 return statusFromErrcode(res);
944}
945
946binder::Status NetdNativeService::tetherInterfaceList(std::vector<std::string>* ifList) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900947 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800948 for (const auto& ifname : gCtls->tetherCtrl.getTetheredInterfaceList()) {
949 ifList->push_back(ifname);
950 }
Luke Huangb5733d72018-08-21 17:17:19 +0800951 return binder::Status::ok();
952}
953
954binder::Status NetdNativeService::tetherDnsSet(int32_t netId,
955 const std::vector<std::string>& dnsAddrs) {
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.setDnsForwarders(netId, dnsAddrs);
Luke Huangb5733d72018-08-21 17:17:19 +0800958 return statusFromErrcode(res);
959}
960
961binder::Status NetdNativeService::tetherDnsList(std::vector<std::string>* dnsList) {
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& fwdr : gCtls->tetherCtrl.getDnsForwarders()) {
964 dnsList->push_back(fwdr);
965 }
Luke Huangb5733d72018-08-21 17:17:19 +0800966 return binder::Status::ok();
967}
968
Tyler Wearfa94a272019-12-05 15:01:48 -0800969binder::Status NetdNativeService::networkAddRouteParcel(int32_t netId,
970 const RouteInfoParcel& route) {
971 // Public methods of NetworkController are thread-safe.
972 ENFORCE_NETWORK_STACK_PERMISSIONS();
973 bool legacy = false;
974 uid_t uid = 0; // UID is only meaningful for legacy routes.
975
976 // convert Parcel to parameters
977 int res = gCtls->netCtrl.addRoute(netId, route.ifName.c_str(), route.destination.c_str(),
978 route.nextHop.empty() ? nullptr : route.nextHop.c_str(),
979 legacy, uid, route.mtu);
980 return statusFromErrcode(res);
981}
982
983binder::Status NetdNativeService::networkUpdateRouteParcel(int32_t netId,
984 const RouteInfoParcel& route) {
985 // Public methods of NetworkController are thread-safe.
986 ENFORCE_NETWORK_STACK_PERMISSIONS();
987 bool legacy = false;
988 uid_t uid = 0; // UID is only meaningful for legacy routes.
989
990 // convert Parcel to parameters
991 int res = gCtls->netCtrl.updateRoute(netId, route.ifName.c_str(), route.destination.c_str(),
992 route.nextHop.empty() ? nullptr : route.nextHop.c_str(),
993 legacy, uid, route.mtu);
994 return statusFromErrcode(res);
995}
996
997binder::Status NetdNativeService::networkRemoveRouteParcel(int32_t netId,
998 const RouteInfoParcel& route) {
999 return networkRemoveRoute(netId, route.ifName, route.destination, route.nextHop);
1000}
1001
Luke Huangb670d162018-08-23 20:01:13 +08001002binder::Status NetdNativeService::networkAddRoute(int32_t netId, const std::string& ifName,
1003 const std::string& destination,
1004 const std::string& nextHop) {
1005 // Public methods of NetworkController are thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001006 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001007 bool legacy = false;
1008 uid_t uid = 0; // UID is only meaningful for legacy routes.
1009 int res = gCtls->netCtrl.addRoute(netId, ifName.c_str(), destination.c_str(),
Tyler Wearfa94a272019-12-05 15:01:48 -08001010 nextHop.empty() ? nullptr : nextHop.c_str(), legacy, uid, 0);
Luke Huangb670d162018-08-23 20:01:13 +08001011 return statusFromErrcode(res);
1012}
1013
1014binder::Status NetdNativeService::networkRemoveRoute(int32_t netId, const std::string& ifName,
1015 const std::string& destination,
1016 const std::string& nextHop) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001017 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001018 bool legacy = false;
1019 uid_t uid = 0; // UID is only meaningful for legacy routes.
1020 int res = gCtls->netCtrl.removeRoute(netId, ifName.c_str(), destination.c_str(),
1021 nextHop.empty() ? nullptr : nextHop.c_str(), legacy, uid);
Luke Huangb670d162018-08-23 20:01:13 +08001022 return statusFromErrcode(res);
1023}
1024
1025binder::Status NetdNativeService::networkAddLegacyRoute(int32_t netId, const std::string& ifName,
1026 const std::string& destination,
1027 const std::string& nextHop, int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001028 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001029 bool legacy = true;
1030 int res = gCtls->netCtrl.addRoute(netId, ifName.c_str(), destination.c_str(),
1031 nextHop.empty() ? nullptr : nextHop.c_str(), legacy,
Tyler Wearfa94a272019-12-05 15:01:48 -08001032 (uid_t)uid, 0);
Luke Huangb670d162018-08-23 20:01:13 +08001033 return statusFromErrcode(res);
1034}
1035
1036binder::Status NetdNativeService::networkRemoveLegacyRoute(int32_t netId, const std::string& ifName,
1037 const std::string& destination,
1038 const std::string& nextHop,
1039 int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001040 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001041 bool legacy = true;
1042 int res = gCtls->netCtrl.removeRoute(netId, ifName.c_str(), destination.c_str(),
1043 nextHop.empty() ? nullptr : nextHop.c_str(), legacy,
1044 (uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001045 return statusFromErrcode(res);
1046}
1047
1048binder::Status NetdNativeService::networkGetDefault(int32_t* netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001049 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001050 *netId = gCtls->netCtrl.getDefaultNetwork();
Luke Huangb670d162018-08-23 20:01:13 +08001051 return binder::Status::ok();
1052}
1053
1054binder::Status NetdNativeService::networkSetDefault(int32_t netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001055 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001056 int res = gCtls->netCtrl.setDefaultNetwork(netId);
Luke Huangb670d162018-08-23 20:01:13 +08001057 return statusFromErrcode(res);
1058}
1059
1060binder::Status NetdNativeService::networkClearDefault() {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001061 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001062 unsigned netId = NETID_UNSET;
1063 int res = gCtls->netCtrl.setDefaultNetwork(netId);
Luke Huangb670d162018-08-23 20:01:13 +08001064 return statusFromErrcode(res);
1065}
1066
1067std::vector<uid_t> NetdNativeService::intsToUids(const std::vector<int32_t>& intUids) {
1068 return {begin(intUids), end(intUids)};
1069}
1070
1071Permission NetdNativeService::convertPermission(int32_t permission) {
1072 switch (permission) {
1073 case INetd::PERMISSION_NETWORK:
1074 return Permission::PERMISSION_NETWORK;
1075 case INetd::PERMISSION_SYSTEM:
1076 return Permission::PERMISSION_SYSTEM;
1077 default:
1078 return Permission::PERMISSION_NONE;
1079 }
1080}
1081
1082binder::Status NetdNativeService::networkSetPermissionForNetwork(int32_t netId,
1083 int32_t permission) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001084 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001085 std::vector<unsigned> netIds = {(unsigned) netId};
1086 int res = gCtls->netCtrl.setPermissionForNetworks(convertPermission(permission), netIds);
Luke Huangb670d162018-08-23 20:01:13 +08001087 return statusFromErrcode(res);
1088}
1089
1090binder::Status NetdNativeService::networkSetPermissionForUser(int32_t permission,
1091 const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001092 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001093 gCtls->netCtrl.setPermissionForUsers(convertPermission(permission), intsToUids(uids));
Luke Huangb670d162018-08-23 20:01:13 +08001094 return binder::Status::ok();
1095}
1096
1097binder::Status NetdNativeService::networkClearPermissionForUser(const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001098 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001099 Permission permission = Permission::PERMISSION_NONE;
1100 gCtls->netCtrl.setPermissionForUsers(permission, intsToUids(uids));
Luke Huangb670d162018-08-23 20:01:13 +08001101 return binder::Status::ok();
1102}
1103
1104binder::Status NetdNativeService::NetdNativeService::networkSetProtectAllow(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001105 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001106 std::vector<uid_t> uids = {(uid_t) uid};
1107 gCtls->netCtrl.allowProtect(uids);
Luke Huangb670d162018-08-23 20:01:13 +08001108 return binder::Status::ok();
1109}
1110
1111binder::Status NetdNativeService::networkSetProtectDeny(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001112 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001113 std::vector<uid_t> uids = {(uid_t) uid};
1114 gCtls->netCtrl.denyProtect(uids);
Luke Huangb670d162018-08-23 20:01:13 +08001115 return binder::Status::ok();
1116}
1117
1118binder::Status NetdNativeService::networkCanProtect(int32_t uid, bool* ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001119 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001120 *ret = gCtls->netCtrl.canProtect((uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001121 return binder::Status::ok();
1122}
1123
Chenbo Feng48eaed32018-12-26 17:40:21 -08001124binder::Status NetdNativeService::trafficSetNetPermForUids(int32_t permission,
1125 const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001126 ENFORCE_NETWORK_STACK_PERMISSIONS();
Chenbo Feng48eaed32018-12-26 17:40:21 -08001127 gCtls->trafficCtrl.setPermissionForUids(permission, intsToUids(uids));
Chenbo Feng48eaed32018-12-26 17:40:21 -08001128 return binder::Status::ok();
1129}
1130
Luke Huange64fa382018-07-24 16:38:22 +08001131binder::Status NetdNativeService::firewallSetFirewallType(int32_t firewallType) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001132 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001133 auto type = static_cast<FirewallType>(firewallType);
1134
1135 int res = gCtls->firewallCtrl.setFirewallType(type);
Luke Huange64fa382018-07-24 16:38:22 +08001136 return statusFromErrcode(res);
1137}
1138
1139binder::Status NetdNativeService::firewallSetInterfaceRule(const std::string& ifName,
1140 int32_t firewallRule) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001141 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001142 auto rule = static_cast<FirewallRule>(firewallRule);
1143
1144 int res = gCtls->firewallCtrl.setInterfaceRule(ifName.c_str(), rule);
Luke Huange64fa382018-07-24 16:38:22 +08001145 return statusFromErrcode(res);
1146}
1147
1148binder::Status NetdNativeService::firewallSetUidRule(int32_t childChain, int32_t uid,
1149 int32_t firewallRule) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001150 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001151 auto chain = static_cast<ChildChain>(childChain);
1152 auto rule = static_cast<FirewallRule>(firewallRule);
1153
1154 int res = gCtls->firewallCtrl.setUidRule(chain, uid, rule);
Luke Huange64fa382018-07-24 16:38:22 +08001155 return statusFromErrcode(res);
1156}
1157
1158binder::Status NetdNativeService::firewallEnableChildChain(int32_t childChain, bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001159 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001160 auto chain = static_cast<ChildChain>(childChain);
1161
1162 int res = gCtls->firewallCtrl.enableChildChains(chain, enable);
Luke Huange64fa382018-07-24 16:38:22 +08001163 return statusFromErrcode(res);
1164}
1165
Rubin Xuec27ff22019-01-08 21:33:03 +00001166binder::Status NetdNativeService::firewallAddUidInterfaceRules(const std::string& ifName,
1167 const std::vector<int32_t>& uids) {
1168 ENFORCE_NETWORK_STACK_PERMISSIONS();
1169
1170 return asBinderStatus(gCtls->trafficCtrl.addUidInterfaceRules(
1171 RouteController::getIfIndex(ifName.c_str()), uids));
1172}
1173
1174binder::Status NetdNativeService::firewallRemoveUidInterfaceRules(
1175 const std::vector<int32_t>& uids) {
1176 ENFORCE_NETWORK_STACK_PERMISSIONS();
1177
1178 return asBinderStatus(gCtls->trafficCtrl.removeUidInterfaceRules(uids));
1179}
1180
Luke Huang19b49c52018-10-22 12:12:05 +09001181binder::Status NetdNativeService::tetherAddForward(const std::string& intIface,
1182 const std::string& extIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001183 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang19b49c52018-10-22 12:12:05 +09001184
1185 int res = gCtls->tetherCtrl.enableNat(intIface.c_str(), extIface.c_str());
Luke Huang19b49c52018-10-22 12:12:05 +09001186 return statusFromErrcode(res);
1187}
1188
1189binder::Status NetdNativeService::tetherRemoveForward(const std::string& intIface,
1190 const std::string& extIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001191 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangae038f82018-11-05 11:17:31 +09001192 int res = gCtls->tetherCtrl.disableNat(intIface.c_str(), extIface.c_str());
Luke Huang19b49c52018-10-22 12:12:05 +09001193 return statusFromErrcode(res);
1194}
1195
Chenbo Fengf5663d82018-11-08 16:10:48 -08001196binder::Status NetdNativeService::setTcpRWmemorySize(const std::string& rmemValues,
1197 const std::string& wmemValues) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001198 ENFORCE_NETWORK_STACK_PERMISSIONS();
Chenbo Fengf5663d82018-11-08 16:10:48 -08001199 if (!WriteStringToFile(rmemValues, TCP_RMEM_PROC_FILE)) {
1200 int ret = -errno;
Chenbo Fengf5663d82018-11-08 16:10:48 -08001201 return statusFromErrcode(ret);
1202 }
1203
1204 if (!WriteStringToFile(wmemValues, TCP_WMEM_PROC_FILE)) {
1205 int ret = -errno;
Chenbo Fengf5663d82018-11-08 16:10:48 -08001206 return statusFromErrcode(ret);
1207 }
Chenbo Fengf5663d82018-11-08 16:10:48 -08001208 return binder::Status::ok();
1209}
1210
Luke Huang528af602018-08-29 19:06:05 +08001211binder::Status NetdNativeService::registerUnsolicitedEventListener(
1212 const android::sp<android::net::INetdUnsolicitedEventListener>& listener) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001213 ENFORCE_NETWORK_STACK_PERMISSIONS();
Bernie Innocenti9ee088d2019-02-01 17:14:32 +09001214 gCtls->eventReporter.registerUnsolEventListener(listener);
Luke Huang528af602018-08-29 19:06:05 +08001215 return binder::Status::ok();
1216}
1217
Luke Huange60bfd82019-04-26 11:39:31 +08001218binder::Status NetdNativeService::getOemNetd(android::sp<android::IBinder>* listener) {
1219 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang0e5e69d2019-03-06 15:42:38 +08001220 *listener = com::android::internal::net::OemNetdListener::getListener();
1221
Luke Huange60bfd82019-04-26 11:39:31 +08001222 return binder::Status::ok();
1223}
1224
Chiachang Wang00fc62f2019-12-04 20:38:26 +08001225binder::Status NetdNativeService::getFwmarkForNetwork(int32_t netId, MarkMaskParcel* markMask) {
1226 ENFORCE_NETWORK_STACK_PERMISSIONS();
1227
1228 Fwmark fwmark;
1229 fwmark.netId = netId;
1230 markMask->mask = FWMARK_NET_ID_MASK;
1231 markMask->mark = fwmark.intValue;
1232 return binder::Status::ok();
1233}
1234
Lorenzo Colittie801d3c2020-02-18 00:00:35 +09001235binder::Status NetdNativeService::tetherRuleAddDownstreamIpv6(
1236 int intIfaceIndex, int extIfaceIndex, const std::vector<uint8_t>& ipAddress,
1237 const std::vector<uint8_t>& srcL2Address, const std::vector<uint8_t>& dstL2Address) {
1238 ENFORCE_NETWORK_STACK_PERMISSIONS();
1239
1240 return asBinderStatus(gCtls->tetherCtrl.addDownstreamIpv6Rule(
1241 intIfaceIndex, extIfaceIndex, ipAddress, srcL2Address, dstL2Address));
1242}
1243
1244binder::Status NetdNativeService::tetherRuleRemoveDownstreamIpv6(
1245 int extIfaceIndex, const std::vector<uint8_t>& ipAddress) {
1246 ENFORCE_NETWORK_STACK_PERMISSIONS();
1247
1248 return asBinderStatus(gCtls->tetherCtrl.removeDownstreamIpv6Rule(extIfaceIndex, ipAddress));
1249}
1250
Lorenzo Colittie4d626e2016-02-02 17:19:04 +09001251} // namespace net
1252} // namespace android