blob: 043dc17cef77277694a7ab0bfc23f235ae554a6b [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>
Erik Kline38e51f12018-09-06 20:14:44 +090022#include <tuple>
Lorenzo Colitti89faa342016-02-26 11:38:47 +090023#include <vector>
24
Chenbo Fengf5663d82018-11-08 16:10:48 -080025#include <android-base/file.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090026#include <android-base/stringprintf.h>
Ben Schwartz4204ecf2017-10-02 12:35:48 -040027#include <android-base/strings.h>
Robin Lee2cf56172016-09-13 18:55:42 +090028#include <cutils/properties.h>
Logan Chien3f461482018-04-23 14:31:32 +080029#include <log/log.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090030#include <utils/Errors.h>
Pierre Imaibeedec32016-04-13 06:44:51 +090031#include <utils/String16.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090032
33#include <binder/IPCThreadState.h>
34#include <binder/IServiceManager.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090035
Xiao Ma33d562a2018-12-16 16:27:38 +090036#include <json/value.h>
Jeongik Cha374ca5b2019-03-22 12:11:25 +090037#include <json/writer.h>
Ben Schwartze7601812017-04-28 16:38:29 -040038#include <openssl/base64.h>
39
Lorenzo Colitti89faa342016-02-26 11:38:47 +090040#include "Controllers.h"
Erik Kline55b06f82016-07-04 09:57:18 +090041#include "InterfaceController.h"
Mike Yu5ae61542018-10-19 22:11:43 +080042#include "NetdConstants.h" // SHA256_SIZE
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090043#include "NetdNativeService.h"
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090044#include "NetdPermissions.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"
Luke Huangb257d612019-03-14 21:19:13 +080051#include "netdutils/DumpWriter.h"
Bernie Innocenti189eb502018-10-01 23:10:18 +090052#include "netid_client.h" // NETID_UNSET
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090053
54using android::base::StringPrintf;
Chenbo Fengf5663d82018-11-08 16:10:48 -080055using android::base::WriteStringToFile;
Luke Huangcaebcbb2018-09-27 20:37:14 +080056using android::net::TetherStatsParcel;
Luke Huang94658ac2018-10-18 19:35:12 +090057using android::net::UidRangeParcel;
Luke Huangb257d612019-03-14 21:19:13 +080058using android::netdutils::DumpWriter;
59using android::netdutils::ScopedIndent;
Luke Huange203a152018-11-23 11:47:28 +080060using android::os::ParcelFileDescriptor;
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090061
62namespace android {
63namespace net {
64
65namespace {
Erik Klineb31fd692018-06-06 20:50:11 +090066const char OPT_SHORT[] = "--short";
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090067
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090068binder::Status checkAnyPermission(const std::vector<const char*>& permissions) {
Luke Huanga38b65c2018-09-26 16:31:03 +080069 pid_t pid = IPCThreadState::self()->getCallingPid();
70 uid_t uid = IPCThreadState::self()->getCallingUid();
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090071
Luke Huanga38b65c2018-09-26 16:31:03 +080072 // If the caller is the system UID, don't check permissions.
73 // Otherwise, if the system server's binder thread pool is full, and all the threads are
74 // blocked on a thread that's waiting for us to complete, we deadlock. http://b/69389492
75 //
76 // From a security perspective, there is currently no difference, because:
77 // 1. The only permissions we check in netd's binder interface are CONNECTIVITY_INTERNAL
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090078 // and NETWORK_STACK, which the system server always has (or MAINLINE_NETWORK_STACK, which
79 // is equivalent to having both CONNECTIVITY_INTERNAL and NETWORK_STACK).
Luke Huanga38b65c2018-09-26 16:31:03 +080080 // 2. AID_SYSTEM always has all permissions. See ActivityManager#checkComponentPermission.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090081 if (uid == AID_SYSTEM) {
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090082 return binder::Status::ok();
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090083 }
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090084
85 for (const char* permission : permissions) {
86 if (checkPermission(String16(permission), pid, uid)) {
87 return binder::Status::ok();
88 }
89 }
90
91 auto err = StringPrintf("UID %d / PID %d does not have any of the following permissions: %s",
92 uid, pid, android::base::Join(permissions, ',').c_str());
93 return binder::Status::fromExceptionCode(binder::Status::EX_SECURITY, err.c_str());
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090094}
95
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090096#define ENFORCE_ANY_PERMISSION(...) \
97 do { \
98 binder::Status status = checkAnyPermission({__VA_ARGS__}); \
99 if (!status.isOk()) { \
100 return status; \
101 } \
102 } while (0)
Robin Lee2cf56172016-09-13 18:55:42 +0900103
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900104#define NETD_LOCKING_RPC(lock, ... /* permissions */) \
105 ENFORCE_ANY_PERMISSION(__VA_ARGS__); \
Bernie Innocentiabf8a342018-08-10 15:17:16 +0900106 std::lock_guard _lock(lock);
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900107
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900108#define NETD_BIG_LOCK_RPC(... /* permissions */) NETD_LOCKING_RPC(gBigNetdLock, __VA_ARGS__)
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900109
Luke Huangf7782042018-08-08 13:13:04 +0800110#define RETURN_BINDER_STATUS_IF_NOT_OK(logEntry, res) \
111 do { \
112 if (!isOk((res))) { \
113 logErrorStatus((logEntry), (res)); \
114 return asBinderStatus((res)); \
115 } \
116 } while (0)
117
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900118#define ENFORCE_INTERNAL_PERMISSIONS() \
119 ENFORCE_ANY_PERMISSION(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK)
120
121#define ENFORCE_NETWORK_STACK_PERMISSIONS() \
122 ENFORCE_ANY_PERMISSION(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK)
123
Luke Huangf7782042018-08-08 13:13:04 +0800124void logErrorStatus(netdutils::LogEntry& logEntry, const netdutils::Status& status) {
125 gLog.log(logEntry.returns(status.code()).withAutomaticDuration());
126}
127
Bernie Innocenti97f388f2018-10-16 19:17:08 +0900128binder::Status asBinderStatus(const netdutils::Status& status) {
129 if (isOk(status)) {
130 return binder::Status::ok();
131 }
132 return binder::Status::fromServiceSpecificError(status.code(), status.msg().c_str());
133}
134
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900135inline binder::Status statusFromErrcode(int ret) {
136 if (ret) {
137 return binder::Status::fromServiceSpecificError(-ret, strerror(-ret));
138 }
139 return binder::Status::ok();
140}
141
Erik Klineb31fd692018-06-06 20:50:11 +0900142bool contains(const Vector<String16>& words, const String16& word) {
143 for (const auto& w : words) {
144 if (w == word) return true;
145 }
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900146
Erik Klineb31fd692018-06-06 20:50:11 +0900147 return false;
148}
149
150} // namespace
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900151
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900152status_t NetdNativeService::start() {
153 IPCThreadState::self()->disableBackgroundScheduling(true);
Erik Klineb31fd692018-06-06 20:50:11 +0900154 const status_t ret = BinderService<NetdNativeService>::publish();
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900155 if (ret != android::OK) {
156 return ret;
157 }
158 sp<ProcessState> ps(ProcessState::self());
159 ps->startThreadPool();
160 ps->giveThreadPoolName();
Xiao Ma33d562a2018-12-16 16:27:38 +0900161
162 // register log callback to BnNetd::logFunc
163 BnNetd::logFunc = [](const Json::Value& logTransaction) {
164 bool hasReturnArgs;
165 std::string output;
166 const Json::Value& inputArgs = logTransaction["input_args"];
167 const Json::Value& returnArgs = logTransaction["_aidl_return"];
168 Json::Value::Members member = inputArgs.getMemberNames();
169
170 hasReturnArgs = !returnArgs.empty();
171 output.append(logTransaction["method_name"].asString().c_str() + std::string("("));
172
173 // input args
Jeongik Cha374ca5b2019-03-22 12:11:25 +0900174 Json::FastWriter fastWriter;
175 fastWriter.omitEndingLineFeed();
Xiao Ma33d562a2018-12-16 16:27:38 +0900176 for (Json::Value::Members::iterator iter = member.begin(); iter != member.end(); ++iter) {
Jeongik Cha374ca5b2019-03-22 12:11:25 +0900177 std::string value = fastWriter.write(inputArgs[(*iter).c_str()]);
Xiao Ma33d562a2018-12-16 16:27:38 +0900178 if (value.empty()) value = std::string("null");
179 output.append(value);
180 if (iter != member.end() - 1) {
181 output.append(", ");
182 }
183 }
184 output.append(std::string(")"));
185 // return args
186 if (hasReturnArgs) {
Jeongik Cha374ca5b2019-03-22 12:11:25 +0900187 output.append(StringPrintf(" -> (%s)", fastWriter.write(returnArgs).c_str()));
Xiao Ma33d562a2018-12-16 16:27:38 +0900188 }
189 // duration time
190 output.append(StringPrintf(" <%sms>", logTransaction["duration_ms"].asString().c_str()));
191 gLog.info("%s", output.c_str());
192 };
193
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900194 return android::OK;
195}
196
Hugo Benichi7b314e12018-01-15 21:54:00 +0900197status_t NetdNativeService::dump(int fd, const Vector<String16> &args) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900198 const binder::Status dump_permission = checkAnyPermission({PERM_DUMP});
Erik Kline2d3a1632016-03-15 16:33:48 +0900199 if (!dump_permission.isOk()) {
200 const String8 msg(dump_permission.toString8());
201 write(fd, msg.string(), msg.size());
202 return PERMISSION_DENIED;
203 }
204
205 // This method does not grab any locks. If individual classes need locking
206 // their dump() methods MUST handle locking appropriately.
Hugo Benichi7b314e12018-01-15 21:54:00 +0900207
Erik Kline2d3a1632016-03-15 16:33:48 +0900208 DumpWriter dw(fd);
Hugo Benichi7b314e12018-01-15 21:54:00 +0900209
210 if (!args.isEmpty() && args[0] == TcpSocketMonitor::DUMP_KEYWORD) {
211 dw.blankline();
212 gCtls->tcpSocketMonitor.dump(dw);
213 dw.blankline();
214 return NO_ERROR;
215 }
216
Chenbo Fengef297172018-03-26 10:53:33 -0700217 if (!args.isEmpty() && args[0] == TrafficController::DUMP_KEYWORD) {
218 dw.blankline();
219 gCtls->trafficCtrl.dump(dw, true);
220 dw.blankline();
221 return NO_ERROR;
222 }
223
Erik Kline85890042018-05-25 19:19:11 +0900224 process::dump(dw);
Erik Kline2d3a1632016-03-15 16:33:48 +0900225 dw.blankline();
226 gCtls->netCtrl.dump(dw);
227 dw.blankline();
228
Chenbo Fengef297172018-03-26 10:53:33 -0700229 gCtls->trafficCtrl.dump(dw, false);
230 dw.blankline();
231
Benedict Wongaf855432018-05-10 17:07:37 -0700232 gCtls->xfrmCtrl.dump(dw);
233 dw.blankline();
234
Erik Klineb31fd692018-06-06 20:50:11 +0900235 {
236 ScopedIndent indentLog(dw);
237 if (contains(args, String16(OPT_SHORT))) {
238 dw.println("Log: <omitted>");
239 } else {
240 dw.println("Log:");
241 ScopedIndent indentLogEntries(dw);
242 gLog.forEachEntry([&dw](const std::string& entry) mutable { dw.println(entry); });
243 }
244 dw.blankline();
245 }
246
Luke Huang528af602018-08-29 19:06:05 +0800247 {
248 ScopedIndent indentLog(dw);
249 if (contains(args, String16(OPT_SHORT))) {
250 dw.println("UnsolicitedLog: <omitted>");
251 } else {
252 dw.println("UnsolicitedLog:");
253 ScopedIndent indentLogEntries(dw);
254 gUnsolicitedLog.forEachEntry(
255 [&dw](const std::string& entry) mutable { dw.println(entry); });
256 }
257 dw.blankline();
258 }
259
Erik Kline2d3a1632016-03-15 16:33:48 +0900260 return NO_ERROR;
261}
262
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900263binder::Status NetdNativeService::isAlive(bool *alive) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900264 NETD_BIG_LOCK_RPC(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900265
266 *alive = true;
Erik Klineb31fd692018-06-06 20:50:11 +0900267
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900268 return binder::Status::ok();
269}
270
Erik Klinef52d4522018-03-14 15:01:46 +0900271binder::Status NetdNativeService::firewallReplaceUidChain(const std::string& chainName,
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900272 bool isWhitelist, const std::vector<int32_t>& uids, bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900273 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_CONNECTIVITY_INTERNAL,
274 PERM_MAINLINE_NETWORK_STACK);
Erik Klinef52d4522018-03-14 15:01:46 +0900275 int err = gCtls->firewallCtrl.replaceUidChain(chainName, isWhitelist, uids);
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900276 *ret = (err == 0);
277 return binder::Status::ok();
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900278}
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900279
280binder::Status NetdNativeService::bandwidthEnableDataSaver(bool enable, bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900281 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_CONNECTIVITY_INTERNAL,
282 PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900283 int err = gCtls->bandwidthCtrl.enableDataSaver(enable);
284 *ret = (err == 0);
285 return binder::Status::ok();
286}
287
Luke Huang531f5d32018-08-03 15:19:05 +0800288binder::Status NetdNativeService::bandwidthSetInterfaceQuota(const std::string& ifName,
289 int64_t bytes) {
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.setInterfaceQuota(ifName, bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800292 return statusFromErrcode(res);
293}
294
295binder::Status NetdNativeService::bandwidthRemoveInterfaceQuota(const std::string& ifName) {
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.removeInterfaceQuota(ifName);
Luke Huang531f5d32018-08-03 15:19:05 +0800298 return statusFromErrcode(res);
299}
300
301binder::Status NetdNativeService::bandwidthSetInterfaceAlert(const std::string& ifName,
302 int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900303 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800304 int res = gCtls->bandwidthCtrl.setInterfaceAlert(ifName, bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800305 return statusFromErrcode(res);
306}
307
308binder::Status NetdNativeService::bandwidthRemoveInterfaceAlert(const std::string& ifName) {
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 int res = gCtls->bandwidthCtrl.removeInterfaceAlert(ifName);
Luke Huang531f5d32018-08-03 15:19:05 +0800311 return statusFromErrcode(res);
312}
313
314binder::Status NetdNativeService::bandwidthSetGlobalAlert(int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900315 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800316 int res = gCtls->bandwidthCtrl.setGlobalAlert(bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800317 return statusFromErrcode(res);
318}
319
320binder::Status NetdNativeService::bandwidthAddNaughtyApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900321 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800322 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
323 int res = gCtls->bandwidthCtrl.addNaughtyApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800324 return statusFromErrcode(res);
325}
326
327binder::Status NetdNativeService::bandwidthRemoveNaughtyApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900328 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800329 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
330 int res = gCtls->bandwidthCtrl.removeNaughtyApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800331 return statusFromErrcode(res);
332}
333
334binder::Status NetdNativeService::bandwidthAddNiceApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900335 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800336 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
337 int res = gCtls->bandwidthCtrl.addNiceApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800338 return statusFromErrcode(res);
339}
340
341binder::Status NetdNativeService::bandwidthRemoveNiceApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900342 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800343 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
344 int res = gCtls->bandwidthCtrl.removeNiceApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800345 return statusFromErrcode(res);
346}
347
Luke Huangb670d162018-08-23 20:01:13 +0800348binder::Status NetdNativeService::networkCreatePhysical(int32_t netId, int32_t permission) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900349 ENFORCE_INTERNAL_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +0800350 int ret = gCtls->netCtrl.createPhysicalNetwork(netId, convertPermission(permission));
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900351 return statusFromErrcode(ret);
352}
353
cken67cd14c2018-12-05 17:26:59 +0900354binder::Status NetdNativeService::networkCreateVpn(int32_t netId, bool secure) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900355 ENFORCE_NETWORK_STACK_PERMISSIONS();
cken67cd14c2018-12-05 17:26:59 +0900356 int ret = gCtls->netCtrl.createVirtualNetwork(netId, secure);
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900357 return statusFromErrcode(ret);
358}
359
360binder::Status NetdNativeService::networkDestroy(int32_t netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900361 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klinec8b6a9c2018-01-15 17:06:48 +0900362 // Both of these functions manage their own locking internally.
Mike Yu3e348b62018-12-24 17:05:02 +0800363 // Clear DNS servers before deleting the cache to avoid the cache being created again.
Erik Klinec8b6a9c2018-01-15 17:06:48 +0900364 gCtls->resolverCtrl.clearDnsServers(netId);
Mike Yu4fe1b9c2019-01-29 17:50:19 +0800365 const int ret = gCtls->netCtrl.destroyNetwork(netId);
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900366 return statusFromErrcode(ret);
367}
368
369binder::Status NetdNativeService::networkAddInterface(int32_t netId, const std::string& iface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900370 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900371 int ret = gCtls->netCtrl.addInterfaceToNetwork(netId, iface.c_str());
372 return statusFromErrcode(ret);
373}
374
375binder::Status NetdNativeService::networkRemoveInterface(int32_t netId, const std::string& iface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900376 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900377 int ret = gCtls->netCtrl.removeInterfaceFromNetwork(netId, iface.c_str());
378 return statusFromErrcode(ret);
379}
380
Luke Huang94658ac2018-10-18 19:35:12 +0900381binder::Status NetdNativeService::networkAddUidRanges(
382 int32_t netId, const std::vector<UidRangeParcel>& uidRangeArray) {
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900383 // NetworkController::addUsersToNetwork is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900384 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900385 int ret = gCtls->netCtrl.addUsersToNetwork(netId, UidRanges(uidRangeArray));
386 return statusFromErrcode(ret);
387}
388
Luke Huang94658ac2018-10-18 19:35:12 +0900389binder::Status NetdNativeService::networkRemoveUidRanges(
390 int32_t netId, const std::vector<UidRangeParcel>& uidRangeArray) {
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900391 // NetworkController::removeUsersFromNetwork is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900392 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900393 int ret = gCtls->netCtrl.removeUsersFromNetwork(netId, UidRanges(uidRangeArray));
394 return statusFromErrcode(ret);
395}
396
Luke Huang94658ac2018-10-18 19:35:12 +0900397binder::Status NetdNativeService::networkRejectNonSecureVpn(
398 bool add, const std::vector<UidRangeParcel>& uidRangeArray) {
Robin Leeb8087362016-03-30 18:43:08 +0100399 // TODO: elsewhere RouteController is only used from the tethering and network controllers, so
400 // it should be possible to use the same lock as NetworkController. However, every call through
401 // the CommandListener "network" command will need to hold this lock too, not just the ones that
402 // read/modify network internal state (that is sufficient for ::dump() because it doesn't
403 // look at routes, but it's not enough here).
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900404 NETD_BIG_LOCK_RPC(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900405 UidRanges uidRanges(uidRangeArray);
Robin Leeb8087362016-03-30 18:43:08 +0100406
407 int err;
408 if (add) {
409 err = RouteController::addUsersToRejectNonSecureNetworkRule(uidRanges);
410 } else {
411 err = RouteController::removeUsersFromRejectNonSecureNetworkRule(uidRanges);
412 }
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900413 return statusFromErrcode(err);
Robin Leeb8087362016-03-30 18:43:08 +0100414}
415
Luke Huang94658ac2018-10-18 19:35:12 +0900416binder::Status NetdNativeService::socketDestroy(const std::vector<UidRangeParcel>& uids,
417 const std::vector<int32_t>& skipUids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900418 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900419
420 SockDiag sd;
421 if (!sd.open()) {
422 return binder::Status::fromServiceSpecificError(EIO,
423 String8("Could not open SOCK_DIAG socket"));
424 }
425
426 UidRanges uidRanges(uids);
Lorenzo Colittie5c3c992016-07-26 17:53:50 +0900427 int err = sd.destroySockets(uidRanges, std::set<uid_t>(skipUids.begin(), skipUids.end()),
428 true /* excludeLoopback */);
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900429 if (err) {
430 return binder::Status::fromServiceSpecificError(-err,
431 String8::format("destroySockets: %s", strerror(-err)));
432 }
Pierre Imaibeedec32016-04-13 06:44:51 +0900433 return binder::Status::ok();
434}
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900435
Ben Schwartz4204ecf2017-10-02 12:35:48 -0400436// Parse a base64 encoded string into a vector of bytes.
437// On failure, return an empty vector.
438static std::vector<uint8_t> parseBase64(const std::string& input) {
439 std::vector<uint8_t> decoded;
440 size_t out_len;
441 if (EVP_DecodedLength(&out_len, input.size()) != 1) {
442 return decoded;
443 }
444 // out_len is now an upper bound on the output length.
445 decoded.resize(out_len);
446 if (EVP_DecodeBase64(decoded.data(), &out_len, decoded.size(),
447 reinterpret_cast<const uint8_t*>(input.data()), input.size()) == 1) {
448 // Possibly shrink the vector if the actual output was smaller than the bound.
449 decoded.resize(out_len);
450 } else {
451 decoded.clear();
452 }
453 if (out_len != SHA256_SIZE) {
454 decoded.clear();
455 }
456 return decoded;
457}
458
Pierre Imaibeedec32016-04-13 06:44:51 +0900459binder::Status NetdNativeService::setResolverConfiguration(int32_t netId,
460 const std::vector<std::string>& servers, const std::vector<std::string>& domains,
Erik Klinea1476fb2018-03-04 21:01:56 +0900461 const std::vector<int32_t>& params, const std::string& tlsName,
462 const std::vector<std::string>& tlsServers,
Ben Schwartz4204ecf2017-10-02 12:35:48 -0400463 const std::vector<std::string>& tlsFingerprints) {
Pierre Imaibeedec32016-04-13 06:44:51 +0900464 // This function intentionally does not lock within Netd, as Bionic is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900465 ENFORCE_INTERNAL_PERMISSIONS();
Pierre Imaibeedec32016-04-13 06:44:51 +0900466
Ben Schwartz4204ecf2017-10-02 12:35:48 -0400467 std::set<std::vector<uint8_t>> decoded_fingerprints;
468 for (const std::string& fingerprint : tlsFingerprints) {
469 std::vector<uint8_t> decoded = parseBase64(fingerprint);
470 if (decoded.empty()) {
471 return binder::Status::fromServiceSpecificError(EINVAL,
472 String8::format("ResolverController error: bad fingerprint"));
473 }
474 decoded_fingerprints.emplace(decoded);
475 }
476
477 int err = gCtls->resolverCtrl.setResolverConfiguration(netId, servers, domains, params,
Erik Klinea1476fb2018-03-04 21:01:56 +0900478 tlsName, tlsServers, decoded_fingerprints);
Pierre Imaibeedec32016-04-13 06:44:51 +0900479 if (err != 0) {
480 return binder::Status::fromServiceSpecificError(-err,
481 String8::format("ResolverController error: %s", strerror(-err)));
482 }
483 return binder::Status::ok();
484}
485
Ken Chen2a429352018-12-22 21:46:55 +0800486binder::Status NetdNativeService::getResolverInfo(
487 int32_t netId, std::vector<std::string>* servers, std::vector<std::string>* domains,
488 std::vector<std::string>* tlsServers, std::vector<int32_t>* params,
489 std::vector<int32_t>* stats, std::vector<int32_t>* wait_for_pending_req_timeout_count) {
Pierre Imaibeedec32016-04-13 06:44:51 +0900490 // This function intentionally does not lock within Netd, as Bionic is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900491 ENFORCE_NETWORK_STACK_PERMISSIONS();
Pierre Imaibeedec32016-04-13 06:44:51 +0900492
Ken Chen2a429352018-12-22 21:46:55 +0800493 int err = gCtls->resolverCtrl.getResolverInfo(netId, servers, domains, tlsServers, params,
494 stats, wait_for_pending_req_timeout_count);
Pierre Imaibeedec32016-04-13 06:44:51 +0900495 if (err != 0) {
496 return binder::Status::fromServiceSpecificError(-err,
497 String8::format("ResolverController error: %s", strerror(-err)));
498 }
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900499 return binder::Status::ok();
500}
501
Lorenzo Colittib5d45872019-02-18 10:59:29 +0900502binder::Status NetdNativeService::resolverStartPrefix64Discovery(int32_t netId) {
503 // Locking happens in Dns64Configuration.
504 ENFORCE_NETWORK_STACK_PERMISSIONS();
505 gCtls->resolverCtrl.startPrefix64Discovery(netId);
506 return binder::Status::ok();
507}
508
509binder::Status NetdNativeService::resolverStopPrefix64Discovery(int32_t netId) {
510 // Locking happens in Dns64Configuration.
511 ENFORCE_NETWORK_STACK_PERMISSIONS();
512 gCtls->resolverCtrl.stopPrefix64Discovery(netId);
513 return binder::Status::ok();
514}
515
Erik Klinef48e4dd2016-07-18 04:02:07 +0900516binder::Status NetdNativeService::tetherApplyDnsInterfaces(bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900517 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Erik Klinef48e4dd2016-07-18 04:02:07 +0900518 *ret = gCtls->tetherCtrl.applyDnsInterfaces();
519 return binder::Status::ok();
520}
521
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900522namespace {
523
Luke Huangcaebcbb2018-09-27 20:37:14 +0800524void tetherAddStatsByInterface(TetherController::TetherStats* tetherStatsParcel,
525 const TetherController::TetherStats& tetherStats) {
526 if (tetherStatsParcel->extIface == tetherStats.extIface) {
527 tetherStatsParcel->rxBytes += tetherStats.rxBytes;
528 tetherStatsParcel->rxPackets += tetherStats.rxPackets;
529 tetherStatsParcel->txBytes += tetherStats.txBytes;
530 tetherStatsParcel->txPackets += tetherStats.txPackets;
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900531 }
Luke Huangcaebcbb2018-09-27 20:37:14 +0800532}
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900533
Luke Huangcaebcbb2018-09-27 20:37:14 +0800534TetherStatsParcel toTetherStatsParcel(const TetherController::TetherStats& stats) {
535 TetherStatsParcel result;
536 result.iface = stats.extIface;
537 result.rxBytes = stats.rxBytes;
538 result.rxPackets = stats.rxPackets;
539 result.txBytes = stats.txBytes;
540 result.txPackets = stats.txPackets;
541 return result;
542}
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900543
Luke Huangcaebcbb2018-09-27 20:37:14 +0800544void setTetherStatsParcelVecByInterface(std::vector<TetherStatsParcel>* tetherStatsVec,
545 const TetherController::TetherStatsList& statsList) {
546 std::map<std::string, TetherController::TetherStats> statsMap;
547 for (const auto& stats : statsList) {
548 auto iter = statsMap.find(stats.extIface);
549 if (iter != statsMap.end()) {
550 tetherAddStatsByInterface(&(iter->second), stats);
551 } else {
552 statsMap.insert(
553 std::pair<std::string, TetherController::TetherStats>(stats.extIface, stats));
554 }
555 }
556 for (auto iter = statsMap.begin(); iter != statsMap.end(); iter++) {
557 tetherStatsVec->push_back(toTetherStatsParcel(iter->second));
558 }
559}
560
561std::vector<std::string> tetherStatsParcelVecToStringVec(std::vector<TetherStatsParcel>* tVec) {
562 std::vector<std::string> result;
563 for (const auto& t : *tVec) {
564 result.push_back(StringPrintf("%s:%" PRId64 ",%" PRId64 ",%" PRId64 ",%" PRId64,
565 t.iface.c_str(), t.rxBytes, t.rxPackets, t.txBytes,
566 t.txPackets));
567 }
568 return result;
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900569}
570
571} // namespace
572
Luke Huangcaebcbb2018-09-27 20:37:14 +0800573binder::Status NetdNativeService::tetherGetStats(
574 std::vector<TetherStatsParcel>* tetherStatsParcelVec) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900575 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti5192bf72017-09-04 13:30:59 +0900576 const auto& statsList = gCtls->tetherCtrl.getTetherStats();
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900577 if (!isOk(statsList)) {
Nathan Harold28ccfef2018-03-16 19:02:47 -0700578 return asBinderStatus(statsList);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900579 }
Luke Huangcaebcbb2018-09-27 20:37:14 +0800580 setTetherStatsParcelVecByInterface(tetherStatsParcelVec, statsList.value());
581 auto statsResults = tetherStatsParcelVecToStringVec(tetherStatsParcelVec);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900582 return binder::Status::ok();
583}
584
Erik Kline53c20882016-08-02 15:22:53 +0900585binder::Status NetdNativeService::interfaceAddAddress(const std::string &ifName,
586 const std::string &addrString, int prefixLength) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900587 ENFORCE_INTERNAL_PERMISSIONS();
Erik Kline53c20882016-08-02 15:22:53 +0900588 const int err = InterfaceController::addAddress(
589 ifName.c_str(), addrString.c_str(), prefixLength);
590 if (err != 0) {
591 return binder::Status::fromServiceSpecificError(-err,
592 String8::format("InterfaceController error: %s", strerror(-err)));
593 }
594 return binder::Status::ok();
595}
596
597binder::Status NetdNativeService::interfaceDelAddress(const std::string &ifName,
598 const std::string &addrString, int prefixLength) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900599 ENFORCE_INTERNAL_PERMISSIONS();
Erik Kline53c20882016-08-02 15:22:53 +0900600 const int err = InterfaceController::delAddress(
601 ifName.c_str(), addrString.c_str(), prefixLength);
602 if (err != 0) {
603 return binder::Status::fromServiceSpecificError(-err,
604 String8::format("InterfaceController error: %s", strerror(-err)));
605 }
606 return binder::Status::ok();
607}
608
Erik Kline38e51f12018-09-06 20:14:44 +0900609namespace {
Erik Kline55b06f82016-07-04 09:57:18 +0900610
Erik Kline38e51f12018-09-06 20:14:44 +0900611std::tuple<binder::Status, const char*, const char*> getPathComponents(int32_t ipversion,
612 int32_t category) {
613 const char* ipversionStr = nullptr;
614 switch (ipversion) {
Erik Kline55b06f82016-07-04 09:57:18 +0900615 case INetd::IPV4:
Erik Kline38e51f12018-09-06 20:14:44 +0900616 ipversionStr = "ipv4";
Erik Kline55b06f82016-07-04 09:57:18 +0900617 break;
618 case INetd::IPV6:
Erik Kline38e51f12018-09-06 20:14:44 +0900619 ipversionStr = "ipv6";
Erik Kline55b06f82016-07-04 09:57:18 +0900620 break;
621 default:
Erik Kline38e51f12018-09-06 20:14:44 +0900622 return {binder::Status::fromServiceSpecificError(EAFNOSUPPORT, "Bad IP version"),
623 nullptr, nullptr};
Erik Kline55b06f82016-07-04 09:57:18 +0900624 }
625
Erik Kline38e51f12018-09-06 20:14:44 +0900626 const char* whichStr = nullptr;
627 switch (category) {
Erik Kline55b06f82016-07-04 09:57:18 +0900628 case INetd::CONF:
629 whichStr = "conf";
630 break;
631 case INetd::NEIGH:
632 whichStr = "neigh";
633 break;
634 default:
Erik Kline38e51f12018-09-06 20:14:44 +0900635 return {binder::Status::fromServiceSpecificError(EINVAL, "Bad category"), nullptr,
636 nullptr};
Erik Kline55b06f82016-07-04 09:57:18 +0900637 }
638
Erik Kline38e51f12018-09-06 20:14:44 +0900639 return {binder::Status::ok(), ipversionStr, whichStr};
640}
641
642} // namespace
643
644binder::Status NetdNativeService::getProcSysNet(int32_t ipversion, int32_t which,
645 const std::string& ifname,
646 const std::string& parameter, std::string* value) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900647 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline38e51f12018-09-06 20:14:44 +0900648 const auto pathParts = getPathComponents(ipversion, which);
649 const auto& pathStatus = std::get<0>(pathParts);
650 if (!pathStatus.isOk()) {
Erik Kline38e51f12018-09-06 20:14:44 +0900651 return pathStatus;
Erik Kline55b06f82016-07-04 09:57:18 +0900652 }
Erik Kline38e51f12018-09-06 20:14:44 +0900653
654 const int err = InterfaceController::getParameter(std::get<1>(pathParts),
655 std::get<2>(pathParts), ifname.c_str(),
656 parameter.c_str(), value);
Erik Kline38e51f12018-09-06 20:14:44 +0900657 return statusFromErrcode(err);
658}
659
660binder::Status NetdNativeService::setProcSysNet(int32_t ipversion, int32_t which,
661 const std::string& ifname,
662 const std::string& parameter,
663 const std::string& value) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900664 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline38e51f12018-09-06 20:14:44 +0900665 const auto pathParts = getPathComponents(ipversion, which);
666 const auto& pathStatus = std::get<0>(pathParts);
667 if (!pathStatus.isOk()) {
Erik Kline38e51f12018-09-06 20:14:44 +0900668 return pathStatus;
669 }
670
671 const int err = InterfaceController::setParameter(std::get<1>(pathParts),
672 std::get<2>(pathParts), ifname.c_str(),
673 parameter.c_str(), value.c_str());
Erik Kline38e51f12018-09-06 20:14:44 +0900674 return statusFromErrcode(err);
Erik Kline55b06f82016-07-04 09:57:18 +0900675}
676
Luke Huange203a152018-11-23 11:47:28 +0800677binder::Status NetdNativeService::ipSecSetEncapSocketOwner(const ParcelFileDescriptor& socket,
678 int newUid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900679 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900680 gLog.log("ipSecSetEncapSocketOwner()");
Benedict Wongb2daefb2017-12-06 22:05:46 -0800681
682 uid_t callerUid = IPCThreadState::self()->getCallingUid();
Luke Huange203a152018-11-23 11:47:28 +0800683 return asBinderStatus(
684 gCtls->xfrmCtrl.ipSecSetEncapSocketOwner(socket.get(), newUid, callerUid));
Benedict Wongb2daefb2017-12-06 22:05:46 -0800685}
686
Nathan Harold1a371532017-01-30 12:30:48 -0800687binder::Status NetdNativeService::ipSecAllocateSpi(
688 int32_t transformId,
Nathan Haroldda54f122018-01-09 16:42:57 -0800689 const std::string& sourceAddress,
690 const std::string& destinationAddress,
Nathan Harold1a371532017-01-30 12:30:48 -0800691 int32_t inSpi,
692 int32_t* outSpi) {
693 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900694 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900695 gLog.log("ipSecAllocateSpi()");
ludi6e8eccd2017-08-14 14:40:37 -0700696 return asBinderStatus(gCtls->xfrmCtrl.ipSecAllocateSpi(
Nathan Harold1a371532017-01-30 12:30:48 -0800697 transformId,
Nathan Haroldda54f122018-01-09 16:42:57 -0800698 sourceAddress,
699 destinationAddress,
Nathan Harold1a371532017-01-30 12:30:48 -0800700 inSpi,
701 outSpi));
702}
703
704binder::Status NetdNativeService::ipSecAddSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700705 int32_t transformId, int32_t mode, const std::string& sourceAddress,
706 const std::string& destinationAddress, int32_t underlyingNetId, int32_t spi,
707 int32_t markValue, int32_t markMask, const std::string& authAlgo,
708 const std::vector<uint8_t>& authKey, int32_t authTruncBits, const std::string& cryptAlgo,
709 const std::vector<uint8_t>& cryptKey, int32_t cryptTruncBits, const std::string& aeadAlgo,
710 const std::vector<uint8_t>& aeadKey, int32_t aeadIcvBits, int32_t encapType,
711 int32_t encapLocalPort, int32_t encapRemotePort, int32_t interfaceId) {
Nathan Harold1a371532017-01-30 12:30:48 -0800712 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900713 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900714 gLog.log("ipSecAddSecurityAssociation()");
ludi6e8eccd2017-08-14 14:40:37 -0700715 return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityAssociation(
Benedict Wongad600cb2018-05-14 17:22:35 -0700716 transformId, mode, sourceAddress, destinationAddress, underlyingNetId, spi, markValue,
717 markMask, authAlgo, authKey, authTruncBits, cryptAlgo, cryptKey, cryptTruncBits,
Benedict Wonga450e722018-05-07 10:29:02 -0700718 aeadAlgo, aeadKey, aeadIcvBits, encapType, encapLocalPort, encapRemotePort,
719 interfaceId));
Nathan Harold1a371532017-01-30 12:30:48 -0800720}
721
722binder::Status NetdNativeService::ipSecDeleteSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700723 int32_t transformId, const std::string& sourceAddress,
724 const std::string& destinationAddress, int32_t spi, int32_t markValue, int32_t markMask,
725 int32_t interfaceId) {
Nathan Harold1a371532017-01-30 12:30:48 -0800726 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900727 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900728 gLog.log("ipSecDeleteSecurityAssociation()");
ludi6e8eccd2017-08-14 14:40:37 -0700729 return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700730 transformId, sourceAddress, destinationAddress, spi, markValue, markMask, interfaceId));
Nathan Harold1a371532017-01-30 12:30:48 -0800731}
732
733binder::Status NetdNativeService::ipSecApplyTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800734 const ParcelFileDescriptor& socket, int32_t transformId, int32_t direction,
735 const std::string& sourceAddress, const std::string& destinationAddress, int32_t spi) {
Nathan Harold1a371532017-01-30 12:30:48 -0800736 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900737 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900738 gLog.log("ipSecApplyTransportModeTransform()");
ludi6e8eccd2017-08-14 14:40:37 -0700739 return asBinderStatus(gCtls->xfrmCtrl.ipSecApplyTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800740 socket.get(), transformId, direction, sourceAddress, destinationAddress, spi));
Nathan Harold1a371532017-01-30 12:30:48 -0800741}
742
743binder::Status NetdNativeService::ipSecRemoveTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800744 const ParcelFileDescriptor& socket) {
Nathan Harold1a371532017-01-30 12:30:48 -0800745 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900746 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900747 gLog.log("ipSecRemoveTransportModeTransform()");
Luke Huange203a152018-11-23 11:47:28 +0800748 return asBinderStatus(gCtls->xfrmCtrl.ipSecRemoveTransportModeTransform(socket.get()));
Nathan Harold1a371532017-01-30 12:30:48 -0800749}
750
Benedict Wonga04ffa72018-05-09 21:42:42 -0700751binder::Status NetdNativeService::ipSecAddSecurityPolicy(int32_t transformId, int32_t selAddrFamily,
752 int32_t direction,
Benedict Wongad600cb2018-05-14 17:22:35 -0700753 const std::string& tmplSrcAddress,
754 const std::string& tmplDstAddress,
755 int32_t spi, int32_t markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700756 int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800757 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900758 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900759 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800760 return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityPolicy(
Benedict Wonga04ffa72018-05-09 21:42:42 -0700761 transformId, selAddrFamily, direction, tmplSrcAddress, tmplDstAddress, spi, markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700762 markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800763}
764
Benedict Wonga450e722018-05-07 10:29:02 -0700765binder::Status NetdNativeService::ipSecUpdateSecurityPolicy(
766 int32_t transformId, int32_t selAddrFamily, int32_t direction,
767 const std::string& tmplSrcAddress, const std::string& tmplDstAddress, int32_t spi,
768 int32_t markValue, int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800769 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900770 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900771 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800772 return asBinderStatus(gCtls->xfrmCtrl.ipSecUpdateSecurityPolicy(
Benedict Wonga04ffa72018-05-09 21:42:42 -0700773 transformId, selAddrFamily, direction, tmplSrcAddress, tmplDstAddress, spi, markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700774 markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800775}
776
Benedict Wonga04ffa72018-05-09 21:42:42 -0700777binder::Status NetdNativeService::ipSecDeleteSecurityPolicy(int32_t transformId,
778 int32_t selAddrFamily,
779 int32_t direction, int32_t markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700780 int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800781 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900782 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900783 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800784 return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityPolicy(
Benedict Wonga450e722018-05-07 10:29:02 -0700785 transformId, selAddrFamily, direction, markValue, markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800786}
787
Benedict Wong319f17e2018-05-15 17:06:44 -0700788binder::Status NetdNativeService::ipSecAddTunnelInterface(const std::string& deviceName,
789 const std::string& localAddress,
790 const std::string& remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700791 int32_t iKey, int32_t oKey,
792 int32_t interfaceId) {
manojboopathi8707f232018-01-02 14:45:47 -0800793 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900794 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700795 netdutils::Status result = gCtls->xfrmCtrl.ipSecAddTunnelInterface(
Benedict Wonga450e722018-05-07 10:29:02 -0700796 deviceName, localAddress, remoteAddress, iKey, oKey, interfaceId, false);
Benedict Wong319f17e2018-05-15 17:06:44 -0700797 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800798}
799
Benedict Wong319f17e2018-05-15 17:06:44 -0700800binder::Status NetdNativeService::ipSecUpdateTunnelInterface(const std::string& deviceName,
801 const std::string& localAddress,
802 const std::string& remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700803 int32_t iKey, int32_t oKey,
804 int32_t interfaceId) {
manojboopathi8707f232018-01-02 14:45:47 -0800805 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900806 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700807 netdutils::Status result = gCtls->xfrmCtrl.ipSecAddTunnelInterface(
Benedict Wonga450e722018-05-07 10:29:02 -0700808 deviceName, localAddress, remoteAddress, iKey, oKey, interfaceId, true);
Benedict Wong319f17e2018-05-15 17:06:44 -0700809 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800810}
811
Benedict Wong319f17e2018-05-15 17:06:44 -0700812binder::Status NetdNativeService::ipSecRemoveTunnelInterface(const std::string& deviceName) {
manojboopathi8707f232018-01-02 14:45:47 -0800813 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900814 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700815 netdutils::Status result = gCtls->xfrmCtrl.ipSecRemoveTunnelInterface(deviceName);
Benedict Wong319f17e2018-05-15 17:06:44 -0700816 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800817}
818
Joel Scherpelzde937962017-06-01 13:20:21 +0900819binder::Status NetdNativeService::setIPv6AddrGenMode(const std::string& ifName,
820 int32_t mode) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900821 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700822 return asBinderStatus(InterfaceController::setIPv6AddrGenMode(ifName, mode));
Joel Scherpelzde937962017-06-01 13:20:21 +0900823}
824
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900825binder::Status NetdNativeService::wakeupAddInterface(const std::string& ifName,
826 const std::string& prefix, int32_t mark,
827 int32_t mask) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900828 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700829 return asBinderStatus(gCtls->wakeupCtrl.addInterface(ifName, prefix, mark, mask));
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900830}
831
832binder::Status NetdNativeService::wakeupDelInterface(const std::string& ifName,
833 const std::string& prefix, int32_t mark,
834 int32_t mask) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900835 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700836 return asBinderStatus(gCtls->wakeupCtrl.delInterface(ifName, prefix, mark, mask));
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900837}
838
Luke Huang0051a622018-07-23 20:30:16 +0800839binder::Status NetdNativeService::idletimerAddInterface(const std::string& ifName, int32_t timeout,
840 const std::string& classLabel) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900841 NETD_LOCKING_RPC(gCtls->idletimerCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang0051a622018-07-23 20:30:16 +0800842 int res =
843 gCtls->idletimerCtrl.addInterfaceIdletimer(ifName.c_str(), timeout, classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +0800844 return statusFromErrcode(res);
845}
846
847binder::Status NetdNativeService::idletimerRemoveInterface(const std::string& ifName,
848 int32_t timeout,
849 const std::string& classLabel) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900850 NETD_LOCKING_RPC(gCtls->idletimerCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang0051a622018-07-23 20:30:16 +0800851 int res = gCtls->idletimerCtrl.removeInterfaceIdletimer(ifName.c_str(), timeout,
852 classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +0800853 return statusFromErrcode(res);
854}
Luke Huanga67dd562018-07-17 19:58:25 +0800855
856binder::Status NetdNativeService::strictUidCleartextPenalty(int32_t uid, int32_t policyPenalty) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900857 NETD_LOCKING_RPC(gCtls->strictCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huanga67dd562018-07-17 19:58:25 +0800858 StrictPenalty penalty;
859 switch (policyPenalty) {
860 case INetd::PENALTY_POLICY_REJECT:
861 penalty = REJECT;
862 break;
863 case INetd::PENALTY_POLICY_LOG:
864 penalty = LOG;
865 break;
866 case INetd::PENALTY_POLICY_ACCEPT:
867 penalty = ACCEPT;
868 break;
869 default:
870 return statusFromErrcode(-EINVAL);
871 break;
872 }
873 int res = gCtls->strictCtrl.setUidCleartextPenalty((uid_t) uid, penalty);
Luke Huanga67dd562018-07-17 19:58:25 +0800874 return statusFromErrcode(res);
875}
Luke Huange64fa382018-07-24 16:38:22 +0800876
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +0900877binder::Status NetdNativeService::clatdStart(const std::string& ifName,
878 const std::string& nat64Prefix, std::string* v6Addr) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900879 NETD_LOCKING_RPC(gCtls->clatdCtrl.mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +0900880 int res = gCtls->clatdCtrl.startClatd(ifName.c_str(), nat64Prefix, v6Addr);
Luke Huang6d301232018-08-01 14:05:18 +0800881 return statusFromErrcode(res);
882}
883
884binder::Status NetdNativeService::clatdStop(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900885 NETD_LOCKING_RPC(gCtls->clatdCtrl.mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang6d301232018-08-01 14:05:18 +0800886 int res = gCtls->clatdCtrl.stopClatd(ifName.c_str());
Luke Huang6d301232018-08-01 14:05:18 +0800887 return statusFromErrcode(res);
888}
Luke Huanga67dd562018-07-17 19:58:25 +0800889
Luke Huang457d4702018-08-16 15:39:15 +0800890binder::Status NetdNativeService::ipfwdEnabled(bool* status) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900891 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang728cf4c2019-03-14 19:43:02 +0800892 *status = (gCtls->tetherCtrl.getIpfwdRequesterList().size() > 0) ? true : false;
893 return binder::Status::ok();
894}
895
896binder::Status NetdNativeService::ipfwdGetRequesterList(std::vector<std::string>* requesterList) {
897 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
898 for (const auto& requester : gCtls->tetherCtrl.getIpfwdRequesterList()) {
899 requesterList->push_back(requester);
900 }
Luke Huang457d4702018-08-16 15:39:15 +0800901 return binder::Status::ok();
902}
903
904binder::Status NetdNativeService::ipfwdEnableForwarding(const std::string& requester) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900905 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang457d4702018-08-16 15:39:15 +0800906 int res = (gCtls->tetherCtrl.enableForwarding(requester.c_str())) ? 0 : -EREMOTEIO;
Luke Huang457d4702018-08-16 15:39:15 +0800907 return statusFromErrcode(res);
908}
909
910binder::Status NetdNativeService::ipfwdDisableForwarding(const std::string& requester) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900911 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang457d4702018-08-16 15:39:15 +0800912 int res = (gCtls->tetherCtrl.disableForwarding(requester.c_str())) ? 0 : -EREMOTEIO;
Luke Huang457d4702018-08-16 15:39:15 +0800913 return statusFromErrcode(res);
914}
915
916binder::Status NetdNativeService::ipfwdAddInterfaceForward(const std::string& fromIface,
917 const std::string& toIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900918 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang457d4702018-08-16 15:39:15 +0800919 int res = RouteController::enableTethering(fromIface.c_str(), toIface.c_str());
Luke Huang457d4702018-08-16 15:39:15 +0800920 return statusFromErrcode(res);
921}
922
923binder::Status NetdNativeService::ipfwdRemoveInterfaceForward(const std::string& fromIface,
924 const std::string& toIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900925 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang457d4702018-08-16 15:39:15 +0800926 int res = RouteController::disableTethering(fromIface.c_str(), toIface.c_str());
Luke Huang457d4702018-08-16 15:39:15 +0800927 return statusFromErrcode(res);
928}
929
Luke Huangf7782042018-08-08 13:13:04 +0800930namespace {
931std::string addSquareBrackets(const std::string& s) {
932 return "[" + s + "]";
933}
934
935std::string addCurlyBrackets(const std::string& s) {
936 return "{" + s + "}";
937}
938
939} // namespace
Xiao Ma33d562a2018-12-16 16:27:38 +0900940
Luke Huangf7782042018-08-08 13:13:04 +0800941binder::Status NetdNativeService::interfaceGetList(std::vector<std::string>* interfaceListResult) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900942 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800943 auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__);
944
945 const auto& ifaceList = InterfaceController::getIfaceNames();
946 RETURN_BINDER_STATUS_IF_NOT_OK(entry, ifaceList);
947
948 interfaceListResult->clear();
949 interfaceListResult->reserve(ifaceList.value().size());
950 interfaceListResult->insert(end(*interfaceListResult), begin(ifaceList.value()),
951 end(ifaceList.value()));
952
953 gLog.log(entry.returns(addSquareBrackets(base::Join(*interfaceListResult, ", ")))
954 .withAutomaticDuration());
955 return binder::Status::ok();
956}
957
958std::string interfaceConfigurationParcelToString(const InterfaceConfigurationParcel& cfg) {
959 std::vector<std::string> result{cfg.ifName, cfg.hwAddr, cfg.ipv4Addr,
960 std::to_string(cfg.prefixLength)};
961 result.insert(end(result), begin(cfg.flags), end(cfg.flags));
962 return addCurlyBrackets(base::Join(result, ", "));
963}
964
965binder::Status NetdNativeService::interfaceGetCfg(
966 const std::string& ifName, InterfaceConfigurationParcel* interfaceGetCfgResult) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900967 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800968 auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__).arg(ifName);
969
970 const auto& cfgRes = InterfaceController::getCfg(ifName);
971 RETURN_BINDER_STATUS_IF_NOT_OK(entry, cfgRes);
972
973 *interfaceGetCfgResult = cfgRes.value();
974 gLog.log(entry.returns(interfaceConfigurationParcelToString(*interfaceGetCfgResult))
975 .withAutomaticDuration());
976 return binder::Status::ok();
977}
978
979binder::Status NetdNativeService::interfaceSetCfg(const InterfaceConfigurationParcel& cfg) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900980 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800981 auto entry = gLog.newEntry()
982 .prettyFunction(__PRETTY_FUNCTION__)
983 .arg(interfaceConfigurationParcelToString(cfg));
984
985 const auto& res = InterfaceController::setCfg(cfg);
986 RETURN_BINDER_STATUS_IF_NOT_OK(entry, res);
987
988 gLog.log(entry.withAutomaticDuration());
989 return binder::Status::ok();
990}
991
992binder::Status NetdNativeService::interfaceSetIPv6PrivacyExtensions(const std::string& ifName,
993 bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900994 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800995 int res = InterfaceController::setIPv6PrivacyExtensions(ifName.c_str(), enable);
Luke Huangf7782042018-08-08 13:13:04 +0800996 return statusFromErrcode(res);
997}
998
999binder::Status NetdNativeService::interfaceClearAddrs(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001000 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +08001001 int res = InterfaceController::clearAddrs(ifName.c_str());
Luke Huangf7782042018-08-08 13:13:04 +08001002 return statusFromErrcode(res);
1003}
1004
1005binder::Status NetdNativeService::interfaceSetEnableIPv6(const std::string& ifName, bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001006 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +08001007 int res = InterfaceController::setEnableIPv6(ifName.c_str(), enable);
Luke Huangf7782042018-08-08 13:13:04 +08001008 return statusFromErrcode(res);
1009}
1010
1011binder::Status NetdNativeService::interfaceSetMtu(const std::string& ifName, int32_t mtuValue) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001012 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +08001013 std::string mtu = std::to_string(mtuValue);
1014 int res = InterfaceController::setMtu(ifName.c_str(), mtu.c_str());
Luke Huangf7782042018-08-08 13:13:04 +08001015 return statusFromErrcode(res);
1016}
1017
Luke Huangb5733d72018-08-21 17:17:19 +08001018binder::Status NetdNativeService::tetherStart(const std::vector<std::string>& dhcpRanges) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001019 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001020 if (dhcpRanges.size() % 2 == 1) {
1021 return statusFromErrcode(-EINVAL);
1022 }
1023 int res = gCtls->tetherCtrl.startTethering(dhcpRanges);
Luke Huangb5733d72018-08-21 17:17:19 +08001024 return statusFromErrcode(res);
1025}
1026
1027binder::Status NetdNativeService::tetherStop() {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001028 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001029 int res = gCtls->tetherCtrl.stopTethering();
Luke Huangb5733d72018-08-21 17:17:19 +08001030 return statusFromErrcode(res);
1031}
1032
1033binder::Status NetdNativeService::tetherIsEnabled(bool* enabled) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001034 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001035 *enabled = gCtls->tetherCtrl.isTetheringStarted();
Luke Huangb5733d72018-08-21 17:17:19 +08001036 return binder::Status::ok();
1037}
1038
1039binder::Status NetdNativeService::tetherInterfaceAdd(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001040 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001041 int res = gCtls->tetherCtrl.tetherInterface(ifName.c_str());
Luke Huangb5733d72018-08-21 17:17:19 +08001042 return statusFromErrcode(res);
1043}
1044
1045binder::Status NetdNativeService::tetherInterfaceRemove(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001046 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001047 int res = gCtls->tetherCtrl.untetherInterface(ifName.c_str());
Luke Huangb5733d72018-08-21 17:17:19 +08001048 return statusFromErrcode(res);
1049}
1050
1051binder::Status NetdNativeService::tetherInterfaceList(std::vector<std::string>* ifList) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001052 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001053 for (const auto& ifname : gCtls->tetherCtrl.getTetheredInterfaceList()) {
1054 ifList->push_back(ifname);
1055 }
Luke Huangb5733d72018-08-21 17:17:19 +08001056 return binder::Status::ok();
1057}
1058
1059binder::Status NetdNativeService::tetherDnsSet(int32_t netId,
1060 const std::vector<std::string>& dnsAddrs) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001061 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001062 int res = gCtls->tetherCtrl.setDnsForwarders(netId, dnsAddrs);
Luke Huangb5733d72018-08-21 17:17:19 +08001063 return statusFromErrcode(res);
1064}
1065
1066binder::Status NetdNativeService::tetherDnsList(std::vector<std::string>* dnsList) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001067 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001068 for (const auto& fwdr : gCtls->tetherCtrl.getDnsForwarders()) {
1069 dnsList->push_back(fwdr);
1070 }
Luke Huangb5733d72018-08-21 17:17:19 +08001071 return binder::Status::ok();
1072}
1073
Luke Huangb670d162018-08-23 20:01:13 +08001074binder::Status NetdNativeService::networkAddRoute(int32_t netId, const std::string& ifName,
1075 const std::string& destination,
1076 const std::string& nextHop) {
1077 // Public methods of NetworkController are thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001078 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001079 bool legacy = false;
1080 uid_t uid = 0; // UID is only meaningful for legacy routes.
1081 int res = gCtls->netCtrl.addRoute(netId, ifName.c_str(), destination.c_str(),
1082 nextHop.empty() ? nullptr : nextHop.c_str(), legacy, uid);
Luke Huangb670d162018-08-23 20:01:13 +08001083 return statusFromErrcode(res);
1084}
1085
1086binder::Status NetdNativeService::networkRemoveRoute(int32_t netId, const std::string& ifName,
1087 const std::string& destination,
1088 const std::string& nextHop) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001089 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001090 bool legacy = false;
1091 uid_t uid = 0; // UID is only meaningful for legacy routes.
1092 int res = gCtls->netCtrl.removeRoute(netId, ifName.c_str(), destination.c_str(),
1093 nextHop.empty() ? nullptr : nextHop.c_str(), legacy, uid);
Luke Huangb670d162018-08-23 20:01:13 +08001094 return statusFromErrcode(res);
1095}
1096
1097binder::Status NetdNativeService::networkAddLegacyRoute(int32_t netId, const std::string& ifName,
1098 const std::string& destination,
1099 const std::string& nextHop, int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001100 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001101 bool legacy = true;
1102 int res = gCtls->netCtrl.addRoute(netId, ifName.c_str(), destination.c_str(),
1103 nextHop.empty() ? nullptr : nextHop.c_str(), legacy,
1104 (uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001105 return statusFromErrcode(res);
1106}
1107
1108binder::Status NetdNativeService::networkRemoveLegacyRoute(int32_t netId, const std::string& ifName,
1109 const std::string& destination,
1110 const std::string& nextHop,
1111 int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001112 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001113 bool legacy = true;
1114 int res = gCtls->netCtrl.removeRoute(netId, ifName.c_str(), destination.c_str(),
1115 nextHop.empty() ? nullptr : nextHop.c_str(), legacy,
1116 (uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001117 return statusFromErrcode(res);
1118}
1119
1120binder::Status NetdNativeService::networkGetDefault(int32_t* netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001121 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001122 *netId = gCtls->netCtrl.getDefaultNetwork();
Luke Huangb670d162018-08-23 20:01:13 +08001123 return binder::Status::ok();
1124}
1125
1126binder::Status NetdNativeService::networkSetDefault(int32_t netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001127 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001128 int res = gCtls->netCtrl.setDefaultNetwork(netId);
Luke Huangb670d162018-08-23 20:01:13 +08001129 return statusFromErrcode(res);
1130}
1131
1132binder::Status NetdNativeService::networkClearDefault() {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001133 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001134 unsigned netId = NETID_UNSET;
1135 int res = gCtls->netCtrl.setDefaultNetwork(netId);
Luke Huangb670d162018-08-23 20:01:13 +08001136 return statusFromErrcode(res);
1137}
1138
1139std::vector<uid_t> NetdNativeService::intsToUids(const std::vector<int32_t>& intUids) {
1140 return {begin(intUids), end(intUids)};
1141}
1142
1143Permission NetdNativeService::convertPermission(int32_t permission) {
1144 switch (permission) {
1145 case INetd::PERMISSION_NETWORK:
1146 return Permission::PERMISSION_NETWORK;
1147 case INetd::PERMISSION_SYSTEM:
1148 return Permission::PERMISSION_SYSTEM;
1149 default:
1150 return Permission::PERMISSION_NONE;
1151 }
1152}
1153
1154binder::Status NetdNativeService::networkSetPermissionForNetwork(int32_t netId,
1155 int32_t permission) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001156 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001157 std::vector<unsigned> netIds = {(unsigned) netId};
1158 int res = gCtls->netCtrl.setPermissionForNetworks(convertPermission(permission), netIds);
Luke Huangb670d162018-08-23 20:01:13 +08001159 return statusFromErrcode(res);
1160}
1161
1162binder::Status NetdNativeService::networkSetPermissionForUser(int32_t permission,
1163 const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001164 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001165 gCtls->netCtrl.setPermissionForUsers(convertPermission(permission), intsToUids(uids));
Luke Huangb670d162018-08-23 20:01:13 +08001166 return binder::Status::ok();
1167}
1168
1169binder::Status NetdNativeService::networkClearPermissionForUser(const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001170 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001171 Permission permission = Permission::PERMISSION_NONE;
1172 gCtls->netCtrl.setPermissionForUsers(permission, intsToUids(uids));
Luke Huangb670d162018-08-23 20:01:13 +08001173 return binder::Status::ok();
1174}
1175
1176binder::Status NetdNativeService::NetdNativeService::networkSetProtectAllow(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001177 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001178 std::vector<uid_t> uids = {(uid_t) uid};
1179 gCtls->netCtrl.allowProtect(uids);
Luke Huangb670d162018-08-23 20:01:13 +08001180 return binder::Status::ok();
1181}
1182
1183binder::Status NetdNativeService::networkSetProtectDeny(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001184 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001185 std::vector<uid_t> uids = {(uid_t) uid};
1186 gCtls->netCtrl.denyProtect(uids);
Luke Huangb670d162018-08-23 20:01:13 +08001187 return binder::Status::ok();
1188}
1189
1190binder::Status NetdNativeService::networkCanProtect(int32_t uid, bool* ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001191 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001192 *ret = gCtls->netCtrl.canProtect((uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001193 return binder::Status::ok();
1194}
1195
Chenbo Feng48eaed32018-12-26 17:40:21 -08001196binder::Status NetdNativeService::trafficSetNetPermForUids(int32_t permission,
1197 const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001198 ENFORCE_NETWORK_STACK_PERMISSIONS();
Chenbo Feng48eaed32018-12-26 17:40:21 -08001199 auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__).arg(permission).arg(uids);
1200 gCtls->trafficCtrl.setPermissionForUids(permission, intsToUids(uids));
1201 gLog.log(entry.withAutomaticDuration());
1202 return binder::Status::ok();
1203}
1204
Luke Huange64fa382018-07-24 16:38:22 +08001205binder::Status NetdNativeService::firewallSetFirewallType(int32_t firewallType) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001206 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001207 auto type = static_cast<FirewallType>(firewallType);
1208
1209 int res = gCtls->firewallCtrl.setFirewallType(type);
Luke Huange64fa382018-07-24 16:38:22 +08001210 return statusFromErrcode(res);
1211}
1212
1213binder::Status NetdNativeService::firewallSetInterfaceRule(const std::string& ifName,
1214 int32_t firewallRule) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001215 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001216 auto rule = static_cast<FirewallRule>(firewallRule);
1217
1218 int res = gCtls->firewallCtrl.setInterfaceRule(ifName.c_str(), rule);
Luke Huange64fa382018-07-24 16:38:22 +08001219 return statusFromErrcode(res);
1220}
1221
1222binder::Status NetdNativeService::firewallSetUidRule(int32_t childChain, int32_t uid,
1223 int32_t firewallRule) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001224 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001225 auto chain = static_cast<ChildChain>(childChain);
1226 auto rule = static_cast<FirewallRule>(firewallRule);
1227
1228 int res = gCtls->firewallCtrl.setUidRule(chain, uid, rule);
Luke Huange64fa382018-07-24 16:38:22 +08001229 return statusFromErrcode(res);
1230}
1231
1232binder::Status NetdNativeService::firewallEnableChildChain(int32_t childChain, bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001233 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001234 auto chain = static_cast<ChildChain>(childChain);
1235
1236 int res = gCtls->firewallCtrl.enableChildChains(chain, enable);
Luke Huange64fa382018-07-24 16:38:22 +08001237 return statusFromErrcode(res);
1238}
1239
Luke Huang19b49c52018-10-22 12:12:05 +09001240binder::Status NetdNativeService::tetherAddForward(const std::string& intIface,
1241 const std::string& extIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001242 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang19b49c52018-10-22 12:12:05 +09001243
1244 int res = gCtls->tetherCtrl.enableNat(intIface.c_str(), extIface.c_str());
Luke Huang19b49c52018-10-22 12:12:05 +09001245 return statusFromErrcode(res);
1246}
1247
1248binder::Status NetdNativeService::tetherRemoveForward(const std::string& intIface,
1249 const std::string& extIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001250 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangae038f82018-11-05 11:17:31 +09001251 int res = gCtls->tetherCtrl.disableNat(intIface.c_str(), extIface.c_str());
Luke Huang19b49c52018-10-22 12:12:05 +09001252 return statusFromErrcode(res);
1253}
1254
Chenbo Fengf5663d82018-11-08 16:10:48 -08001255binder::Status NetdNativeService::setTcpRWmemorySize(const std::string& rmemValues,
1256 const std::string& wmemValues) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001257 ENFORCE_NETWORK_STACK_PERMISSIONS();
Chenbo Fengf5663d82018-11-08 16:10:48 -08001258 if (!WriteStringToFile(rmemValues, TCP_RMEM_PROC_FILE)) {
1259 int ret = -errno;
Chenbo Fengf5663d82018-11-08 16:10:48 -08001260 return statusFromErrcode(ret);
1261 }
1262
1263 if (!WriteStringToFile(wmemValues, TCP_WMEM_PROC_FILE)) {
1264 int ret = -errno;
Chenbo Fengf5663d82018-11-08 16:10:48 -08001265 return statusFromErrcode(ret);
1266 }
Chenbo Fengf5663d82018-11-08 16:10:48 -08001267 return binder::Status::ok();
1268}
1269
nuccachenf52f7a52018-07-17 18:07:23 +08001270binder::Status NetdNativeService::getPrefix64(int netId, std::string* _aidl_return) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001271 ENFORCE_NETWORK_STACK_PERMISSIONS();
nuccachenf52f7a52018-07-17 18:07:23 +08001272 netdutils::IPPrefix prefix{};
1273 int err = gCtls->resolverCtrl.getPrefix64(netId, &prefix);
1274 if (err != 0) {
1275 return binder::Status::fromServiceSpecificError(
1276 -err, String8::format("ResolverController error: %s", strerror(-err)));
1277 }
1278 *_aidl_return = prefix.toString();
1279 return binder::Status::ok();
1280}
1281
Luke Huang528af602018-08-29 19:06:05 +08001282binder::Status NetdNativeService::registerUnsolicitedEventListener(
1283 const android::sp<android::net::INetdUnsolicitedEventListener>& listener) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001284 ENFORCE_NETWORK_STACK_PERMISSIONS();
Bernie Innocenti9ee088d2019-02-01 17:14:32 +09001285 auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__);
1286 gCtls->eventReporter.registerUnsolEventListener(listener);
Luke Huang528af602018-08-29 19:06:05 +08001287 gLog.log(entry.withAutomaticDuration());
1288 return binder::Status::ok();
1289}
1290
Lorenzo Colittie4d626e2016-02-02 17:19:04 +09001291} // namespace net
1292} // namespace android