blob: 1b537eb16de7b29e5692c324f21924100157bcfb [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>
Ben Schwartze7601812017-04-28 16:38:29 -040037#include <openssl/base64.h>
38
Lorenzo Colitti89faa342016-02-26 11:38:47 +090039#include "Controllers.h"
Erik Kline55b06f82016-07-04 09:57:18 +090040#include "InterfaceController.h"
Mike Yu5ae61542018-10-19 22:11:43 +080041#include "NetdConstants.h" // SHA256_SIZE
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090042#include "NetdNativeService.h"
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090043#include "NetdPermissions.h"
Luke Huangb670d162018-08-23 20:01:13 +080044#include "Permission.h"
Erik Kline85890042018-05-25 19:19:11 +090045#include "Process.h"
Robin Leeb8087362016-03-30 18:43:08 +010046#include "RouteController.h"
Lorenzo Colitti563d98b2016-04-24 13:13:14 +090047#include "SockDiag.h"
Robin Leeb8087362016-03-30 18:43:08 +010048#include "UidRanges.h"
Xiao Ma33d562a2018-12-16 16:27:38 +090049#include "android/net/BnNetd.h"
Luke Huangb257d612019-03-14 21:19:13 +080050#include "netdutils/DumpWriter.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:
76 // 1. The only permissions we check in netd's binder interface are CONNECTIVITY_INTERNAL
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090077 // and NETWORK_STACK, which the system server always has (or MAINLINE_NETWORK_STACK, which
78 // is equivalent to having both CONNECTIVITY_INTERNAL and NETWORK_STACK).
Luke Huanga38b65c2018-09-26 16:31:03 +080079 // 2. AID_SYSTEM always has all permissions. See ActivityManager#checkComponentPermission.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090080 if (uid == AID_SYSTEM) {
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090081 return binder::Status::ok();
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090082 }
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090083
84 for (const char* permission : permissions) {
85 if (checkPermission(String16(permission), pid, uid)) {
86 return binder::Status::ok();
87 }
88 }
89
90 auto err = StringPrintf("UID %d / PID %d does not have any of the following permissions: %s",
91 uid, pid, android::base::Join(permissions, ',').c_str());
92 return binder::Status::fromExceptionCode(binder::Status::EX_SECURITY, err.c_str());
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090093}
94
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090095#define ENFORCE_ANY_PERMISSION(...) \
96 do { \
97 binder::Status status = checkAnyPermission({__VA_ARGS__}); \
98 if (!status.isOk()) { \
99 return status; \
100 } \
101 } while (0)
Robin Lee2cf56172016-09-13 18:55:42 +0900102
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900103#define NETD_LOCKING_RPC(lock, ... /* permissions */) \
104 ENFORCE_ANY_PERMISSION(__VA_ARGS__); \
Bernie Innocentiabf8a342018-08-10 15:17:16 +0900105 std::lock_guard _lock(lock);
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900106
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900107#define NETD_BIG_LOCK_RPC(... /* permissions */) NETD_LOCKING_RPC(gBigNetdLock, __VA_ARGS__)
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900108
Luke Huangf7782042018-08-08 13:13:04 +0800109#define RETURN_BINDER_STATUS_IF_NOT_OK(logEntry, res) \
110 do { \
111 if (!isOk((res))) { \
112 logErrorStatus((logEntry), (res)); \
113 return asBinderStatus((res)); \
114 } \
115 } while (0)
116
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900117#define ENFORCE_INTERNAL_PERMISSIONS() \
118 ENFORCE_ANY_PERMISSION(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK)
119
120#define ENFORCE_NETWORK_STACK_PERMISSIONS() \
121 ENFORCE_ANY_PERMISSION(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK)
122
Luke Huangf7782042018-08-08 13:13:04 +0800123void logErrorStatus(netdutils::LogEntry& logEntry, const netdutils::Status& status) {
124 gLog.log(logEntry.returns(status.code()).withAutomaticDuration());
125}
126
Bernie Innocenti97f388f2018-10-16 19:17:08 +0900127binder::Status asBinderStatus(const netdutils::Status& status) {
128 if (isOk(status)) {
129 return binder::Status::ok();
130 }
131 return binder::Status::fromServiceSpecificError(status.code(), status.msg().c_str());
132}
133
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900134inline binder::Status statusFromErrcode(int ret) {
135 if (ret) {
136 return binder::Status::fromServiceSpecificError(-ret, strerror(-ret));
137 }
138 return binder::Status::ok();
139}
140
Erik Klineb31fd692018-06-06 20:50:11 +0900141bool contains(const Vector<String16>& words, const String16& word) {
142 for (const auto& w : words) {
143 if (w == word) return true;
144 }
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900145
Erik Klineb31fd692018-06-06 20:50:11 +0900146 return false;
147}
148
149} // namespace
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900150
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900151status_t NetdNativeService::start() {
152 IPCThreadState::self()->disableBackgroundScheduling(true);
Erik Klineb31fd692018-06-06 20:50:11 +0900153 const status_t ret = BinderService<NetdNativeService>::publish();
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900154 if (ret != android::OK) {
155 return ret;
156 }
157 sp<ProcessState> ps(ProcessState::self());
158 ps->startThreadPool();
159 ps->giveThreadPoolName();
Xiao Ma33d562a2018-12-16 16:27:38 +0900160
161 // register log callback to BnNetd::logFunc
162 BnNetd::logFunc = [](const Json::Value& logTransaction) {
163 bool hasReturnArgs;
164 std::string output;
165 const Json::Value& inputArgs = logTransaction["input_args"];
166 const Json::Value& returnArgs = logTransaction["_aidl_return"];
167 Json::Value::Members member = inputArgs.getMemberNames();
168
169 hasReturnArgs = !returnArgs.empty();
170 output.append(logTransaction["method_name"].asString().c_str() + std::string("("));
171
172 // input args
173 for (Json::Value::Members::iterator iter = member.begin(); iter != member.end(); ++iter) {
174 std::string value = inputArgs[(*iter).c_str()].asString();
175 if (value.empty()) value = std::string("null");
176 output.append(value);
177 if (iter != member.end() - 1) {
178 output.append(", ");
179 }
180 }
181 output.append(std::string(")"));
182 // return args
183 if (hasReturnArgs) {
184 output.append(StringPrintf(" -> (%s)", returnArgs.asString().c_str()));
185 }
186 // duration time
187 output.append(StringPrintf(" <%sms>", logTransaction["duration_ms"].asString().c_str()));
188 gLog.info("%s", output.c_str());
189 };
190
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900191 return android::OK;
192}
193
Hugo Benichi7b314e12018-01-15 21:54:00 +0900194status_t NetdNativeService::dump(int fd, const Vector<String16> &args) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900195 const binder::Status dump_permission = checkAnyPermission({PERM_DUMP});
Erik Kline2d3a1632016-03-15 16:33:48 +0900196 if (!dump_permission.isOk()) {
197 const String8 msg(dump_permission.toString8());
198 write(fd, msg.string(), msg.size());
199 return PERMISSION_DENIED;
200 }
201
202 // This method does not grab any locks. If individual classes need locking
203 // their dump() methods MUST handle locking appropriately.
Hugo Benichi7b314e12018-01-15 21:54:00 +0900204
Erik Kline2d3a1632016-03-15 16:33:48 +0900205 DumpWriter dw(fd);
Hugo Benichi7b314e12018-01-15 21:54:00 +0900206
207 if (!args.isEmpty() && args[0] == TcpSocketMonitor::DUMP_KEYWORD) {
208 dw.blankline();
209 gCtls->tcpSocketMonitor.dump(dw);
210 dw.blankline();
211 return NO_ERROR;
212 }
213
Chenbo Fengef297172018-03-26 10:53:33 -0700214 if (!args.isEmpty() && args[0] == TrafficController::DUMP_KEYWORD) {
215 dw.blankline();
216 gCtls->trafficCtrl.dump(dw, true);
217 dw.blankline();
218 return NO_ERROR;
219 }
220
Erik Kline85890042018-05-25 19:19:11 +0900221 process::dump(dw);
Erik Kline2d3a1632016-03-15 16:33:48 +0900222 dw.blankline();
223 gCtls->netCtrl.dump(dw);
224 dw.blankline();
225
Chenbo Fengef297172018-03-26 10:53:33 -0700226 gCtls->trafficCtrl.dump(dw, false);
227 dw.blankline();
228
Benedict Wongaf855432018-05-10 17:07:37 -0700229 gCtls->xfrmCtrl.dump(dw);
230 dw.blankline();
231
Erik Klineb31fd692018-06-06 20:50:11 +0900232 {
233 ScopedIndent indentLog(dw);
234 if (contains(args, String16(OPT_SHORT))) {
235 dw.println("Log: <omitted>");
236 } else {
237 dw.println("Log:");
238 ScopedIndent indentLogEntries(dw);
239 gLog.forEachEntry([&dw](const std::string& entry) mutable { dw.println(entry); });
240 }
241 dw.blankline();
242 }
243
Luke Huang528af602018-08-29 19:06:05 +0800244 {
245 ScopedIndent indentLog(dw);
246 if (contains(args, String16(OPT_SHORT))) {
247 dw.println("UnsolicitedLog: <omitted>");
248 } else {
249 dw.println("UnsolicitedLog:");
250 ScopedIndent indentLogEntries(dw);
251 gUnsolicitedLog.forEachEntry(
252 [&dw](const std::string& entry) mutable { dw.println(entry); });
253 }
254 dw.blankline();
255 }
256
Erik Kline2d3a1632016-03-15 16:33:48 +0900257 return NO_ERROR;
258}
259
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900260binder::Status NetdNativeService::isAlive(bool *alive) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900261 NETD_BIG_LOCK_RPC(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900262
263 *alive = true;
Erik Klineb31fd692018-06-06 20:50:11 +0900264
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900265 return binder::Status::ok();
266}
267
Erik Klinef52d4522018-03-14 15:01:46 +0900268binder::Status NetdNativeService::firewallReplaceUidChain(const std::string& chainName,
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900269 bool isWhitelist, const std::vector<int32_t>& uids, bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900270 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_CONNECTIVITY_INTERNAL,
271 PERM_MAINLINE_NETWORK_STACK);
Erik Klinef52d4522018-03-14 15:01:46 +0900272 int err = gCtls->firewallCtrl.replaceUidChain(chainName, isWhitelist, uids);
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900273 *ret = (err == 0);
274 return binder::Status::ok();
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900275}
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900276
277binder::Status NetdNativeService::bandwidthEnableDataSaver(bool enable, bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900278 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_CONNECTIVITY_INTERNAL,
279 PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900280 int err = gCtls->bandwidthCtrl.enableDataSaver(enable);
281 *ret = (err == 0);
282 return binder::Status::ok();
283}
284
Luke Huang531f5d32018-08-03 15:19:05 +0800285binder::Status NetdNativeService::bandwidthSetInterfaceQuota(const std::string& ifName,
286 int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900287 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800288 int res = gCtls->bandwidthCtrl.setInterfaceQuota(ifName, bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800289 return statusFromErrcode(res);
290}
291
292binder::Status NetdNativeService::bandwidthRemoveInterfaceQuota(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900293 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800294 int res = gCtls->bandwidthCtrl.removeInterfaceQuota(ifName);
Luke Huang531f5d32018-08-03 15:19:05 +0800295 return statusFromErrcode(res);
296}
297
298binder::Status NetdNativeService::bandwidthSetInterfaceAlert(const std::string& ifName,
299 int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900300 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800301 int res = gCtls->bandwidthCtrl.setInterfaceAlert(ifName, bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800302 return statusFromErrcode(res);
303}
304
305binder::Status NetdNativeService::bandwidthRemoveInterfaceAlert(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900306 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800307 int res = gCtls->bandwidthCtrl.removeInterfaceAlert(ifName);
Luke Huang531f5d32018-08-03 15:19:05 +0800308 return statusFromErrcode(res);
309}
310
311binder::Status NetdNativeService::bandwidthSetGlobalAlert(int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900312 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800313 int res = gCtls->bandwidthCtrl.setGlobalAlert(bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800314 return statusFromErrcode(res);
315}
316
317binder::Status NetdNativeService::bandwidthAddNaughtyApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900318 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800319 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
320 int res = gCtls->bandwidthCtrl.addNaughtyApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800321 return statusFromErrcode(res);
322}
323
324binder::Status NetdNativeService::bandwidthRemoveNaughtyApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900325 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800326 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
327 int res = gCtls->bandwidthCtrl.removeNaughtyApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800328 return statusFromErrcode(res);
329}
330
331binder::Status NetdNativeService::bandwidthAddNiceApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900332 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800333 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
334 int res = gCtls->bandwidthCtrl.addNiceApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800335 return statusFromErrcode(res);
336}
337
338binder::Status NetdNativeService::bandwidthRemoveNiceApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900339 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800340 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
341 int res = gCtls->bandwidthCtrl.removeNiceApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800342 return statusFromErrcode(res);
343}
344
Luke Huangb670d162018-08-23 20:01:13 +0800345binder::Status NetdNativeService::networkCreatePhysical(int32_t netId, int32_t permission) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900346 ENFORCE_INTERNAL_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +0800347 int ret = gCtls->netCtrl.createPhysicalNetwork(netId, convertPermission(permission));
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900348 return statusFromErrcode(ret);
349}
350
cken67cd14c2018-12-05 17:26:59 +0900351binder::Status NetdNativeService::networkCreateVpn(int32_t netId, bool secure) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900352 ENFORCE_NETWORK_STACK_PERMISSIONS();
cken67cd14c2018-12-05 17:26:59 +0900353 int ret = gCtls->netCtrl.createVirtualNetwork(netId, secure);
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900354 return statusFromErrcode(ret);
355}
356
357binder::Status NetdNativeService::networkDestroy(int32_t netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900358 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klinec8b6a9c2018-01-15 17:06:48 +0900359 // Both of these functions manage their own locking internally.
Mike Yu3e348b62018-12-24 17:05:02 +0800360 // Clear DNS servers before deleting the cache to avoid the cache being created again.
Erik Klinec8b6a9c2018-01-15 17:06:48 +0900361 gCtls->resolverCtrl.clearDnsServers(netId);
Mike Yu4fe1b9c2019-01-29 17:50:19 +0800362 const int ret = gCtls->netCtrl.destroyNetwork(netId);
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900363 return statusFromErrcode(ret);
364}
365
366binder::Status NetdNativeService::networkAddInterface(int32_t netId, const std::string& iface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900367 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900368 int ret = gCtls->netCtrl.addInterfaceToNetwork(netId, iface.c_str());
369 return statusFromErrcode(ret);
370}
371
372binder::Status NetdNativeService::networkRemoveInterface(int32_t netId, const std::string& iface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900373 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900374 int ret = gCtls->netCtrl.removeInterfaceFromNetwork(netId, iface.c_str());
375 return statusFromErrcode(ret);
376}
377
Luke Huang94658ac2018-10-18 19:35:12 +0900378binder::Status NetdNativeService::networkAddUidRanges(
379 int32_t netId, const std::vector<UidRangeParcel>& uidRangeArray) {
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900380 // NetworkController::addUsersToNetwork is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900381 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900382 int ret = gCtls->netCtrl.addUsersToNetwork(netId, UidRanges(uidRangeArray));
383 return statusFromErrcode(ret);
384}
385
Luke Huang94658ac2018-10-18 19:35:12 +0900386binder::Status NetdNativeService::networkRemoveUidRanges(
387 int32_t netId, const std::vector<UidRangeParcel>& uidRangeArray) {
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900388 // NetworkController::removeUsersFromNetwork is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900389 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900390 int ret = gCtls->netCtrl.removeUsersFromNetwork(netId, UidRanges(uidRangeArray));
391 return statusFromErrcode(ret);
392}
393
Luke Huang94658ac2018-10-18 19:35:12 +0900394binder::Status NetdNativeService::networkRejectNonSecureVpn(
395 bool add, const std::vector<UidRangeParcel>& uidRangeArray) {
Robin Leeb8087362016-03-30 18:43:08 +0100396 // TODO: elsewhere RouteController is only used from the tethering and network controllers, so
397 // it should be possible to use the same lock as NetworkController. However, every call through
398 // the CommandListener "network" command will need to hold this lock too, not just the ones that
399 // read/modify network internal state (that is sufficient for ::dump() because it doesn't
400 // look at routes, but it's not enough here).
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900401 NETD_BIG_LOCK_RPC(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900402 UidRanges uidRanges(uidRangeArray);
Robin Leeb8087362016-03-30 18:43:08 +0100403
404 int err;
405 if (add) {
406 err = RouteController::addUsersToRejectNonSecureNetworkRule(uidRanges);
407 } else {
408 err = RouteController::removeUsersFromRejectNonSecureNetworkRule(uidRanges);
409 }
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900410 return statusFromErrcode(err);
Robin Leeb8087362016-03-30 18:43:08 +0100411}
412
Luke Huang94658ac2018-10-18 19:35:12 +0900413binder::Status NetdNativeService::socketDestroy(const std::vector<UidRangeParcel>& uids,
414 const std::vector<int32_t>& skipUids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900415 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900416
417 SockDiag sd;
418 if (!sd.open()) {
419 return binder::Status::fromServiceSpecificError(EIO,
420 String8("Could not open SOCK_DIAG socket"));
421 }
422
423 UidRanges uidRanges(uids);
Lorenzo Colittie5c3c992016-07-26 17:53:50 +0900424 int err = sd.destroySockets(uidRanges, std::set<uid_t>(skipUids.begin(), skipUids.end()),
425 true /* excludeLoopback */);
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900426 if (err) {
427 return binder::Status::fromServiceSpecificError(-err,
428 String8::format("destroySockets: %s", strerror(-err)));
429 }
Pierre Imaibeedec32016-04-13 06:44:51 +0900430 return binder::Status::ok();
431}
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900432
Ben Schwartz4204ecf2017-10-02 12:35:48 -0400433// Parse a base64 encoded string into a vector of bytes.
434// On failure, return an empty vector.
435static std::vector<uint8_t> parseBase64(const std::string& input) {
436 std::vector<uint8_t> decoded;
437 size_t out_len;
438 if (EVP_DecodedLength(&out_len, input.size()) != 1) {
439 return decoded;
440 }
441 // out_len is now an upper bound on the output length.
442 decoded.resize(out_len);
443 if (EVP_DecodeBase64(decoded.data(), &out_len, decoded.size(),
444 reinterpret_cast<const uint8_t*>(input.data()), input.size()) == 1) {
445 // Possibly shrink the vector if the actual output was smaller than the bound.
446 decoded.resize(out_len);
447 } else {
448 decoded.clear();
449 }
450 if (out_len != SHA256_SIZE) {
451 decoded.clear();
452 }
453 return decoded;
454}
455
Pierre Imaibeedec32016-04-13 06:44:51 +0900456binder::Status NetdNativeService::setResolverConfiguration(int32_t netId,
457 const std::vector<std::string>& servers, const std::vector<std::string>& domains,
Erik Klinea1476fb2018-03-04 21:01:56 +0900458 const std::vector<int32_t>& params, const std::string& tlsName,
459 const std::vector<std::string>& tlsServers,
Ben Schwartz4204ecf2017-10-02 12:35:48 -0400460 const std::vector<std::string>& tlsFingerprints) {
Pierre Imaibeedec32016-04-13 06:44:51 +0900461 // This function intentionally does not lock within Netd, as Bionic is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900462 ENFORCE_INTERNAL_PERMISSIONS();
Pierre Imaibeedec32016-04-13 06:44:51 +0900463
Ben Schwartz4204ecf2017-10-02 12:35:48 -0400464 std::set<std::vector<uint8_t>> decoded_fingerprints;
465 for (const std::string& fingerprint : tlsFingerprints) {
466 std::vector<uint8_t> decoded = parseBase64(fingerprint);
467 if (decoded.empty()) {
468 return binder::Status::fromServiceSpecificError(EINVAL,
469 String8::format("ResolverController error: bad fingerprint"));
470 }
471 decoded_fingerprints.emplace(decoded);
472 }
473
474 int err = gCtls->resolverCtrl.setResolverConfiguration(netId, servers, domains, params,
Erik Klinea1476fb2018-03-04 21:01:56 +0900475 tlsName, tlsServers, decoded_fingerprints);
Pierre Imaibeedec32016-04-13 06:44:51 +0900476 if (err != 0) {
477 return binder::Status::fromServiceSpecificError(-err,
478 String8::format("ResolverController error: %s", strerror(-err)));
479 }
480 return binder::Status::ok();
481}
482
Ken Chen2a429352018-12-22 21:46:55 +0800483binder::Status NetdNativeService::getResolverInfo(
484 int32_t netId, std::vector<std::string>* servers, std::vector<std::string>* domains,
485 std::vector<std::string>* tlsServers, std::vector<int32_t>* params,
486 std::vector<int32_t>* stats, std::vector<int32_t>* wait_for_pending_req_timeout_count) {
Pierre Imaibeedec32016-04-13 06:44:51 +0900487 // This function intentionally does not lock within Netd, as Bionic is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900488 ENFORCE_NETWORK_STACK_PERMISSIONS();
Pierre Imaibeedec32016-04-13 06:44:51 +0900489
Ken Chen2a429352018-12-22 21:46:55 +0800490 int err = gCtls->resolverCtrl.getResolverInfo(netId, servers, domains, tlsServers, params,
491 stats, wait_for_pending_req_timeout_count);
Pierre Imaibeedec32016-04-13 06:44:51 +0900492 if (err != 0) {
493 return binder::Status::fromServiceSpecificError(-err,
494 String8::format("ResolverController error: %s", strerror(-err)));
495 }
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900496 return binder::Status::ok();
497}
498
Lorenzo Colittib5d45872019-02-18 10:59:29 +0900499binder::Status NetdNativeService::resolverStartPrefix64Discovery(int32_t netId) {
500 // Locking happens in Dns64Configuration.
501 ENFORCE_NETWORK_STACK_PERMISSIONS();
502 gCtls->resolverCtrl.startPrefix64Discovery(netId);
503 return binder::Status::ok();
504}
505
506binder::Status NetdNativeService::resolverStopPrefix64Discovery(int32_t netId) {
507 // Locking happens in Dns64Configuration.
508 ENFORCE_NETWORK_STACK_PERMISSIONS();
509 gCtls->resolverCtrl.stopPrefix64Discovery(netId);
510 return binder::Status::ok();
511}
512
Erik Klinef48e4dd2016-07-18 04:02:07 +0900513binder::Status NetdNativeService::tetherApplyDnsInterfaces(bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900514 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Erik Klinef48e4dd2016-07-18 04:02:07 +0900515 *ret = gCtls->tetherCtrl.applyDnsInterfaces();
516 return binder::Status::ok();
517}
518
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900519namespace {
520
Luke Huangcaebcbb2018-09-27 20:37:14 +0800521void tetherAddStatsByInterface(TetherController::TetherStats* tetherStatsParcel,
522 const TetherController::TetherStats& tetherStats) {
523 if (tetherStatsParcel->extIface == tetherStats.extIface) {
524 tetherStatsParcel->rxBytes += tetherStats.rxBytes;
525 tetherStatsParcel->rxPackets += tetherStats.rxPackets;
526 tetherStatsParcel->txBytes += tetherStats.txBytes;
527 tetherStatsParcel->txPackets += tetherStats.txPackets;
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900528 }
Luke Huangcaebcbb2018-09-27 20:37:14 +0800529}
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900530
Luke Huangcaebcbb2018-09-27 20:37:14 +0800531TetherStatsParcel toTetherStatsParcel(const TetherController::TetherStats& stats) {
532 TetherStatsParcel result;
533 result.iface = stats.extIface;
534 result.rxBytes = stats.rxBytes;
535 result.rxPackets = stats.rxPackets;
536 result.txBytes = stats.txBytes;
537 result.txPackets = stats.txPackets;
538 return result;
539}
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900540
Luke Huangcaebcbb2018-09-27 20:37:14 +0800541void setTetherStatsParcelVecByInterface(std::vector<TetherStatsParcel>* tetherStatsVec,
542 const TetherController::TetherStatsList& statsList) {
543 std::map<std::string, TetherController::TetherStats> statsMap;
544 for (const auto& stats : statsList) {
545 auto iter = statsMap.find(stats.extIface);
546 if (iter != statsMap.end()) {
547 tetherAddStatsByInterface(&(iter->second), stats);
548 } else {
549 statsMap.insert(
550 std::pair<std::string, TetherController::TetherStats>(stats.extIface, stats));
551 }
552 }
553 for (auto iter = statsMap.begin(); iter != statsMap.end(); iter++) {
554 tetherStatsVec->push_back(toTetherStatsParcel(iter->second));
555 }
556}
557
558std::vector<std::string> tetherStatsParcelVecToStringVec(std::vector<TetherStatsParcel>* tVec) {
559 std::vector<std::string> result;
560 for (const auto& t : *tVec) {
561 result.push_back(StringPrintf("%s:%" PRId64 ",%" PRId64 ",%" PRId64 ",%" PRId64,
562 t.iface.c_str(), t.rxBytes, t.rxPackets, t.txBytes,
563 t.txPackets));
564 }
565 return result;
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900566}
567
568} // namespace
569
Luke Huangcaebcbb2018-09-27 20:37:14 +0800570binder::Status NetdNativeService::tetherGetStats(
571 std::vector<TetherStatsParcel>* tetherStatsParcelVec) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900572 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti5192bf72017-09-04 13:30:59 +0900573 const auto& statsList = gCtls->tetherCtrl.getTetherStats();
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900574 if (!isOk(statsList)) {
Nathan Harold28ccfef2018-03-16 19:02:47 -0700575 return asBinderStatus(statsList);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900576 }
Luke Huangcaebcbb2018-09-27 20:37:14 +0800577 setTetherStatsParcelVecByInterface(tetherStatsParcelVec, statsList.value());
578 auto statsResults = tetherStatsParcelVecToStringVec(tetherStatsParcelVec);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900579 return binder::Status::ok();
580}
581
Erik Kline53c20882016-08-02 15:22:53 +0900582binder::Status NetdNativeService::interfaceAddAddress(const std::string &ifName,
583 const std::string &addrString, int prefixLength) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900584 ENFORCE_INTERNAL_PERMISSIONS();
Erik Kline53c20882016-08-02 15:22:53 +0900585 const int err = InterfaceController::addAddress(
586 ifName.c_str(), addrString.c_str(), prefixLength);
587 if (err != 0) {
588 return binder::Status::fromServiceSpecificError(-err,
589 String8::format("InterfaceController error: %s", strerror(-err)));
590 }
591 return binder::Status::ok();
592}
593
594binder::Status NetdNativeService::interfaceDelAddress(const std::string &ifName,
595 const std::string &addrString, int prefixLength) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900596 ENFORCE_INTERNAL_PERMISSIONS();
Erik Kline53c20882016-08-02 15:22:53 +0900597 const int err = InterfaceController::delAddress(
598 ifName.c_str(), addrString.c_str(), prefixLength);
599 if (err != 0) {
600 return binder::Status::fromServiceSpecificError(-err,
601 String8::format("InterfaceController error: %s", strerror(-err)));
602 }
603 return binder::Status::ok();
604}
605
Erik Kline38e51f12018-09-06 20:14:44 +0900606namespace {
Erik Kline55b06f82016-07-04 09:57:18 +0900607
Erik Kline38e51f12018-09-06 20:14:44 +0900608std::tuple<binder::Status, const char*, const char*> getPathComponents(int32_t ipversion,
609 int32_t category) {
610 const char* ipversionStr = nullptr;
611 switch (ipversion) {
Erik Kline55b06f82016-07-04 09:57:18 +0900612 case INetd::IPV4:
Erik Kline38e51f12018-09-06 20:14:44 +0900613 ipversionStr = "ipv4";
Erik Kline55b06f82016-07-04 09:57:18 +0900614 break;
615 case INetd::IPV6:
Erik Kline38e51f12018-09-06 20:14:44 +0900616 ipversionStr = "ipv6";
Erik Kline55b06f82016-07-04 09:57:18 +0900617 break;
618 default:
Erik Kline38e51f12018-09-06 20:14:44 +0900619 return {binder::Status::fromServiceSpecificError(EAFNOSUPPORT, "Bad IP version"),
620 nullptr, nullptr};
Erik Kline55b06f82016-07-04 09:57:18 +0900621 }
622
Erik Kline38e51f12018-09-06 20:14:44 +0900623 const char* whichStr = nullptr;
624 switch (category) {
Erik Kline55b06f82016-07-04 09:57:18 +0900625 case INetd::CONF:
626 whichStr = "conf";
627 break;
628 case INetd::NEIGH:
629 whichStr = "neigh";
630 break;
631 default:
Erik Kline38e51f12018-09-06 20:14:44 +0900632 return {binder::Status::fromServiceSpecificError(EINVAL, "Bad category"), nullptr,
633 nullptr};
Erik Kline55b06f82016-07-04 09:57:18 +0900634 }
635
Erik Kline38e51f12018-09-06 20:14:44 +0900636 return {binder::Status::ok(), ipversionStr, whichStr};
637}
638
639} // namespace
640
641binder::Status NetdNativeService::getProcSysNet(int32_t ipversion, int32_t which,
642 const std::string& ifname,
643 const std::string& parameter, std::string* value) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900644 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline38e51f12018-09-06 20:14:44 +0900645 const auto pathParts = getPathComponents(ipversion, which);
646 const auto& pathStatus = std::get<0>(pathParts);
647 if (!pathStatus.isOk()) {
Erik Kline38e51f12018-09-06 20:14:44 +0900648 return pathStatus;
Erik Kline55b06f82016-07-04 09:57:18 +0900649 }
Erik Kline38e51f12018-09-06 20:14:44 +0900650
651 const int err = InterfaceController::getParameter(std::get<1>(pathParts),
652 std::get<2>(pathParts), ifname.c_str(),
653 parameter.c_str(), value);
Erik Kline38e51f12018-09-06 20:14:44 +0900654 return statusFromErrcode(err);
655}
656
657binder::Status NetdNativeService::setProcSysNet(int32_t ipversion, int32_t which,
658 const std::string& ifname,
659 const std::string& parameter,
660 const std::string& value) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900661 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline38e51f12018-09-06 20:14:44 +0900662 const auto pathParts = getPathComponents(ipversion, which);
663 const auto& pathStatus = std::get<0>(pathParts);
664 if (!pathStatus.isOk()) {
Erik Kline38e51f12018-09-06 20:14:44 +0900665 return pathStatus;
666 }
667
668 const int err = InterfaceController::setParameter(std::get<1>(pathParts),
669 std::get<2>(pathParts), ifname.c_str(),
670 parameter.c_str(), value.c_str());
Erik Kline38e51f12018-09-06 20:14:44 +0900671 return statusFromErrcode(err);
Erik Kline55b06f82016-07-04 09:57:18 +0900672}
673
Luke Huange203a152018-11-23 11:47:28 +0800674binder::Status NetdNativeService::ipSecSetEncapSocketOwner(const ParcelFileDescriptor& socket,
675 int newUid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900676 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900677 gLog.log("ipSecSetEncapSocketOwner()");
Benedict Wongb2daefb2017-12-06 22:05:46 -0800678
679 uid_t callerUid = IPCThreadState::self()->getCallingUid();
Luke Huange203a152018-11-23 11:47:28 +0800680 return asBinderStatus(
681 gCtls->xfrmCtrl.ipSecSetEncapSocketOwner(socket.get(), newUid, callerUid));
Benedict Wongb2daefb2017-12-06 22:05:46 -0800682}
683
Nathan Harold1a371532017-01-30 12:30:48 -0800684binder::Status NetdNativeService::ipSecAllocateSpi(
685 int32_t transformId,
Nathan Haroldda54f122018-01-09 16:42:57 -0800686 const std::string& sourceAddress,
687 const std::string& destinationAddress,
Nathan Harold1a371532017-01-30 12:30:48 -0800688 int32_t inSpi,
689 int32_t* outSpi) {
690 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900691 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900692 gLog.log("ipSecAllocateSpi()");
ludi6e8eccd2017-08-14 14:40:37 -0700693 return asBinderStatus(gCtls->xfrmCtrl.ipSecAllocateSpi(
Nathan Harold1a371532017-01-30 12:30:48 -0800694 transformId,
Nathan Haroldda54f122018-01-09 16:42:57 -0800695 sourceAddress,
696 destinationAddress,
Nathan Harold1a371532017-01-30 12:30:48 -0800697 inSpi,
698 outSpi));
699}
700
701binder::Status NetdNativeService::ipSecAddSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700702 int32_t transformId, int32_t mode, const std::string& sourceAddress,
703 const std::string& destinationAddress, int32_t underlyingNetId, int32_t spi,
704 int32_t markValue, int32_t markMask, const std::string& authAlgo,
705 const std::vector<uint8_t>& authKey, int32_t authTruncBits, const std::string& cryptAlgo,
706 const std::vector<uint8_t>& cryptKey, int32_t cryptTruncBits, const std::string& aeadAlgo,
707 const std::vector<uint8_t>& aeadKey, int32_t aeadIcvBits, int32_t encapType,
708 int32_t encapLocalPort, int32_t encapRemotePort, int32_t interfaceId) {
Nathan Harold1a371532017-01-30 12:30:48 -0800709 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900710 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900711 gLog.log("ipSecAddSecurityAssociation()");
ludi6e8eccd2017-08-14 14:40:37 -0700712 return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityAssociation(
Benedict Wongad600cb2018-05-14 17:22:35 -0700713 transformId, mode, sourceAddress, destinationAddress, underlyingNetId, spi, markValue,
714 markMask, authAlgo, authKey, authTruncBits, cryptAlgo, cryptKey, cryptTruncBits,
Benedict Wonga450e722018-05-07 10:29:02 -0700715 aeadAlgo, aeadKey, aeadIcvBits, encapType, encapLocalPort, encapRemotePort,
716 interfaceId));
Nathan Harold1a371532017-01-30 12:30:48 -0800717}
718
719binder::Status NetdNativeService::ipSecDeleteSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700720 int32_t transformId, const std::string& sourceAddress,
721 const std::string& destinationAddress, int32_t spi, int32_t markValue, int32_t markMask,
722 int32_t interfaceId) {
Nathan Harold1a371532017-01-30 12:30:48 -0800723 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900724 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900725 gLog.log("ipSecDeleteSecurityAssociation()");
ludi6e8eccd2017-08-14 14:40:37 -0700726 return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700727 transformId, sourceAddress, destinationAddress, spi, markValue, markMask, interfaceId));
Nathan Harold1a371532017-01-30 12:30:48 -0800728}
729
730binder::Status NetdNativeService::ipSecApplyTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800731 const ParcelFileDescriptor& socket, int32_t transformId, int32_t direction,
732 const std::string& sourceAddress, const std::string& destinationAddress, int32_t spi) {
Nathan Harold1a371532017-01-30 12:30:48 -0800733 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900734 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900735 gLog.log("ipSecApplyTransportModeTransform()");
ludi6e8eccd2017-08-14 14:40:37 -0700736 return asBinderStatus(gCtls->xfrmCtrl.ipSecApplyTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800737 socket.get(), transformId, direction, sourceAddress, destinationAddress, spi));
Nathan Harold1a371532017-01-30 12:30:48 -0800738}
739
740binder::Status NetdNativeService::ipSecRemoveTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800741 const ParcelFileDescriptor& socket) {
Nathan Harold1a371532017-01-30 12:30:48 -0800742 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900743 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900744 gLog.log("ipSecRemoveTransportModeTransform()");
Luke Huange203a152018-11-23 11:47:28 +0800745 return asBinderStatus(gCtls->xfrmCtrl.ipSecRemoveTransportModeTransform(socket.get()));
Nathan Harold1a371532017-01-30 12:30:48 -0800746}
747
Benedict Wonga04ffa72018-05-09 21:42:42 -0700748binder::Status NetdNativeService::ipSecAddSecurityPolicy(int32_t transformId, int32_t selAddrFamily,
749 int32_t direction,
Benedict Wongad600cb2018-05-14 17:22:35 -0700750 const std::string& tmplSrcAddress,
751 const std::string& tmplDstAddress,
752 int32_t spi, int32_t markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700753 int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800754 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900755 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900756 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800757 return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityPolicy(
Benedict Wonga04ffa72018-05-09 21:42:42 -0700758 transformId, selAddrFamily, direction, tmplSrcAddress, tmplDstAddress, spi, markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700759 markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800760}
761
Benedict Wonga450e722018-05-07 10:29:02 -0700762binder::Status NetdNativeService::ipSecUpdateSecurityPolicy(
763 int32_t transformId, int32_t selAddrFamily, int32_t direction,
764 const std::string& tmplSrcAddress, const std::string& tmplDstAddress, int32_t spi,
765 int32_t markValue, int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800766 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900767 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900768 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800769 return asBinderStatus(gCtls->xfrmCtrl.ipSecUpdateSecurityPolicy(
Benedict Wonga04ffa72018-05-09 21:42:42 -0700770 transformId, selAddrFamily, direction, tmplSrcAddress, tmplDstAddress, spi, markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700771 markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800772}
773
Benedict Wonga04ffa72018-05-09 21:42:42 -0700774binder::Status NetdNativeService::ipSecDeleteSecurityPolicy(int32_t transformId,
775 int32_t selAddrFamily,
776 int32_t direction, int32_t markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700777 int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800778 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900779 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900780 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800781 return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityPolicy(
Benedict Wonga450e722018-05-07 10:29:02 -0700782 transformId, selAddrFamily, direction, markValue, markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800783}
784
Benedict Wong319f17e2018-05-15 17:06:44 -0700785binder::Status NetdNativeService::ipSecAddTunnelInterface(const std::string& deviceName,
786 const std::string& localAddress,
787 const std::string& remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700788 int32_t iKey, int32_t oKey,
789 int32_t interfaceId) {
manojboopathi8707f232018-01-02 14:45:47 -0800790 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900791 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700792 netdutils::Status result = gCtls->xfrmCtrl.ipSecAddTunnelInterface(
Benedict Wonga450e722018-05-07 10:29:02 -0700793 deviceName, localAddress, remoteAddress, iKey, oKey, interfaceId, false);
Benedict Wong319f17e2018-05-15 17:06:44 -0700794 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800795}
796
Benedict Wong319f17e2018-05-15 17:06:44 -0700797binder::Status NetdNativeService::ipSecUpdateTunnelInterface(const std::string& deviceName,
798 const std::string& localAddress,
799 const std::string& remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700800 int32_t iKey, int32_t oKey,
801 int32_t interfaceId) {
manojboopathi8707f232018-01-02 14:45:47 -0800802 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900803 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700804 netdutils::Status result = gCtls->xfrmCtrl.ipSecAddTunnelInterface(
Benedict Wonga450e722018-05-07 10:29:02 -0700805 deviceName, localAddress, remoteAddress, iKey, oKey, interfaceId, true);
Benedict Wong319f17e2018-05-15 17:06:44 -0700806 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800807}
808
Benedict Wong319f17e2018-05-15 17:06:44 -0700809binder::Status NetdNativeService::ipSecRemoveTunnelInterface(const std::string& deviceName) {
manojboopathi8707f232018-01-02 14:45:47 -0800810 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900811 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700812 netdutils::Status result = gCtls->xfrmCtrl.ipSecRemoveTunnelInterface(deviceName);
Benedict Wong319f17e2018-05-15 17:06:44 -0700813 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800814}
815
Joel Scherpelzde937962017-06-01 13:20:21 +0900816binder::Status NetdNativeService::setIPv6AddrGenMode(const std::string& ifName,
817 int32_t mode) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900818 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700819 return asBinderStatus(InterfaceController::setIPv6AddrGenMode(ifName, mode));
Joel Scherpelzde937962017-06-01 13:20:21 +0900820}
821
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900822binder::Status NetdNativeService::wakeupAddInterface(const std::string& ifName,
823 const std::string& prefix, int32_t mark,
824 int32_t mask) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900825 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700826 return asBinderStatus(gCtls->wakeupCtrl.addInterface(ifName, prefix, mark, mask));
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900827}
828
829binder::Status NetdNativeService::wakeupDelInterface(const std::string& ifName,
830 const std::string& prefix, int32_t mark,
831 int32_t mask) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900832 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700833 return asBinderStatus(gCtls->wakeupCtrl.delInterface(ifName, prefix, mark, mask));
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900834}
835
Luke Huang0051a622018-07-23 20:30:16 +0800836binder::Status NetdNativeService::idletimerAddInterface(const std::string& ifName, int32_t timeout,
837 const std::string& classLabel) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900838 NETD_LOCKING_RPC(gCtls->idletimerCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang0051a622018-07-23 20:30:16 +0800839 int res =
840 gCtls->idletimerCtrl.addInterfaceIdletimer(ifName.c_str(), timeout, classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +0800841 return statusFromErrcode(res);
842}
843
844binder::Status NetdNativeService::idletimerRemoveInterface(const std::string& ifName,
845 int32_t timeout,
846 const std::string& classLabel) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900847 NETD_LOCKING_RPC(gCtls->idletimerCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang0051a622018-07-23 20:30:16 +0800848 int res = gCtls->idletimerCtrl.removeInterfaceIdletimer(ifName.c_str(), timeout,
849 classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +0800850 return statusFromErrcode(res);
851}
Luke Huanga67dd562018-07-17 19:58:25 +0800852
853binder::Status NetdNativeService::strictUidCleartextPenalty(int32_t uid, int32_t policyPenalty) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900854 NETD_LOCKING_RPC(gCtls->strictCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huanga67dd562018-07-17 19:58:25 +0800855 StrictPenalty penalty;
856 switch (policyPenalty) {
857 case INetd::PENALTY_POLICY_REJECT:
858 penalty = REJECT;
859 break;
860 case INetd::PENALTY_POLICY_LOG:
861 penalty = LOG;
862 break;
863 case INetd::PENALTY_POLICY_ACCEPT:
864 penalty = ACCEPT;
865 break;
866 default:
867 return statusFromErrcode(-EINVAL);
868 break;
869 }
870 int res = gCtls->strictCtrl.setUidCleartextPenalty((uid_t) uid, penalty);
Luke Huanga67dd562018-07-17 19:58:25 +0800871 return statusFromErrcode(res);
872}
Luke Huange64fa382018-07-24 16:38:22 +0800873
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +0900874binder::Status NetdNativeService::clatdStart(const std::string& ifName,
875 const std::string& nat64Prefix, std::string* v6Addr) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900876 NETD_LOCKING_RPC(gCtls->clatdCtrl.mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +0900877 int res = gCtls->clatdCtrl.startClatd(ifName.c_str(), nat64Prefix, v6Addr);
Luke Huang6d301232018-08-01 14:05:18 +0800878 return statusFromErrcode(res);
879}
880
881binder::Status NetdNativeService::clatdStop(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900882 NETD_LOCKING_RPC(gCtls->clatdCtrl.mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang6d301232018-08-01 14:05:18 +0800883 int res = gCtls->clatdCtrl.stopClatd(ifName.c_str());
Luke Huang6d301232018-08-01 14:05:18 +0800884 return statusFromErrcode(res);
885}
Luke Huanga67dd562018-07-17 19:58:25 +0800886
Luke Huang457d4702018-08-16 15:39:15 +0800887binder::Status NetdNativeService::ipfwdEnabled(bool* status) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900888 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang728cf4c2019-03-14 19:43:02 +0800889 *status = (gCtls->tetherCtrl.getIpfwdRequesterList().size() > 0) ? true : false;
890 return binder::Status::ok();
891}
892
893binder::Status NetdNativeService::ipfwdGetRequesterList(std::vector<std::string>* requesterList) {
894 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
895 for (const auto& requester : gCtls->tetherCtrl.getIpfwdRequesterList()) {
896 requesterList->push_back(requester);
897 }
Luke Huang457d4702018-08-16 15:39:15 +0800898 return binder::Status::ok();
899}
900
901binder::Status NetdNativeService::ipfwdEnableForwarding(const std::string& requester) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900902 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang457d4702018-08-16 15:39:15 +0800903 int res = (gCtls->tetherCtrl.enableForwarding(requester.c_str())) ? 0 : -EREMOTEIO;
Luke Huang457d4702018-08-16 15:39:15 +0800904 return statusFromErrcode(res);
905}
906
907binder::Status NetdNativeService::ipfwdDisableForwarding(const std::string& requester) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900908 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang457d4702018-08-16 15:39:15 +0800909 int res = (gCtls->tetherCtrl.disableForwarding(requester.c_str())) ? 0 : -EREMOTEIO;
Luke Huang457d4702018-08-16 15:39:15 +0800910 return statusFromErrcode(res);
911}
912
913binder::Status NetdNativeService::ipfwdAddInterfaceForward(const std::string& fromIface,
914 const std::string& toIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900915 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang457d4702018-08-16 15:39:15 +0800916 int res = RouteController::enableTethering(fromIface.c_str(), toIface.c_str());
Luke Huang457d4702018-08-16 15:39:15 +0800917 return statusFromErrcode(res);
918}
919
920binder::Status NetdNativeService::ipfwdRemoveInterfaceForward(const std::string& fromIface,
921 const std::string& toIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900922 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang457d4702018-08-16 15:39:15 +0800923 int res = RouteController::disableTethering(fromIface.c_str(), toIface.c_str());
Luke Huang457d4702018-08-16 15:39:15 +0800924 return statusFromErrcode(res);
925}
926
Luke Huangf7782042018-08-08 13:13:04 +0800927namespace {
928std::string addSquareBrackets(const std::string& s) {
929 return "[" + s + "]";
930}
931
932std::string addCurlyBrackets(const std::string& s) {
933 return "{" + s + "}";
934}
935
936} // namespace
Xiao Ma33d562a2018-12-16 16:27:38 +0900937
Luke Huangf7782042018-08-08 13:13:04 +0800938binder::Status NetdNativeService::interfaceGetList(std::vector<std::string>* interfaceListResult) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900939 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800940 auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__);
941
942 const auto& ifaceList = InterfaceController::getIfaceNames();
943 RETURN_BINDER_STATUS_IF_NOT_OK(entry, ifaceList);
944
945 interfaceListResult->clear();
946 interfaceListResult->reserve(ifaceList.value().size());
947 interfaceListResult->insert(end(*interfaceListResult), begin(ifaceList.value()),
948 end(ifaceList.value()));
949
950 gLog.log(entry.returns(addSquareBrackets(base::Join(*interfaceListResult, ", ")))
951 .withAutomaticDuration());
952 return binder::Status::ok();
953}
954
955std::string interfaceConfigurationParcelToString(const InterfaceConfigurationParcel& cfg) {
956 std::vector<std::string> result{cfg.ifName, cfg.hwAddr, cfg.ipv4Addr,
957 std::to_string(cfg.prefixLength)};
958 result.insert(end(result), begin(cfg.flags), end(cfg.flags));
959 return addCurlyBrackets(base::Join(result, ", "));
960}
961
962binder::Status NetdNativeService::interfaceGetCfg(
963 const std::string& ifName, InterfaceConfigurationParcel* interfaceGetCfgResult) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900964 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800965 auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__).arg(ifName);
966
967 const auto& cfgRes = InterfaceController::getCfg(ifName);
968 RETURN_BINDER_STATUS_IF_NOT_OK(entry, cfgRes);
969
970 *interfaceGetCfgResult = cfgRes.value();
971 gLog.log(entry.returns(interfaceConfigurationParcelToString(*interfaceGetCfgResult))
972 .withAutomaticDuration());
973 return binder::Status::ok();
974}
975
976binder::Status NetdNativeService::interfaceSetCfg(const InterfaceConfigurationParcel& cfg) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900977 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800978 auto entry = gLog.newEntry()
979 .prettyFunction(__PRETTY_FUNCTION__)
980 .arg(interfaceConfigurationParcelToString(cfg));
981
982 const auto& res = InterfaceController::setCfg(cfg);
983 RETURN_BINDER_STATUS_IF_NOT_OK(entry, res);
984
985 gLog.log(entry.withAutomaticDuration());
986 return binder::Status::ok();
987}
988
989binder::Status NetdNativeService::interfaceSetIPv6PrivacyExtensions(const std::string& ifName,
990 bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900991 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800992 int res = InterfaceController::setIPv6PrivacyExtensions(ifName.c_str(), enable);
Luke Huangf7782042018-08-08 13:13:04 +0800993 return statusFromErrcode(res);
994}
995
996binder::Status NetdNativeService::interfaceClearAddrs(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900997 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800998 int res = InterfaceController::clearAddrs(ifName.c_str());
Luke Huangf7782042018-08-08 13:13:04 +0800999 return statusFromErrcode(res);
1000}
1001
1002binder::Status NetdNativeService::interfaceSetEnableIPv6(const std::string& ifName, bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001003 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +08001004 int res = InterfaceController::setEnableIPv6(ifName.c_str(), enable);
Luke Huangf7782042018-08-08 13:13:04 +08001005 return statusFromErrcode(res);
1006}
1007
1008binder::Status NetdNativeService::interfaceSetMtu(const std::string& ifName, int32_t mtuValue) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001009 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +08001010 std::string mtu = std::to_string(mtuValue);
1011 int res = InterfaceController::setMtu(ifName.c_str(), mtu.c_str());
Luke Huangf7782042018-08-08 13:13:04 +08001012 return statusFromErrcode(res);
1013}
1014
Luke Huangb5733d72018-08-21 17:17:19 +08001015binder::Status NetdNativeService::tetherStart(const std::vector<std::string>& dhcpRanges) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001016 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001017 if (dhcpRanges.size() % 2 == 1) {
1018 return statusFromErrcode(-EINVAL);
1019 }
1020 int res = gCtls->tetherCtrl.startTethering(dhcpRanges);
Luke Huangb5733d72018-08-21 17:17:19 +08001021 return statusFromErrcode(res);
1022}
1023
1024binder::Status NetdNativeService::tetherStop() {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001025 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001026 int res = gCtls->tetherCtrl.stopTethering();
Luke Huangb5733d72018-08-21 17:17:19 +08001027 return statusFromErrcode(res);
1028}
1029
1030binder::Status NetdNativeService::tetherIsEnabled(bool* enabled) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001031 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001032 *enabled = gCtls->tetherCtrl.isTetheringStarted();
Luke Huangb5733d72018-08-21 17:17:19 +08001033 return binder::Status::ok();
1034}
1035
1036binder::Status NetdNativeService::tetherInterfaceAdd(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001037 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001038 int res = gCtls->tetherCtrl.tetherInterface(ifName.c_str());
Luke Huangb5733d72018-08-21 17:17:19 +08001039 return statusFromErrcode(res);
1040}
1041
1042binder::Status NetdNativeService::tetherInterfaceRemove(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001043 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001044 int res = gCtls->tetherCtrl.untetherInterface(ifName.c_str());
Luke Huangb5733d72018-08-21 17:17:19 +08001045 return statusFromErrcode(res);
1046}
1047
1048binder::Status NetdNativeService::tetherInterfaceList(std::vector<std::string>* ifList) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001049 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001050 for (const auto& ifname : gCtls->tetherCtrl.getTetheredInterfaceList()) {
1051 ifList->push_back(ifname);
1052 }
Luke Huangb5733d72018-08-21 17:17:19 +08001053 return binder::Status::ok();
1054}
1055
1056binder::Status NetdNativeService::tetherDnsSet(int32_t netId,
1057 const std::vector<std::string>& dnsAddrs) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001058 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001059 int res = gCtls->tetherCtrl.setDnsForwarders(netId, dnsAddrs);
Luke Huangb5733d72018-08-21 17:17:19 +08001060 return statusFromErrcode(res);
1061}
1062
1063binder::Status NetdNativeService::tetherDnsList(std::vector<std::string>* dnsList) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001064 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001065 for (const auto& fwdr : gCtls->tetherCtrl.getDnsForwarders()) {
1066 dnsList->push_back(fwdr);
1067 }
Luke Huangb5733d72018-08-21 17:17:19 +08001068 return binder::Status::ok();
1069}
1070
Luke Huangb670d162018-08-23 20:01:13 +08001071binder::Status NetdNativeService::networkAddRoute(int32_t netId, const std::string& ifName,
1072 const std::string& destination,
1073 const std::string& nextHop) {
1074 // Public methods of NetworkController are thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001075 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001076 bool legacy = false;
1077 uid_t uid = 0; // UID is only meaningful for legacy routes.
1078 int res = gCtls->netCtrl.addRoute(netId, ifName.c_str(), destination.c_str(),
1079 nextHop.empty() ? nullptr : nextHop.c_str(), legacy, uid);
Luke Huangb670d162018-08-23 20:01:13 +08001080 return statusFromErrcode(res);
1081}
1082
1083binder::Status NetdNativeService::networkRemoveRoute(int32_t netId, const std::string& ifName,
1084 const std::string& destination,
1085 const std::string& nextHop) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001086 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001087 bool legacy = false;
1088 uid_t uid = 0; // UID is only meaningful for legacy routes.
1089 int res = gCtls->netCtrl.removeRoute(netId, ifName.c_str(), destination.c_str(),
1090 nextHop.empty() ? nullptr : nextHop.c_str(), legacy, uid);
Luke Huangb670d162018-08-23 20:01:13 +08001091 return statusFromErrcode(res);
1092}
1093
1094binder::Status NetdNativeService::networkAddLegacyRoute(int32_t netId, const std::string& ifName,
1095 const std::string& destination,
1096 const std::string& nextHop, int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001097 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001098 bool legacy = true;
1099 int res = gCtls->netCtrl.addRoute(netId, ifName.c_str(), destination.c_str(),
1100 nextHop.empty() ? nullptr : nextHop.c_str(), legacy,
1101 (uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001102 return statusFromErrcode(res);
1103}
1104
1105binder::Status NetdNativeService::networkRemoveLegacyRoute(int32_t netId, const std::string& ifName,
1106 const std::string& destination,
1107 const std::string& nextHop,
1108 int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001109 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001110 bool legacy = true;
1111 int res = gCtls->netCtrl.removeRoute(netId, ifName.c_str(), destination.c_str(),
1112 nextHop.empty() ? nullptr : nextHop.c_str(), legacy,
1113 (uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001114 return statusFromErrcode(res);
1115}
1116
1117binder::Status NetdNativeService::networkGetDefault(int32_t* netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001118 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001119 *netId = gCtls->netCtrl.getDefaultNetwork();
Luke Huangb670d162018-08-23 20:01:13 +08001120 return binder::Status::ok();
1121}
1122
1123binder::Status NetdNativeService::networkSetDefault(int32_t netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001124 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001125 int res = gCtls->netCtrl.setDefaultNetwork(netId);
Luke Huangb670d162018-08-23 20:01:13 +08001126 return statusFromErrcode(res);
1127}
1128
1129binder::Status NetdNativeService::networkClearDefault() {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001130 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001131 unsigned netId = NETID_UNSET;
1132 int res = gCtls->netCtrl.setDefaultNetwork(netId);
Luke Huangb670d162018-08-23 20:01:13 +08001133 return statusFromErrcode(res);
1134}
1135
1136std::vector<uid_t> NetdNativeService::intsToUids(const std::vector<int32_t>& intUids) {
1137 return {begin(intUids), end(intUids)};
1138}
1139
1140Permission NetdNativeService::convertPermission(int32_t permission) {
1141 switch (permission) {
1142 case INetd::PERMISSION_NETWORK:
1143 return Permission::PERMISSION_NETWORK;
1144 case INetd::PERMISSION_SYSTEM:
1145 return Permission::PERMISSION_SYSTEM;
1146 default:
1147 return Permission::PERMISSION_NONE;
1148 }
1149}
1150
1151binder::Status NetdNativeService::networkSetPermissionForNetwork(int32_t netId,
1152 int32_t permission) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001153 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001154 std::vector<unsigned> netIds = {(unsigned) netId};
1155 int res = gCtls->netCtrl.setPermissionForNetworks(convertPermission(permission), netIds);
Luke Huangb670d162018-08-23 20:01:13 +08001156 return statusFromErrcode(res);
1157}
1158
1159binder::Status NetdNativeService::networkSetPermissionForUser(int32_t permission,
1160 const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001161 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001162 gCtls->netCtrl.setPermissionForUsers(convertPermission(permission), intsToUids(uids));
Luke Huangb670d162018-08-23 20:01:13 +08001163 return binder::Status::ok();
1164}
1165
1166binder::Status NetdNativeService::networkClearPermissionForUser(const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001167 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001168 Permission permission = Permission::PERMISSION_NONE;
1169 gCtls->netCtrl.setPermissionForUsers(permission, intsToUids(uids));
Luke Huangb670d162018-08-23 20:01:13 +08001170 return binder::Status::ok();
1171}
1172
1173binder::Status NetdNativeService::NetdNativeService::networkSetProtectAllow(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001174 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001175 std::vector<uid_t> uids = {(uid_t) uid};
1176 gCtls->netCtrl.allowProtect(uids);
Luke Huangb670d162018-08-23 20:01:13 +08001177 return binder::Status::ok();
1178}
1179
1180binder::Status NetdNativeService::networkSetProtectDeny(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001181 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001182 std::vector<uid_t> uids = {(uid_t) uid};
1183 gCtls->netCtrl.denyProtect(uids);
Luke Huangb670d162018-08-23 20:01:13 +08001184 return binder::Status::ok();
1185}
1186
1187binder::Status NetdNativeService::networkCanProtect(int32_t uid, bool* ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001188 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001189 *ret = gCtls->netCtrl.canProtect((uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001190 return binder::Status::ok();
1191}
1192
Chenbo Feng48eaed32018-12-26 17:40:21 -08001193binder::Status NetdNativeService::trafficSetNetPermForUids(int32_t permission,
1194 const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001195 ENFORCE_NETWORK_STACK_PERMISSIONS();
Chenbo Feng48eaed32018-12-26 17:40:21 -08001196 auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__).arg(permission).arg(uids);
1197 gCtls->trafficCtrl.setPermissionForUids(permission, intsToUids(uids));
1198 gLog.log(entry.withAutomaticDuration());
1199 return binder::Status::ok();
1200}
1201
Luke Huange64fa382018-07-24 16:38:22 +08001202binder::Status NetdNativeService::firewallSetFirewallType(int32_t firewallType) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001203 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001204 auto type = static_cast<FirewallType>(firewallType);
1205
1206 int res = gCtls->firewallCtrl.setFirewallType(type);
Luke Huange64fa382018-07-24 16:38:22 +08001207 return statusFromErrcode(res);
1208}
1209
1210binder::Status NetdNativeService::firewallSetInterfaceRule(const std::string& ifName,
1211 int32_t firewallRule) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001212 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001213 auto rule = static_cast<FirewallRule>(firewallRule);
1214
1215 int res = gCtls->firewallCtrl.setInterfaceRule(ifName.c_str(), rule);
Luke Huange64fa382018-07-24 16:38:22 +08001216 return statusFromErrcode(res);
1217}
1218
1219binder::Status NetdNativeService::firewallSetUidRule(int32_t childChain, int32_t uid,
1220 int32_t firewallRule) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001221 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001222 auto chain = static_cast<ChildChain>(childChain);
1223 auto rule = static_cast<FirewallRule>(firewallRule);
1224
1225 int res = gCtls->firewallCtrl.setUidRule(chain, uid, rule);
Luke Huange64fa382018-07-24 16:38:22 +08001226 return statusFromErrcode(res);
1227}
1228
1229binder::Status NetdNativeService::firewallEnableChildChain(int32_t childChain, bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001230 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001231 auto chain = static_cast<ChildChain>(childChain);
1232
1233 int res = gCtls->firewallCtrl.enableChildChains(chain, enable);
Luke Huange64fa382018-07-24 16:38:22 +08001234 return statusFromErrcode(res);
1235}
1236
Luke Huang19b49c52018-10-22 12:12:05 +09001237binder::Status NetdNativeService::tetherAddForward(const std::string& intIface,
1238 const std::string& extIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001239 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang19b49c52018-10-22 12:12:05 +09001240
1241 int res = gCtls->tetherCtrl.enableNat(intIface.c_str(), extIface.c_str());
Luke Huang19b49c52018-10-22 12:12:05 +09001242 return statusFromErrcode(res);
1243}
1244
1245binder::Status NetdNativeService::tetherRemoveForward(const std::string& intIface,
1246 const std::string& extIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001247 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangae038f82018-11-05 11:17:31 +09001248 int res = gCtls->tetherCtrl.disableNat(intIface.c_str(), extIface.c_str());
Luke Huang19b49c52018-10-22 12:12:05 +09001249 return statusFromErrcode(res);
1250}
1251
Chenbo Fengf5663d82018-11-08 16:10:48 -08001252binder::Status NetdNativeService::setTcpRWmemorySize(const std::string& rmemValues,
1253 const std::string& wmemValues) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001254 ENFORCE_NETWORK_STACK_PERMISSIONS();
Chenbo Fengf5663d82018-11-08 16:10:48 -08001255 if (!WriteStringToFile(rmemValues, TCP_RMEM_PROC_FILE)) {
1256 int ret = -errno;
Chenbo Fengf5663d82018-11-08 16:10:48 -08001257 return statusFromErrcode(ret);
1258 }
1259
1260 if (!WriteStringToFile(wmemValues, TCP_WMEM_PROC_FILE)) {
1261 int ret = -errno;
Chenbo Fengf5663d82018-11-08 16:10:48 -08001262 return statusFromErrcode(ret);
1263 }
Chenbo Fengf5663d82018-11-08 16:10:48 -08001264 return binder::Status::ok();
1265}
1266
nuccachenf52f7a52018-07-17 18:07:23 +08001267binder::Status NetdNativeService::getPrefix64(int netId, std::string* _aidl_return) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001268 ENFORCE_NETWORK_STACK_PERMISSIONS();
nuccachenf52f7a52018-07-17 18:07:23 +08001269 netdutils::IPPrefix prefix{};
1270 int err = gCtls->resolverCtrl.getPrefix64(netId, &prefix);
1271 if (err != 0) {
1272 return binder::Status::fromServiceSpecificError(
1273 -err, String8::format("ResolverController error: %s", strerror(-err)));
1274 }
1275 *_aidl_return = prefix.toString();
1276 return binder::Status::ok();
1277}
1278
Luke Huang528af602018-08-29 19:06:05 +08001279binder::Status NetdNativeService::registerUnsolicitedEventListener(
1280 const android::sp<android::net::INetdUnsolicitedEventListener>& listener) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001281 ENFORCE_NETWORK_STACK_PERMISSIONS();
Bernie Innocenti9ee088d2019-02-01 17:14:32 +09001282 auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__);
1283 gCtls->eventReporter.registerUnsolEventListener(listener);
Luke Huang528af602018-08-29 19:06:05 +08001284 gLog.log(entry.withAutomaticDuration());
1285 return binder::Status::ok();
1286}
1287
Lorenzo Colittie4d626e2016-02-02 17:19:04 +09001288} // namespace net
1289} // namespace android