blob: fe575df46ba78d70b25b2f0573bee91efda60393 [file] [log] [blame]
Lorenzo Colittie4d626e2016-02-02 17:19:04 +09001/**
2 * Copyright (c) 2016, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "Netd"
18
Luke Huangcaebcbb2018-09-27 20:37:14 +080019#include <cinttypes>
Xiao Ma33d562a2018-12-16 16:27:38 +090020#include <numeric>
Ben Schwartz4204ecf2017-10-02 12:35:48 -040021#include <set>
Xiao Ma64b15b72019-03-20 11:33:15 +090022#include <string>
Erik Kline38e51f12018-09-06 20:14:44 +090023#include <tuple>
Lorenzo Colitti89faa342016-02-26 11:38:47 +090024#include <vector>
25
Chenbo Fengf5663d82018-11-08 16:10:48 -080026#include <android-base/file.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090027#include <android-base/stringprintf.h>
Ben Schwartz4204ecf2017-10-02 12:35:48 -040028#include <android-base/strings.h>
Robin Lee2cf56172016-09-13 18:55:42 +090029#include <cutils/properties.h>
Logan Chien3f461482018-04-23 14:31:32 +080030#include <log/log.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090031#include <utils/Errors.h>
Pierre Imaibeedec32016-04-13 06:44:51 +090032#include <utils/String16.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090033
34#include <binder/IPCThreadState.h>
35#include <binder/IServiceManager.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090036
Xiao Ma33d562a2018-12-16 16:27:38 +090037#include <json/value.h>
Jeongik Cha374ca5b2019-03-22 12:11:25 +090038#include <json/writer.h>
Ben Schwartze7601812017-04-28 16:38:29 -040039
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 Huang0e5e69d2019-03-06 15:42:38 +080045#include "OemNetdListener.h"
Luke Huangb670d162018-08-23 20:01:13 +080046#include "Permission.h"
Erik Kline85890042018-05-25 19:19:11 +090047#include "Process.h"
Robin Leeb8087362016-03-30 18:43:08 +010048#include "RouteController.h"
Lorenzo Colitti563d98b2016-04-24 13:13:14 +090049#include "SockDiag.h"
Robin Leeb8087362016-03-30 18:43:08 +010050#include "UidRanges.h"
Xiao Ma33d562a2018-12-16 16:27:38 +090051#include "android/net/BnNetd.h"
Luke Huangb257d612019-03-14 21:19:13 +080052#include "netdutils/DumpWriter.h"
Bernie Innocenti189eb502018-10-01 23:10:18 +090053#include "netid_client.h" // NETID_UNSET
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090054
55using android::base::StringPrintf;
Chenbo Fengf5663d82018-11-08 16:10:48 -080056using android::base::WriteStringToFile;
Luke Huangcaebcbb2018-09-27 20:37:14 +080057using android::net::TetherStatsParcel;
Luke Huang94658ac2018-10-18 19:35:12 +090058using android::net::UidRangeParcel;
Luke Huangb257d612019-03-14 21:19:13 +080059using android::netdutils::DumpWriter;
60using android::netdutils::ScopedIndent;
Luke Huange203a152018-11-23 11:47:28 +080061using android::os::ParcelFileDescriptor;
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090062
63namespace android {
64namespace net {
65
66namespace {
Erik Klineb31fd692018-06-06 20:50:11 +090067const char OPT_SHORT[] = "--short";
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090068
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090069binder::Status checkAnyPermission(const std::vector<const char*>& permissions) {
Luke Huanga38b65c2018-09-26 16:31:03 +080070 pid_t pid = IPCThreadState::self()->getCallingPid();
71 uid_t uid = IPCThreadState::self()->getCallingUid();
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090072
Luke Huanga38b65c2018-09-26 16:31:03 +080073 // If the caller is the system UID, don't check permissions.
74 // Otherwise, if the system server's binder thread pool is full, and all the threads are
75 // blocked on a thread that's waiting for us to complete, we deadlock. http://b/69389492
76 //
77 // From a security perspective, there is currently no difference, because:
78 // 1. The only permissions we check in netd's binder interface are CONNECTIVITY_INTERNAL
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090079 // and NETWORK_STACK, which the system server always has (or MAINLINE_NETWORK_STACK, which
80 // is equivalent to having both CONNECTIVITY_INTERNAL and NETWORK_STACK).
Luke Huanga38b65c2018-09-26 16:31:03 +080081 // 2. AID_SYSTEM always has all permissions. See ActivityManager#checkComponentPermission.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090082 if (uid == AID_SYSTEM) {
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090083 return binder::Status::ok();
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090084 }
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090085
86 for (const char* permission : permissions) {
87 if (checkPermission(String16(permission), pid, uid)) {
88 return binder::Status::ok();
89 }
90 }
91
92 auto err = StringPrintf("UID %d / PID %d does not have any of the following permissions: %s",
93 uid, pid, android::base::Join(permissions, ',').c_str());
94 return binder::Status::fromExceptionCode(binder::Status::EX_SECURITY, err.c_str());
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090095}
96
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090097#define ENFORCE_ANY_PERMISSION(...) \
98 do { \
99 binder::Status status = checkAnyPermission({__VA_ARGS__}); \
100 if (!status.isOk()) { \
101 return status; \
102 } \
103 } while (0)
Robin Lee2cf56172016-09-13 18:55:42 +0900104
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900105#define NETD_LOCKING_RPC(lock, ... /* permissions */) \
106 ENFORCE_ANY_PERMISSION(__VA_ARGS__); \
Bernie Innocentiabf8a342018-08-10 15:17:16 +0900107 std::lock_guard _lock(lock);
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900108
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900109#define NETD_BIG_LOCK_RPC(... /* permissions */) NETD_LOCKING_RPC(gBigNetdLock, __VA_ARGS__)
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900110
Luke Huangf7782042018-08-08 13:13:04 +0800111#define RETURN_BINDER_STATUS_IF_NOT_OK(logEntry, res) \
112 do { \
113 if (!isOk((res))) { \
114 logErrorStatus((logEntry), (res)); \
115 return asBinderStatus((res)); \
116 } \
117 } while (0)
118
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900119#define ENFORCE_INTERNAL_PERMISSIONS() \
120 ENFORCE_ANY_PERMISSION(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK)
121
122#define ENFORCE_NETWORK_STACK_PERMISSIONS() \
123 ENFORCE_ANY_PERMISSION(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK)
124
Luke Huangf7782042018-08-08 13:13:04 +0800125void logErrorStatus(netdutils::LogEntry& logEntry, const netdutils::Status& status) {
126 gLog.log(logEntry.returns(status.code()).withAutomaticDuration());
127}
128
Bernie Innocenti97f388f2018-10-16 19:17:08 +0900129binder::Status asBinderStatus(const netdutils::Status& status) {
130 if (isOk(status)) {
131 return binder::Status::ok();
132 }
133 return binder::Status::fromServiceSpecificError(status.code(), status.msg().c_str());
134}
135
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900136inline binder::Status statusFromErrcode(int ret) {
137 if (ret) {
138 return binder::Status::fromServiceSpecificError(-ret, strerror(-ret));
139 }
140 return binder::Status::ok();
141}
142
Erik Klineb31fd692018-06-06 20:50:11 +0900143bool contains(const Vector<String16>& words, const String16& word) {
144 for (const auto& w : words) {
145 if (w == word) return true;
146 }
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900147
Erik Klineb31fd692018-06-06 20:50:11 +0900148 return false;
149}
150
Xiao Ma64b15b72019-03-20 11:33:15 +0900151std::string exceptionToString(int32_t exception) {
152 std::string ret = "UnknownException";
153 switch (exception) {
154 case binder::Status::EX_SECURITY:
155 ret = "SecurityException";
156 break;
157 case binder::Status::EX_BAD_PARCELABLE:
158 ret = "BadParcelableException";
159 break;
160 case binder::Status::EX_ILLEGAL_ARGUMENT:
161 ret = "IllegalArgumentException";
162 break;
163 case binder::Status::EX_NETWORK_MAIN_THREAD:
164 ret = "NetworkMainThreadException";
165 break;
166 case binder::Status::EX_UNSUPPORTED_OPERATION:
167 ret = "UnsupportedOperationException";
168 break;
169 case binder::Status::EX_SERVICE_SPECIFIC:
170 ret = "ServiceSpecificException";
171 break;
172 case binder::Status::EX_PARCELABLE:
173 ret = "ParcelableException";
174 break;
175 case binder::Status::EX_HAS_REPLY_HEADER:
176 ret = "HasReplyHeaderException";
177 break;
178 case binder::Status::EX_TRANSACTION_FAILED:
179 ret = "TransactionFailedException";
180 break;
181 }
182 return ret;
183}
184
Erik Klineb31fd692018-06-06 20:50:11 +0900185} // namespace
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900186
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900187status_t NetdNativeService::start() {
188 IPCThreadState::self()->disableBackgroundScheduling(true);
Erik Klineb31fd692018-06-06 20:50:11 +0900189 const status_t ret = BinderService<NetdNativeService>::publish();
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900190 if (ret != android::OK) {
191 return ret;
192 }
193 sp<ProcessState> ps(ProcessState::self());
194 ps->startThreadPool();
195 ps->giveThreadPoolName();
Xiao Ma33d562a2018-12-16 16:27:38 +0900196
197 // register log callback to BnNetd::logFunc
198 BnNetd::logFunc = [](const Json::Value& logTransaction) {
Xiao Ma64b15b72019-03-20 11:33:15 +0900199 using namespace std::string_literals;
200
Xiao Ma33d562a2018-12-16 16:27:38 +0900201 bool hasReturnArgs;
202 std::string output;
Xiao Ma33d562a2018-12-16 16:27:38 +0900203 const Json::Value& returnArgs = logTransaction["_aidl_return"];
Xiao Ma64b15b72019-03-20 11:33:15 +0900204 const Json::Value& inputArgsArray = logTransaction["input_args"];
205 const int exceptionCode = logTransaction["binder_status"]["exception_code"].asInt();
Xiao Ma33d562a2018-12-16 16:27:38 +0900206
207 hasReturnArgs = !returnArgs.empty();
Xiao Ma64b15b72019-03-20 11:33:15 +0900208 output.append(logTransaction["method_name"].asString() + "("s);
Xiao Ma33d562a2018-12-16 16:27:38 +0900209
210 // input args
Jeongik Cha374ca5b2019-03-22 12:11:25 +0900211 Json::FastWriter fastWriter;
212 fastWriter.omitEndingLineFeed();
Xiao Ma64b15b72019-03-20 11:33:15 +0900213 for (Json::Value::ArrayIndex i = 0; i < inputArgsArray.size(); ++i) {
214 std::string value = fastWriter.write(inputArgsArray[i]["value"]);
Xiao Ma33d562a2018-12-16 16:27:38 +0900215 output.append(value);
Xiao Ma64b15b72019-03-20 11:33:15 +0900216 if (i != inputArgsArray.size() - 1) {
217 output.append(", "s);
Xiao Ma33d562a2018-12-16 16:27:38 +0900218 }
219 }
Xiao Ma64b15b72019-03-20 11:33:15 +0900220 output.append(")"s);
221 if (hasReturnArgs || exceptionCode != binder::Status::EX_NONE) output.append(" -> "s);
222 // return status
223 if (!binder::Status::fromExceptionCode(exceptionCode).isOk()) {
224 // an exception occurred
225 if (exceptionCode == binder::Status::EX_SERVICE_SPECIFIC) {
226 output.append(StringPrintf(
227 "%s(%d, \"%s\")", exceptionToString(exceptionCode).c_str(),
228 logTransaction["binder_status"]["service_specific_error_code"].asInt(),
229 logTransaction["binder_status"]["exception_message"].asString().c_str()));
230 } else {
231 output.append(StringPrintf(
232 "%s(%d, \"%s\")", exceptionToString(exceptionCode).c_str(), exceptionCode,
233 logTransaction["binder_status"]["exception_message"].asString().c_str()));
234 }
235 }
Xiao Ma33d562a2018-12-16 16:27:38 +0900236 // return args
237 if (hasReturnArgs) {
Xiao Ma64b15b72019-03-20 11:33:15 +0900238 output.append(StringPrintf("{%s}", fastWriter.write(returnArgs).c_str()));
Xiao Ma33d562a2018-12-16 16:27:38 +0900239 }
240 // duration time
Xiao Ma64b15b72019-03-20 11:33:15 +0900241 output.append(StringPrintf(" <%.2fms>", logTransaction["duration_ms"].asFloat()));
Xiao Ma33d562a2018-12-16 16:27:38 +0900242 gLog.info("%s", output.c_str());
243 };
244
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900245 return android::OK;
246}
247
Hugo Benichi7b314e12018-01-15 21:54:00 +0900248status_t NetdNativeService::dump(int fd, const Vector<String16> &args) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900249 const binder::Status dump_permission = checkAnyPermission({PERM_DUMP});
Erik Kline2d3a1632016-03-15 16:33:48 +0900250 if (!dump_permission.isOk()) {
251 const String8 msg(dump_permission.toString8());
252 write(fd, msg.string(), msg.size());
253 return PERMISSION_DENIED;
254 }
255
256 // This method does not grab any locks. If individual classes need locking
257 // their dump() methods MUST handle locking appropriately.
Hugo Benichi7b314e12018-01-15 21:54:00 +0900258
Erik Kline2d3a1632016-03-15 16:33:48 +0900259 DumpWriter dw(fd);
Hugo Benichi7b314e12018-01-15 21:54:00 +0900260
261 if (!args.isEmpty() && args[0] == TcpSocketMonitor::DUMP_KEYWORD) {
262 dw.blankline();
263 gCtls->tcpSocketMonitor.dump(dw);
264 dw.blankline();
265 return NO_ERROR;
266 }
267
Chenbo Fengef297172018-03-26 10:53:33 -0700268 if (!args.isEmpty() && args[0] == TrafficController::DUMP_KEYWORD) {
269 dw.blankline();
270 gCtls->trafficCtrl.dump(dw, true);
271 dw.blankline();
272 return NO_ERROR;
273 }
274
Erik Kline85890042018-05-25 19:19:11 +0900275 process::dump(dw);
Erik Kline2d3a1632016-03-15 16:33:48 +0900276 dw.blankline();
277 gCtls->netCtrl.dump(dw);
278 dw.blankline();
279
Chenbo Fengef297172018-03-26 10:53:33 -0700280 gCtls->trafficCtrl.dump(dw, false);
281 dw.blankline();
282
Benedict Wongaf855432018-05-10 17:07:37 -0700283 gCtls->xfrmCtrl.dump(dw);
284 dw.blankline();
285
Maciej Żenczykowski55262712019-03-29 23:44:56 -0700286 gCtls->clatdCtrl.dump(dw);
287 dw.blankline();
288
Erik Klineb31fd692018-06-06 20:50:11 +0900289 {
290 ScopedIndent indentLog(dw);
291 if (contains(args, String16(OPT_SHORT))) {
292 dw.println("Log: <omitted>");
293 } else {
294 dw.println("Log:");
295 ScopedIndent indentLogEntries(dw);
296 gLog.forEachEntry([&dw](const std::string& entry) mutable { dw.println(entry); });
297 }
298 dw.blankline();
299 }
300
Luke Huang528af602018-08-29 19:06:05 +0800301 {
302 ScopedIndent indentLog(dw);
303 if (contains(args, String16(OPT_SHORT))) {
304 dw.println("UnsolicitedLog: <omitted>");
305 } else {
306 dw.println("UnsolicitedLog:");
307 ScopedIndent indentLogEntries(dw);
308 gUnsolicitedLog.forEachEntry(
309 [&dw](const std::string& entry) mutable { dw.println(entry); });
310 }
311 dw.blankline();
312 }
313
Erik Kline2d3a1632016-03-15 16:33:48 +0900314 return NO_ERROR;
315}
316
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900317binder::Status NetdNativeService::isAlive(bool *alive) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900318 NETD_BIG_LOCK_RPC(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900319
320 *alive = true;
Erik Klineb31fd692018-06-06 20:50:11 +0900321
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900322 return binder::Status::ok();
323}
324
Erik Klinef52d4522018-03-14 15:01:46 +0900325binder::Status NetdNativeService::firewallReplaceUidChain(const std::string& chainName,
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900326 bool isWhitelist, const std::vector<int32_t>& uids, bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900327 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_CONNECTIVITY_INTERNAL,
328 PERM_MAINLINE_NETWORK_STACK);
Erik Klinef52d4522018-03-14 15:01:46 +0900329 int err = gCtls->firewallCtrl.replaceUidChain(chainName, isWhitelist, uids);
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900330 *ret = (err == 0);
331 return binder::Status::ok();
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900332}
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900333
334binder::Status NetdNativeService::bandwidthEnableDataSaver(bool enable, bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900335 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_CONNECTIVITY_INTERNAL,
336 PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900337 int err = gCtls->bandwidthCtrl.enableDataSaver(enable);
338 *ret = (err == 0);
339 return binder::Status::ok();
340}
341
Luke Huang531f5d32018-08-03 15:19:05 +0800342binder::Status NetdNativeService::bandwidthSetInterfaceQuota(const std::string& ifName,
343 int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900344 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800345 int res = gCtls->bandwidthCtrl.setInterfaceQuota(ifName, bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800346 return statusFromErrcode(res);
347}
348
349binder::Status NetdNativeService::bandwidthRemoveInterfaceQuota(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900350 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800351 int res = gCtls->bandwidthCtrl.removeInterfaceQuota(ifName);
Luke Huang531f5d32018-08-03 15:19:05 +0800352 return statusFromErrcode(res);
353}
354
355binder::Status NetdNativeService::bandwidthSetInterfaceAlert(const std::string& ifName,
356 int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900357 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800358 int res = gCtls->bandwidthCtrl.setInterfaceAlert(ifName, bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800359 return statusFromErrcode(res);
360}
361
362binder::Status NetdNativeService::bandwidthRemoveInterfaceAlert(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900363 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800364 int res = gCtls->bandwidthCtrl.removeInterfaceAlert(ifName);
Luke Huang531f5d32018-08-03 15:19:05 +0800365 return statusFromErrcode(res);
366}
367
368binder::Status NetdNativeService::bandwidthSetGlobalAlert(int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900369 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800370 int res = gCtls->bandwidthCtrl.setGlobalAlert(bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800371 return statusFromErrcode(res);
372}
373
374binder::Status NetdNativeService::bandwidthAddNaughtyApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900375 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800376 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
377 int res = gCtls->bandwidthCtrl.addNaughtyApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800378 return statusFromErrcode(res);
379}
380
381binder::Status NetdNativeService::bandwidthRemoveNaughtyApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900382 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800383 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
384 int res = gCtls->bandwidthCtrl.removeNaughtyApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800385 return statusFromErrcode(res);
386}
387
388binder::Status NetdNativeService::bandwidthAddNiceApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900389 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800390 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
391 int res = gCtls->bandwidthCtrl.addNiceApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800392 return statusFromErrcode(res);
393}
394
395binder::Status NetdNativeService::bandwidthRemoveNiceApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900396 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800397 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
398 int res = gCtls->bandwidthCtrl.removeNiceApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800399 return statusFromErrcode(res);
400}
401
Luke Huangb670d162018-08-23 20:01:13 +0800402binder::Status NetdNativeService::networkCreatePhysical(int32_t netId, int32_t permission) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900403 ENFORCE_INTERNAL_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +0800404 int ret = gCtls->netCtrl.createPhysicalNetwork(netId, convertPermission(permission));
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900405 return statusFromErrcode(ret);
406}
407
cken67cd14c2018-12-05 17:26:59 +0900408binder::Status NetdNativeService::networkCreateVpn(int32_t netId, bool secure) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900409 ENFORCE_NETWORK_STACK_PERMISSIONS();
cken67cd14c2018-12-05 17:26:59 +0900410 int ret = gCtls->netCtrl.createVirtualNetwork(netId, secure);
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900411 return statusFromErrcode(ret);
412}
413
414binder::Status NetdNativeService::networkDestroy(int32_t netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900415 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangd33a8f42019-03-14 16:10:04 +0800416 // NetworkController::destroyNetwork is thread-safe.
Mike Yu4fe1b9c2019-01-29 17:50:19 +0800417 const int ret = gCtls->netCtrl.destroyNetwork(netId);
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900418 return statusFromErrcode(ret);
419}
420
421binder::Status NetdNativeService::networkAddInterface(int32_t netId, const std::string& iface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900422 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900423 int ret = gCtls->netCtrl.addInterfaceToNetwork(netId, iface.c_str());
424 return statusFromErrcode(ret);
425}
426
427binder::Status NetdNativeService::networkRemoveInterface(int32_t netId, const std::string& iface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900428 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900429 int ret = gCtls->netCtrl.removeInterfaceFromNetwork(netId, iface.c_str());
430 return statusFromErrcode(ret);
431}
432
Luke Huang94658ac2018-10-18 19:35:12 +0900433binder::Status NetdNativeService::networkAddUidRanges(
434 int32_t netId, const std::vector<UidRangeParcel>& uidRangeArray) {
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900435 // NetworkController::addUsersToNetwork is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900436 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900437 int ret = gCtls->netCtrl.addUsersToNetwork(netId, UidRanges(uidRangeArray));
438 return statusFromErrcode(ret);
439}
440
Luke Huang94658ac2018-10-18 19:35:12 +0900441binder::Status NetdNativeService::networkRemoveUidRanges(
442 int32_t netId, const std::vector<UidRangeParcel>& uidRangeArray) {
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900443 // NetworkController::removeUsersFromNetwork is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900444 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900445 int ret = gCtls->netCtrl.removeUsersFromNetwork(netId, UidRanges(uidRangeArray));
446 return statusFromErrcode(ret);
447}
448
Luke Huang94658ac2018-10-18 19:35:12 +0900449binder::Status NetdNativeService::networkRejectNonSecureVpn(
450 bool add, const std::vector<UidRangeParcel>& uidRangeArray) {
Robin Leeb8087362016-03-30 18:43:08 +0100451 // TODO: elsewhere RouteController is only used from the tethering and network controllers, so
452 // it should be possible to use the same lock as NetworkController. However, every call through
453 // the CommandListener "network" command will need to hold this lock too, not just the ones that
454 // read/modify network internal state (that is sufficient for ::dump() because it doesn't
455 // look at routes, but it's not enough here).
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900456 NETD_BIG_LOCK_RPC(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900457 UidRanges uidRanges(uidRangeArray);
Robin Leeb8087362016-03-30 18:43:08 +0100458
459 int err;
460 if (add) {
461 err = RouteController::addUsersToRejectNonSecureNetworkRule(uidRanges);
462 } else {
463 err = RouteController::removeUsersFromRejectNonSecureNetworkRule(uidRanges);
464 }
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900465 return statusFromErrcode(err);
Robin Leeb8087362016-03-30 18:43:08 +0100466}
467
Luke Huang94658ac2018-10-18 19:35:12 +0900468binder::Status NetdNativeService::socketDestroy(const std::vector<UidRangeParcel>& uids,
469 const std::vector<int32_t>& skipUids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900470 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900471
472 SockDiag sd;
473 if (!sd.open()) {
474 return binder::Status::fromServiceSpecificError(EIO,
475 String8("Could not open SOCK_DIAG socket"));
476 }
477
478 UidRanges uidRanges(uids);
Lorenzo Colittie5c3c992016-07-26 17:53:50 +0900479 int err = sd.destroySockets(uidRanges, std::set<uid_t>(skipUids.begin(), skipUids.end()),
480 true /* excludeLoopback */);
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900481 if (err) {
482 return binder::Status::fromServiceSpecificError(-err,
483 String8::format("destroySockets: %s", strerror(-err)));
484 }
Pierre Imaibeedec32016-04-13 06:44:51 +0900485 return binder::Status::ok();
486}
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900487
Erik Klinef48e4dd2016-07-18 04:02:07 +0900488binder::Status NetdNativeService::tetherApplyDnsInterfaces(bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900489 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Erik Klinef48e4dd2016-07-18 04:02:07 +0900490 *ret = gCtls->tetherCtrl.applyDnsInterfaces();
491 return binder::Status::ok();
492}
493
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900494namespace {
495
Luke Huangcaebcbb2018-09-27 20:37:14 +0800496void tetherAddStatsByInterface(TetherController::TetherStats* tetherStatsParcel,
497 const TetherController::TetherStats& tetherStats) {
498 if (tetherStatsParcel->extIface == tetherStats.extIface) {
499 tetherStatsParcel->rxBytes += tetherStats.rxBytes;
500 tetherStatsParcel->rxPackets += tetherStats.rxPackets;
501 tetherStatsParcel->txBytes += tetherStats.txBytes;
502 tetherStatsParcel->txPackets += tetherStats.txPackets;
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900503 }
Luke Huangcaebcbb2018-09-27 20:37:14 +0800504}
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900505
Luke Huangcaebcbb2018-09-27 20:37:14 +0800506TetherStatsParcel toTetherStatsParcel(const TetherController::TetherStats& stats) {
507 TetherStatsParcel result;
508 result.iface = stats.extIface;
509 result.rxBytes = stats.rxBytes;
510 result.rxPackets = stats.rxPackets;
511 result.txBytes = stats.txBytes;
512 result.txPackets = stats.txPackets;
513 return result;
514}
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900515
Luke Huangcaebcbb2018-09-27 20:37:14 +0800516void setTetherStatsParcelVecByInterface(std::vector<TetherStatsParcel>* tetherStatsVec,
517 const TetherController::TetherStatsList& statsList) {
518 std::map<std::string, TetherController::TetherStats> statsMap;
519 for (const auto& stats : statsList) {
520 auto iter = statsMap.find(stats.extIface);
521 if (iter != statsMap.end()) {
522 tetherAddStatsByInterface(&(iter->second), stats);
523 } else {
524 statsMap.insert(
525 std::pair<std::string, TetherController::TetherStats>(stats.extIface, stats));
526 }
527 }
528 for (auto iter = statsMap.begin(); iter != statsMap.end(); iter++) {
529 tetherStatsVec->push_back(toTetherStatsParcel(iter->second));
530 }
531}
532
533std::vector<std::string> tetherStatsParcelVecToStringVec(std::vector<TetherStatsParcel>* tVec) {
534 std::vector<std::string> result;
535 for (const auto& t : *tVec) {
536 result.push_back(StringPrintf("%s:%" PRId64 ",%" PRId64 ",%" PRId64 ",%" PRId64,
537 t.iface.c_str(), t.rxBytes, t.rxPackets, t.txBytes,
538 t.txPackets));
539 }
540 return result;
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900541}
542
543} // namespace
544
Luke Huangcaebcbb2018-09-27 20:37:14 +0800545binder::Status NetdNativeService::tetherGetStats(
546 std::vector<TetherStatsParcel>* tetherStatsParcelVec) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900547 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti5192bf72017-09-04 13:30:59 +0900548 const auto& statsList = gCtls->tetherCtrl.getTetherStats();
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900549 if (!isOk(statsList)) {
Nathan Harold28ccfef2018-03-16 19:02:47 -0700550 return asBinderStatus(statsList);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900551 }
Luke Huangcaebcbb2018-09-27 20:37:14 +0800552 setTetherStatsParcelVecByInterface(tetherStatsParcelVec, statsList.value());
553 auto statsResults = tetherStatsParcelVecToStringVec(tetherStatsParcelVec);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900554 return binder::Status::ok();
555}
556
Erik Kline53c20882016-08-02 15:22:53 +0900557binder::Status NetdNativeService::interfaceAddAddress(const std::string &ifName,
558 const std::string &addrString, int prefixLength) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900559 ENFORCE_INTERNAL_PERMISSIONS();
Erik Kline53c20882016-08-02 15:22:53 +0900560 const int err = InterfaceController::addAddress(
561 ifName.c_str(), addrString.c_str(), prefixLength);
562 if (err != 0) {
563 return binder::Status::fromServiceSpecificError(-err,
564 String8::format("InterfaceController error: %s", strerror(-err)));
565 }
566 return binder::Status::ok();
567}
568
569binder::Status NetdNativeService::interfaceDelAddress(const std::string &ifName,
570 const std::string &addrString, int prefixLength) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900571 ENFORCE_INTERNAL_PERMISSIONS();
Erik Kline53c20882016-08-02 15:22:53 +0900572 const int err = InterfaceController::delAddress(
573 ifName.c_str(), addrString.c_str(), prefixLength);
574 if (err != 0) {
575 return binder::Status::fromServiceSpecificError(-err,
576 String8::format("InterfaceController error: %s", strerror(-err)));
577 }
578 return binder::Status::ok();
579}
580
Erik Kline38e51f12018-09-06 20:14:44 +0900581namespace {
Erik Kline55b06f82016-07-04 09:57:18 +0900582
Erik Kline38e51f12018-09-06 20:14:44 +0900583std::tuple<binder::Status, const char*, const char*> getPathComponents(int32_t ipversion,
584 int32_t category) {
585 const char* ipversionStr = nullptr;
586 switch (ipversion) {
Erik Kline55b06f82016-07-04 09:57:18 +0900587 case INetd::IPV4:
Erik Kline38e51f12018-09-06 20:14:44 +0900588 ipversionStr = "ipv4";
Erik Kline55b06f82016-07-04 09:57:18 +0900589 break;
590 case INetd::IPV6:
Erik Kline38e51f12018-09-06 20:14:44 +0900591 ipversionStr = "ipv6";
Erik Kline55b06f82016-07-04 09:57:18 +0900592 break;
593 default:
Erik Kline38e51f12018-09-06 20:14:44 +0900594 return {binder::Status::fromServiceSpecificError(EAFNOSUPPORT, "Bad IP version"),
595 nullptr, nullptr};
Erik Kline55b06f82016-07-04 09:57:18 +0900596 }
597
Erik Kline38e51f12018-09-06 20:14:44 +0900598 const char* whichStr = nullptr;
599 switch (category) {
Erik Kline55b06f82016-07-04 09:57:18 +0900600 case INetd::CONF:
601 whichStr = "conf";
602 break;
603 case INetd::NEIGH:
604 whichStr = "neigh";
605 break;
606 default:
Erik Kline38e51f12018-09-06 20:14:44 +0900607 return {binder::Status::fromServiceSpecificError(EINVAL, "Bad category"), nullptr,
608 nullptr};
Erik Kline55b06f82016-07-04 09:57:18 +0900609 }
610
Erik Kline38e51f12018-09-06 20:14:44 +0900611 return {binder::Status::ok(), ipversionStr, whichStr};
612}
613
614} // namespace
615
616binder::Status NetdNativeService::getProcSysNet(int32_t ipversion, int32_t which,
617 const std::string& ifname,
618 const std::string& parameter, std::string* value) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900619 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline38e51f12018-09-06 20:14:44 +0900620 const auto pathParts = getPathComponents(ipversion, which);
621 const auto& pathStatus = std::get<0>(pathParts);
622 if (!pathStatus.isOk()) {
Erik Kline38e51f12018-09-06 20:14:44 +0900623 return pathStatus;
Erik Kline55b06f82016-07-04 09:57:18 +0900624 }
Erik Kline38e51f12018-09-06 20:14:44 +0900625
626 const int err = InterfaceController::getParameter(std::get<1>(pathParts),
627 std::get<2>(pathParts), ifname.c_str(),
628 parameter.c_str(), value);
Erik Kline38e51f12018-09-06 20:14:44 +0900629 return statusFromErrcode(err);
630}
631
632binder::Status NetdNativeService::setProcSysNet(int32_t ipversion, int32_t which,
633 const std::string& ifname,
634 const std::string& parameter,
635 const std::string& value) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900636 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline38e51f12018-09-06 20:14:44 +0900637 const auto pathParts = getPathComponents(ipversion, which);
638 const auto& pathStatus = std::get<0>(pathParts);
639 if (!pathStatus.isOk()) {
Erik Kline38e51f12018-09-06 20:14:44 +0900640 return pathStatus;
641 }
642
643 const int err = InterfaceController::setParameter(std::get<1>(pathParts),
644 std::get<2>(pathParts), ifname.c_str(),
645 parameter.c_str(), value.c_str());
Erik Kline38e51f12018-09-06 20:14:44 +0900646 return statusFromErrcode(err);
Erik Kline55b06f82016-07-04 09:57:18 +0900647}
648
Luke Huange203a152018-11-23 11:47:28 +0800649binder::Status NetdNativeService::ipSecSetEncapSocketOwner(const ParcelFileDescriptor& socket,
650 int newUid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900651 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900652 gLog.log("ipSecSetEncapSocketOwner()");
Benedict Wongb2daefb2017-12-06 22:05:46 -0800653
654 uid_t callerUid = IPCThreadState::self()->getCallingUid();
Luke Huange203a152018-11-23 11:47:28 +0800655 return asBinderStatus(
656 gCtls->xfrmCtrl.ipSecSetEncapSocketOwner(socket.get(), newUid, callerUid));
Benedict Wongb2daefb2017-12-06 22:05:46 -0800657}
658
Nathan Harold1a371532017-01-30 12:30:48 -0800659binder::Status NetdNativeService::ipSecAllocateSpi(
660 int32_t transformId,
Nathan Haroldda54f122018-01-09 16:42:57 -0800661 const std::string& sourceAddress,
662 const std::string& destinationAddress,
Nathan Harold1a371532017-01-30 12:30:48 -0800663 int32_t inSpi,
664 int32_t* outSpi) {
665 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900666 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900667 gLog.log("ipSecAllocateSpi()");
ludi6e8eccd2017-08-14 14:40:37 -0700668 return asBinderStatus(gCtls->xfrmCtrl.ipSecAllocateSpi(
Nathan Harold1a371532017-01-30 12:30:48 -0800669 transformId,
Nathan Haroldda54f122018-01-09 16:42:57 -0800670 sourceAddress,
671 destinationAddress,
Nathan Harold1a371532017-01-30 12:30:48 -0800672 inSpi,
673 outSpi));
674}
675
676binder::Status NetdNativeService::ipSecAddSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700677 int32_t transformId, int32_t mode, const std::string& sourceAddress,
678 const std::string& destinationAddress, int32_t underlyingNetId, int32_t spi,
679 int32_t markValue, int32_t markMask, const std::string& authAlgo,
680 const std::vector<uint8_t>& authKey, int32_t authTruncBits, const std::string& cryptAlgo,
681 const std::vector<uint8_t>& cryptKey, int32_t cryptTruncBits, const std::string& aeadAlgo,
682 const std::vector<uint8_t>& aeadKey, int32_t aeadIcvBits, int32_t encapType,
683 int32_t encapLocalPort, int32_t encapRemotePort, int32_t interfaceId) {
Nathan Harold1a371532017-01-30 12:30:48 -0800684 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900685 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900686 gLog.log("ipSecAddSecurityAssociation()");
ludi6e8eccd2017-08-14 14:40:37 -0700687 return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityAssociation(
Benedict Wongad600cb2018-05-14 17:22:35 -0700688 transformId, mode, sourceAddress, destinationAddress, underlyingNetId, spi, markValue,
689 markMask, authAlgo, authKey, authTruncBits, cryptAlgo, cryptKey, cryptTruncBits,
Benedict Wonga450e722018-05-07 10:29:02 -0700690 aeadAlgo, aeadKey, aeadIcvBits, encapType, encapLocalPort, encapRemotePort,
691 interfaceId));
Nathan Harold1a371532017-01-30 12:30:48 -0800692}
693
694binder::Status NetdNativeService::ipSecDeleteSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700695 int32_t transformId, const std::string& sourceAddress,
696 const std::string& destinationAddress, int32_t spi, int32_t markValue, int32_t markMask,
697 int32_t interfaceId) {
Nathan Harold1a371532017-01-30 12:30:48 -0800698 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900699 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900700 gLog.log("ipSecDeleteSecurityAssociation()");
ludi6e8eccd2017-08-14 14:40:37 -0700701 return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700702 transformId, sourceAddress, destinationAddress, spi, markValue, markMask, interfaceId));
Nathan Harold1a371532017-01-30 12:30:48 -0800703}
704
705binder::Status NetdNativeService::ipSecApplyTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800706 const ParcelFileDescriptor& socket, int32_t transformId, int32_t direction,
707 const std::string& sourceAddress, const std::string& destinationAddress, int32_t spi) {
Nathan Harold1a371532017-01-30 12:30:48 -0800708 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900709 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900710 gLog.log("ipSecApplyTransportModeTransform()");
ludi6e8eccd2017-08-14 14:40:37 -0700711 return asBinderStatus(gCtls->xfrmCtrl.ipSecApplyTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800712 socket.get(), transformId, direction, sourceAddress, destinationAddress, spi));
Nathan Harold1a371532017-01-30 12:30:48 -0800713}
714
715binder::Status NetdNativeService::ipSecRemoveTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800716 const ParcelFileDescriptor& socket) {
Nathan Harold1a371532017-01-30 12:30:48 -0800717 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900718 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900719 gLog.log("ipSecRemoveTransportModeTransform()");
Luke Huange203a152018-11-23 11:47:28 +0800720 return asBinderStatus(gCtls->xfrmCtrl.ipSecRemoveTransportModeTransform(socket.get()));
Nathan Harold1a371532017-01-30 12:30:48 -0800721}
722
Benedict Wonga04ffa72018-05-09 21:42:42 -0700723binder::Status NetdNativeService::ipSecAddSecurityPolicy(int32_t transformId, int32_t selAddrFamily,
724 int32_t direction,
Benedict Wongad600cb2018-05-14 17:22:35 -0700725 const std::string& tmplSrcAddress,
726 const std::string& tmplDstAddress,
727 int32_t spi, int32_t markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700728 int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800729 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900730 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900731 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800732 return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityPolicy(
Benedict Wonga04ffa72018-05-09 21:42:42 -0700733 transformId, selAddrFamily, direction, tmplSrcAddress, tmplDstAddress, spi, markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700734 markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800735}
736
Benedict Wonga450e722018-05-07 10:29:02 -0700737binder::Status NetdNativeService::ipSecUpdateSecurityPolicy(
738 int32_t transformId, int32_t selAddrFamily, int32_t direction,
739 const std::string& tmplSrcAddress, const std::string& tmplDstAddress, int32_t spi,
740 int32_t markValue, int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800741 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900742 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900743 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800744 return asBinderStatus(gCtls->xfrmCtrl.ipSecUpdateSecurityPolicy(
Benedict Wonga04ffa72018-05-09 21:42:42 -0700745 transformId, selAddrFamily, direction, tmplSrcAddress, tmplDstAddress, spi, markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700746 markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800747}
748
Benedict Wonga04ffa72018-05-09 21:42:42 -0700749binder::Status NetdNativeService::ipSecDeleteSecurityPolicy(int32_t transformId,
750 int32_t selAddrFamily,
751 int32_t direction, int32_t markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700752 int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800753 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900754 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900755 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800756 return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityPolicy(
Benedict Wonga450e722018-05-07 10:29:02 -0700757 transformId, selAddrFamily, direction, markValue, markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800758}
759
Benedict Wong319f17e2018-05-15 17:06:44 -0700760binder::Status NetdNativeService::ipSecAddTunnelInterface(const std::string& deviceName,
761 const std::string& localAddress,
762 const std::string& remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700763 int32_t iKey, int32_t oKey,
764 int32_t interfaceId) {
manojboopathi8707f232018-01-02 14:45:47 -0800765 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900766 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700767 netdutils::Status result = gCtls->xfrmCtrl.ipSecAddTunnelInterface(
Benedict Wonga450e722018-05-07 10:29:02 -0700768 deviceName, localAddress, remoteAddress, iKey, oKey, interfaceId, false);
Benedict Wong319f17e2018-05-15 17:06:44 -0700769 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800770}
771
Benedict Wong319f17e2018-05-15 17:06:44 -0700772binder::Status NetdNativeService::ipSecUpdateTunnelInterface(const std::string& deviceName,
773 const std::string& localAddress,
774 const std::string& remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700775 int32_t iKey, int32_t oKey,
776 int32_t interfaceId) {
manojboopathi8707f232018-01-02 14:45:47 -0800777 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900778 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700779 netdutils::Status result = gCtls->xfrmCtrl.ipSecAddTunnelInterface(
Benedict Wonga450e722018-05-07 10:29:02 -0700780 deviceName, localAddress, remoteAddress, iKey, oKey, interfaceId, true);
Benedict Wong319f17e2018-05-15 17:06:44 -0700781 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800782}
783
Benedict Wong319f17e2018-05-15 17:06:44 -0700784binder::Status NetdNativeService::ipSecRemoveTunnelInterface(const std::string& deviceName) {
manojboopathi8707f232018-01-02 14:45:47 -0800785 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900786 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700787 netdutils::Status result = gCtls->xfrmCtrl.ipSecRemoveTunnelInterface(deviceName);
Benedict Wong319f17e2018-05-15 17:06:44 -0700788 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800789}
790
Joel Scherpelzde937962017-06-01 13:20:21 +0900791binder::Status NetdNativeService::setIPv6AddrGenMode(const std::string& ifName,
792 int32_t mode) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900793 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700794 return asBinderStatus(InterfaceController::setIPv6AddrGenMode(ifName, mode));
Joel Scherpelzde937962017-06-01 13:20:21 +0900795}
796
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900797binder::Status NetdNativeService::wakeupAddInterface(const std::string& ifName,
798 const std::string& prefix, int32_t mark,
799 int32_t mask) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900800 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700801 return asBinderStatus(gCtls->wakeupCtrl.addInterface(ifName, prefix, mark, mask));
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900802}
803
804binder::Status NetdNativeService::wakeupDelInterface(const std::string& ifName,
805 const std::string& prefix, int32_t mark,
806 int32_t mask) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900807 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700808 return asBinderStatus(gCtls->wakeupCtrl.delInterface(ifName, prefix, mark, mask));
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900809}
810
Chenbo Feng873ae142019-04-10 12:26:06 -0700811binder::Status NetdNativeService::trafficSwapActiveStatsMap() {
812 ENFORCE_NETWORK_STACK_PERMISSIONS();
813 return asBinderStatus(gCtls->trafficCtrl.swapActiveStatsMap());
814}
815
Luke Huang0051a622018-07-23 20:30:16 +0800816binder::Status NetdNativeService::idletimerAddInterface(const std::string& ifName, int32_t timeout,
817 const std::string& classLabel) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900818 NETD_LOCKING_RPC(gCtls->idletimerCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang0051a622018-07-23 20:30:16 +0800819 int res =
820 gCtls->idletimerCtrl.addInterfaceIdletimer(ifName.c_str(), timeout, classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +0800821 return statusFromErrcode(res);
822}
823
824binder::Status NetdNativeService::idletimerRemoveInterface(const std::string& ifName,
825 int32_t timeout,
826 const std::string& classLabel) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900827 NETD_LOCKING_RPC(gCtls->idletimerCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang0051a622018-07-23 20:30:16 +0800828 int res = gCtls->idletimerCtrl.removeInterfaceIdletimer(ifName.c_str(), timeout,
829 classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +0800830 return statusFromErrcode(res);
831}
Luke Huanga67dd562018-07-17 19:58:25 +0800832
833binder::Status NetdNativeService::strictUidCleartextPenalty(int32_t uid, int32_t policyPenalty) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900834 NETD_LOCKING_RPC(gCtls->strictCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huanga67dd562018-07-17 19:58:25 +0800835 StrictPenalty penalty;
836 switch (policyPenalty) {
837 case INetd::PENALTY_POLICY_REJECT:
838 penalty = REJECT;
839 break;
840 case INetd::PENALTY_POLICY_LOG:
841 penalty = LOG;
842 break;
843 case INetd::PENALTY_POLICY_ACCEPT:
844 penalty = ACCEPT;
845 break;
846 default:
847 return statusFromErrcode(-EINVAL);
848 break;
849 }
850 int res = gCtls->strictCtrl.setUidCleartextPenalty((uid_t) uid, penalty);
Luke Huanga67dd562018-07-17 19:58:25 +0800851 return statusFromErrcode(res);
852}
Luke Huange64fa382018-07-24 16:38:22 +0800853
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +0900854binder::Status NetdNativeService::clatdStart(const std::string& ifName,
855 const std::string& nat64Prefix, std::string* v6Addr) {
Maciej Żenczykowski56280272019-03-30 03:32:51 -0700856 ENFORCE_ANY_PERMISSION(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +0900857 int res = gCtls->clatdCtrl.startClatd(ifName.c_str(), nat64Prefix, v6Addr);
Luke Huang6d301232018-08-01 14:05:18 +0800858 return statusFromErrcode(res);
859}
860
861binder::Status NetdNativeService::clatdStop(const std::string& ifName) {
Maciej Żenczykowski56280272019-03-30 03:32:51 -0700862 ENFORCE_ANY_PERMISSION(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang6d301232018-08-01 14:05:18 +0800863 int res = gCtls->clatdCtrl.stopClatd(ifName.c_str());
Luke Huang6d301232018-08-01 14:05:18 +0800864 return statusFromErrcode(res);
865}
Luke Huanga67dd562018-07-17 19:58:25 +0800866
Luke Huang457d4702018-08-16 15:39:15 +0800867binder::Status NetdNativeService::ipfwdEnabled(bool* status) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900868 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang728cf4c2019-03-14 19:43:02 +0800869 *status = (gCtls->tetherCtrl.getIpfwdRequesterList().size() > 0) ? true : false;
870 return binder::Status::ok();
871}
872
873binder::Status NetdNativeService::ipfwdGetRequesterList(std::vector<std::string>* requesterList) {
874 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
875 for (const auto& requester : gCtls->tetherCtrl.getIpfwdRequesterList()) {
876 requesterList->push_back(requester);
877 }
Luke Huang457d4702018-08-16 15:39:15 +0800878 return binder::Status::ok();
879}
880
881binder::Status NetdNativeService::ipfwdEnableForwarding(const std::string& requester) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900882 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang457d4702018-08-16 15:39:15 +0800883 int res = (gCtls->tetherCtrl.enableForwarding(requester.c_str())) ? 0 : -EREMOTEIO;
Luke Huang457d4702018-08-16 15:39:15 +0800884 return statusFromErrcode(res);
885}
886
887binder::Status NetdNativeService::ipfwdDisableForwarding(const std::string& requester) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900888 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang457d4702018-08-16 15:39:15 +0800889 int res = (gCtls->tetherCtrl.disableForwarding(requester.c_str())) ? 0 : -EREMOTEIO;
Luke Huang457d4702018-08-16 15:39:15 +0800890 return statusFromErrcode(res);
891}
892
893binder::Status NetdNativeService::ipfwdAddInterfaceForward(const std::string& fromIface,
894 const std::string& toIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900895 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang457d4702018-08-16 15:39:15 +0800896 int res = RouteController::enableTethering(fromIface.c_str(), toIface.c_str());
Luke Huang457d4702018-08-16 15:39:15 +0800897 return statusFromErrcode(res);
898}
899
900binder::Status NetdNativeService::ipfwdRemoveInterfaceForward(const std::string& fromIface,
901 const std::string& toIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900902 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang457d4702018-08-16 15:39:15 +0800903 int res = RouteController::disableTethering(fromIface.c_str(), toIface.c_str());
Luke Huang457d4702018-08-16 15:39:15 +0800904 return statusFromErrcode(res);
905}
906
Luke Huangf7782042018-08-08 13:13:04 +0800907namespace {
Luke Huangf7782042018-08-08 13:13:04 +0800908std::string addCurlyBrackets(const std::string& s) {
909 return "{" + s + "}";
910}
911
912} // namespace
Xiao Ma33d562a2018-12-16 16:27:38 +0900913
Luke Huangf7782042018-08-08 13:13:04 +0800914binder::Status NetdNativeService::interfaceGetList(std::vector<std::string>* interfaceListResult) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900915 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800916 const auto& ifaceList = InterfaceController::getIfaceNames();
Luke Huangf7782042018-08-08 13:13:04 +0800917
918 interfaceListResult->clear();
919 interfaceListResult->reserve(ifaceList.value().size());
920 interfaceListResult->insert(end(*interfaceListResult), begin(ifaceList.value()),
921 end(ifaceList.value()));
922
Luke Huangf7782042018-08-08 13:13:04 +0800923 return binder::Status::ok();
924}
925
926std::string interfaceConfigurationParcelToString(const InterfaceConfigurationParcel& cfg) {
927 std::vector<std::string> result{cfg.ifName, cfg.hwAddr, cfg.ipv4Addr,
928 std::to_string(cfg.prefixLength)};
929 result.insert(end(result), begin(cfg.flags), end(cfg.flags));
930 return addCurlyBrackets(base::Join(result, ", "));
931}
932
933binder::Status NetdNativeService::interfaceGetCfg(
934 const std::string& ifName, InterfaceConfigurationParcel* interfaceGetCfgResult) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900935 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800936 auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__).arg(ifName);
937
938 const auto& cfgRes = InterfaceController::getCfg(ifName);
939 RETURN_BINDER_STATUS_IF_NOT_OK(entry, cfgRes);
940
941 *interfaceGetCfgResult = cfgRes.value();
942 gLog.log(entry.returns(interfaceConfigurationParcelToString(*interfaceGetCfgResult))
943 .withAutomaticDuration());
944 return binder::Status::ok();
945}
946
947binder::Status NetdNativeService::interfaceSetCfg(const InterfaceConfigurationParcel& cfg) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900948 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800949 auto entry = gLog.newEntry()
950 .prettyFunction(__PRETTY_FUNCTION__)
951 .arg(interfaceConfigurationParcelToString(cfg));
952
953 const auto& res = InterfaceController::setCfg(cfg);
954 RETURN_BINDER_STATUS_IF_NOT_OK(entry, res);
955
956 gLog.log(entry.withAutomaticDuration());
957 return binder::Status::ok();
958}
959
960binder::Status NetdNativeService::interfaceSetIPv6PrivacyExtensions(const std::string& ifName,
961 bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900962 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800963 int res = InterfaceController::setIPv6PrivacyExtensions(ifName.c_str(), enable);
Luke Huangf7782042018-08-08 13:13:04 +0800964 return statusFromErrcode(res);
965}
966
967binder::Status NetdNativeService::interfaceClearAddrs(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900968 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800969 int res = InterfaceController::clearAddrs(ifName.c_str());
Luke Huangf7782042018-08-08 13:13:04 +0800970 return statusFromErrcode(res);
971}
972
973binder::Status NetdNativeService::interfaceSetEnableIPv6(const std::string& ifName, bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900974 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800975 int res = InterfaceController::setEnableIPv6(ifName.c_str(), enable);
Luke Huangf7782042018-08-08 13:13:04 +0800976 return statusFromErrcode(res);
977}
978
979binder::Status NetdNativeService::interfaceSetMtu(const std::string& ifName, int32_t mtuValue) {
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 std::string mtu = std::to_string(mtuValue);
982 int res = InterfaceController::setMtu(ifName.c_str(), mtu.c_str());
Luke Huangf7782042018-08-08 13:13:04 +0800983 return statusFromErrcode(res);
984}
985
Luke Huangb5733d72018-08-21 17:17:19 +0800986binder::Status NetdNativeService::tetherStart(const std::vector<std::string>& dhcpRanges) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900987 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800988 if (dhcpRanges.size() % 2 == 1) {
989 return statusFromErrcode(-EINVAL);
990 }
991 int res = gCtls->tetherCtrl.startTethering(dhcpRanges);
Luke Huangb5733d72018-08-21 17:17:19 +0800992 return statusFromErrcode(res);
993}
994
995binder::Status NetdNativeService::tetherStop() {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900996 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800997 int res = gCtls->tetherCtrl.stopTethering();
Luke Huangb5733d72018-08-21 17:17:19 +0800998 return statusFromErrcode(res);
999}
1000
1001binder::Status NetdNativeService::tetherIsEnabled(bool* enabled) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001002 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001003 *enabled = gCtls->tetherCtrl.isTetheringStarted();
Luke Huangb5733d72018-08-21 17:17:19 +08001004 return binder::Status::ok();
1005}
1006
1007binder::Status NetdNativeService::tetherInterfaceAdd(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001008 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001009 int res = gCtls->tetherCtrl.tetherInterface(ifName.c_str());
Luke Huangb5733d72018-08-21 17:17:19 +08001010 return statusFromErrcode(res);
1011}
1012
1013binder::Status NetdNativeService::tetherInterfaceRemove(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001014 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001015 int res = gCtls->tetherCtrl.untetherInterface(ifName.c_str());
Luke Huangb5733d72018-08-21 17:17:19 +08001016 return statusFromErrcode(res);
1017}
1018
1019binder::Status NetdNativeService::tetherInterfaceList(std::vector<std::string>* ifList) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001020 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001021 for (const auto& ifname : gCtls->tetherCtrl.getTetheredInterfaceList()) {
1022 ifList->push_back(ifname);
1023 }
Luke Huangb5733d72018-08-21 17:17:19 +08001024 return binder::Status::ok();
1025}
1026
1027binder::Status NetdNativeService::tetherDnsSet(int32_t netId,
1028 const std::vector<std::string>& dnsAddrs) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001029 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001030 int res = gCtls->tetherCtrl.setDnsForwarders(netId, dnsAddrs);
Luke Huangb5733d72018-08-21 17:17:19 +08001031 return statusFromErrcode(res);
1032}
1033
1034binder::Status NetdNativeService::tetherDnsList(std::vector<std::string>* dnsList) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001035 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001036 for (const auto& fwdr : gCtls->tetherCtrl.getDnsForwarders()) {
1037 dnsList->push_back(fwdr);
1038 }
Luke Huangb5733d72018-08-21 17:17:19 +08001039 return binder::Status::ok();
1040}
1041
Luke Huangb670d162018-08-23 20:01:13 +08001042binder::Status NetdNativeService::networkAddRoute(int32_t netId, const std::string& ifName,
1043 const std::string& destination,
1044 const std::string& nextHop) {
1045 // Public methods of NetworkController are thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001046 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001047 bool legacy = false;
1048 uid_t uid = 0; // UID is only meaningful for legacy routes.
1049 int res = gCtls->netCtrl.addRoute(netId, ifName.c_str(), destination.c_str(),
1050 nextHop.empty() ? nullptr : nextHop.c_str(), legacy, uid);
Luke Huangb670d162018-08-23 20:01:13 +08001051 return statusFromErrcode(res);
1052}
1053
1054binder::Status NetdNativeService::networkRemoveRoute(int32_t netId, const std::string& ifName,
1055 const std::string& destination,
1056 const std::string& nextHop) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001057 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001058 bool legacy = false;
1059 uid_t uid = 0; // UID is only meaningful for legacy routes.
1060 int res = gCtls->netCtrl.removeRoute(netId, ifName.c_str(), destination.c_str(),
1061 nextHop.empty() ? nullptr : nextHop.c_str(), legacy, uid);
Luke Huangb670d162018-08-23 20:01:13 +08001062 return statusFromErrcode(res);
1063}
1064
1065binder::Status NetdNativeService::networkAddLegacyRoute(int32_t netId, const std::string& ifName,
1066 const std::string& destination,
1067 const std::string& nextHop, int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001068 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001069 bool legacy = true;
1070 int res = gCtls->netCtrl.addRoute(netId, ifName.c_str(), destination.c_str(),
1071 nextHop.empty() ? nullptr : nextHop.c_str(), legacy,
1072 (uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001073 return statusFromErrcode(res);
1074}
1075
1076binder::Status NetdNativeService::networkRemoveLegacyRoute(int32_t netId, const std::string& ifName,
1077 const std::string& destination,
1078 const std::string& nextHop,
1079 int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001080 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001081 bool legacy = true;
1082 int res = gCtls->netCtrl.removeRoute(netId, ifName.c_str(), destination.c_str(),
1083 nextHop.empty() ? nullptr : nextHop.c_str(), legacy,
1084 (uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001085 return statusFromErrcode(res);
1086}
1087
1088binder::Status NetdNativeService::networkGetDefault(int32_t* netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001089 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001090 *netId = gCtls->netCtrl.getDefaultNetwork();
Luke Huangb670d162018-08-23 20:01:13 +08001091 return binder::Status::ok();
1092}
1093
1094binder::Status NetdNativeService::networkSetDefault(int32_t netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001095 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001096 int res = gCtls->netCtrl.setDefaultNetwork(netId);
Luke Huangb670d162018-08-23 20:01:13 +08001097 return statusFromErrcode(res);
1098}
1099
1100binder::Status NetdNativeService::networkClearDefault() {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001101 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001102 unsigned netId = NETID_UNSET;
1103 int res = gCtls->netCtrl.setDefaultNetwork(netId);
Luke Huangb670d162018-08-23 20:01:13 +08001104 return statusFromErrcode(res);
1105}
1106
1107std::vector<uid_t> NetdNativeService::intsToUids(const std::vector<int32_t>& intUids) {
1108 return {begin(intUids), end(intUids)};
1109}
1110
1111Permission NetdNativeService::convertPermission(int32_t permission) {
1112 switch (permission) {
1113 case INetd::PERMISSION_NETWORK:
1114 return Permission::PERMISSION_NETWORK;
1115 case INetd::PERMISSION_SYSTEM:
1116 return Permission::PERMISSION_SYSTEM;
1117 default:
1118 return Permission::PERMISSION_NONE;
1119 }
1120}
1121
1122binder::Status NetdNativeService::networkSetPermissionForNetwork(int32_t netId,
1123 int32_t permission) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001124 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001125 std::vector<unsigned> netIds = {(unsigned) netId};
1126 int res = gCtls->netCtrl.setPermissionForNetworks(convertPermission(permission), netIds);
Luke Huangb670d162018-08-23 20:01:13 +08001127 return statusFromErrcode(res);
1128}
1129
1130binder::Status NetdNativeService::networkSetPermissionForUser(int32_t permission,
1131 const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001132 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001133 gCtls->netCtrl.setPermissionForUsers(convertPermission(permission), intsToUids(uids));
Luke Huangb670d162018-08-23 20:01:13 +08001134 return binder::Status::ok();
1135}
1136
1137binder::Status NetdNativeService::networkClearPermissionForUser(const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001138 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001139 Permission permission = Permission::PERMISSION_NONE;
1140 gCtls->netCtrl.setPermissionForUsers(permission, intsToUids(uids));
Luke Huangb670d162018-08-23 20:01:13 +08001141 return binder::Status::ok();
1142}
1143
1144binder::Status NetdNativeService::NetdNativeService::networkSetProtectAllow(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001145 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001146 std::vector<uid_t> uids = {(uid_t) uid};
1147 gCtls->netCtrl.allowProtect(uids);
Luke Huangb670d162018-08-23 20:01:13 +08001148 return binder::Status::ok();
1149}
1150
1151binder::Status NetdNativeService::networkSetProtectDeny(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001152 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001153 std::vector<uid_t> uids = {(uid_t) uid};
1154 gCtls->netCtrl.denyProtect(uids);
Luke Huangb670d162018-08-23 20:01:13 +08001155 return binder::Status::ok();
1156}
1157
1158binder::Status NetdNativeService::networkCanProtect(int32_t uid, bool* ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001159 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001160 *ret = gCtls->netCtrl.canProtect((uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001161 return binder::Status::ok();
1162}
1163
Chenbo Feng48eaed32018-12-26 17:40:21 -08001164binder::Status NetdNativeService::trafficSetNetPermForUids(int32_t permission,
1165 const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001166 ENFORCE_NETWORK_STACK_PERMISSIONS();
Chenbo Feng48eaed32018-12-26 17:40:21 -08001167 gCtls->trafficCtrl.setPermissionForUids(permission, intsToUids(uids));
Chenbo Feng48eaed32018-12-26 17:40:21 -08001168 return binder::Status::ok();
1169}
1170
Luke Huange64fa382018-07-24 16:38:22 +08001171binder::Status NetdNativeService::firewallSetFirewallType(int32_t firewallType) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001172 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001173 auto type = static_cast<FirewallType>(firewallType);
1174
1175 int res = gCtls->firewallCtrl.setFirewallType(type);
Luke Huange64fa382018-07-24 16:38:22 +08001176 return statusFromErrcode(res);
1177}
1178
1179binder::Status NetdNativeService::firewallSetInterfaceRule(const std::string& ifName,
1180 int32_t firewallRule) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001181 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001182 auto rule = static_cast<FirewallRule>(firewallRule);
1183
1184 int res = gCtls->firewallCtrl.setInterfaceRule(ifName.c_str(), rule);
Luke Huange64fa382018-07-24 16:38:22 +08001185 return statusFromErrcode(res);
1186}
1187
1188binder::Status NetdNativeService::firewallSetUidRule(int32_t childChain, int32_t uid,
1189 int32_t firewallRule) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001190 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001191 auto chain = static_cast<ChildChain>(childChain);
1192 auto rule = static_cast<FirewallRule>(firewallRule);
1193
1194 int res = gCtls->firewallCtrl.setUidRule(chain, uid, rule);
Luke Huange64fa382018-07-24 16:38:22 +08001195 return statusFromErrcode(res);
1196}
1197
1198binder::Status NetdNativeService::firewallEnableChildChain(int32_t childChain, bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001199 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001200 auto chain = static_cast<ChildChain>(childChain);
1201
1202 int res = gCtls->firewallCtrl.enableChildChains(chain, enable);
Luke Huange64fa382018-07-24 16:38:22 +08001203 return statusFromErrcode(res);
1204}
1205
Rubin Xuec27ff22019-01-08 21:33:03 +00001206binder::Status NetdNativeService::firewallAddUidInterfaceRules(const std::string& ifName,
1207 const std::vector<int32_t>& uids) {
1208 ENFORCE_NETWORK_STACK_PERMISSIONS();
1209
1210 return asBinderStatus(gCtls->trafficCtrl.addUidInterfaceRules(
1211 RouteController::getIfIndex(ifName.c_str()), uids));
1212}
1213
1214binder::Status NetdNativeService::firewallRemoveUidInterfaceRules(
1215 const std::vector<int32_t>& uids) {
1216 ENFORCE_NETWORK_STACK_PERMISSIONS();
1217
1218 return asBinderStatus(gCtls->trafficCtrl.removeUidInterfaceRules(uids));
1219}
1220
Luke Huang19b49c52018-10-22 12:12:05 +09001221binder::Status NetdNativeService::tetherAddForward(const std::string& intIface,
1222 const std::string& extIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001223 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang19b49c52018-10-22 12:12:05 +09001224
1225 int res = gCtls->tetherCtrl.enableNat(intIface.c_str(), extIface.c_str());
Luke Huang19b49c52018-10-22 12:12:05 +09001226 return statusFromErrcode(res);
1227}
1228
1229binder::Status NetdNativeService::tetherRemoveForward(const std::string& intIface,
1230 const std::string& extIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001231 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangae038f82018-11-05 11:17:31 +09001232 int res = gCtls->tetherCtrl.disableNat(intIface.c_str(), extIface.c_str());
Luke Huang19b49c52018-10-22 12:12:05 +09001233 return statusFromErrcode(res);
1234}
1235
Chenbo Fengf5663d82018-11-08 16:10:48 -08001236binder::Status NetdNativeService::setTcpRWmemorySize(const std::string& rmemValues,
1237 const std::string& wmemValues) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001238 ENFORCE_NETWORK_STACK_PERMISSIONS();
Chenbo Fengf5663d82018-11-08 16:10:48 -08001239 if (!WriteStringToFile(rmemValues, TCP_RMEM_PROC_FILE)) {
1240 int ret = -errno;
Chenbo Fengf5663d82018-11-08 16:10:48 -08001241 return statusFromErrcode(ret);
1242 }
1243
1244 if (!WriteStringToFile(wmemValues, TCP_WMEM_PROC_FILE)) {
1245 int ret = -errno;
Chenbo Fengf5663d82018-11-08 16:10:48 -08001246 return statusFromErrcode(ret);
1247 }
Chenbo Fengf5663d82018-11-08 16:10:48 -08001248 return binder::Status::ok();
1249}
1250
Luke Huang528af602018-08-29 19:06:05 +08001251binder::Status NetdNativeService::registerUnsolicitedEventListener(
1252 const android::sp<android::net::INetdUnsolicitedEventListener>& listener) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001253 ENFORCE_NETWORK_STACK_PERMISSIONS();
Bernie Innocenti9ee088d2019-02-01 17:14:32 +09001254 gCtls->eventReporter.registerUnsolEventListener(listener);
Luke Huang528af602018-08-29 19:06:05 +08001255 return binder::Status::ok();
1256}
1257
Luke Huange60bfd82019-04-26 11:39:31 +08001258binder::Status NetdNativeService::getOemNetd(android::sp<android::IBinder>* listener) {
1259 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang0e5e69d2019-03-06 15:42:38 +08001260 *listener = com::android::internal::net::OemNetdListener::getListener();
1261
Luke Huange60bfd82019-04-26 11:39:31 +08001262 return binder::Status::ok();
1263}
1264
Lorenzo Colittie4d626e2016-02-02 17:19:04 +09001265} // namespace net
1266} // namespace android