blob: b1b5e0b273433b2e6877a1ae9df1b94c79f84274 [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 Huangb670d162018-08-23 20:01:13 +080045#include "Permission.h"
Erik Kline85890042018-05-25 19:19:11 +090046#include "Process.h"
Robin Leeb8087362016-03-30 18:43:08 +010047#include "RouteController.h"
Lorenzo Colitti563d98b2016-04-24 13:13:14 +090048#include "SockDiag.h"
Robin Leeb8087362016-03-30 18:43:08 +010049#include "UidRanges.h"
Xiao Ma33d562a2018-12-16 16:27:38 +090050#include "android/net/BnNetd.h"
Luke Huangb257d612019-03-14 21:19:13 +080051#include "netdutils/DumpWriter.h"
Bernie Innocenti189eb502018-10-01 23:10:18 +090052#include "netid_client.h" // NETID_UNSET
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090053
54using android::base::StringPrintf;
Chenbo Fengf5663d82018-11-08 16:10:48 -080055using android::base::WriteStringToFile;
Luke Huangcaebcbb2018-09-27 20:37:14 +080056using android::net::TetherStatsParcel;
Luke Huang94658ac2018-10-18 19:35:12 +090057using android::net::UidRangeParcel;
Luke Huangb257d612019-03-14 21:19:13 +080058using android::netdutils::DumpWriter;
59using android::netdutils::ScopedIndent;
Luke Huange203a152018-11-23 11:47:28 +080060using android::os::ParcelFileDescriptor;
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090061
62namespace android {
63namespace net {
64
65namespace {
Erik Klineb31fd692018-06-06 20:50:11 +090066const char OPT_SHORT[] = "--short";
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090067
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090068binder::Status checkAnyPermission(const std::vector<const char*>& permissions) {
Luke Huanga38b65c2018-09-26 16:31:03 +080069 pid_t pid = IPCThreadState::self()->getCallingPid();
70 uid_t uid = IPCThreadState::self()->getCallingUid();
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090071
Luke Huanga38b65c2018-09-26 16:31:03 +080072 // If the caller is the system UID, don't check permissions.
73 // Otherwise, if the system server's binder thread pool is full, and all the threads are
74 // blocked on a thread that's waiting for us to complete, we deadlock. http://b/69389492
75 //
76 // From a security perspective, there is currently no difference, because:
77 // 1. The only permissions we check in netd's binder interface are CONNECTIVITY_INTERNAL
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090078 // and NETWORK_STACK, which the system server always has (or MAINLINE_NETWORK_STACK, which
79 // is equivalent to having both CONNECTIVITY_INTERNAL and NETWORK_STACK).
Luke Huanga38b65c2018-09-26 16:31:03 +080080 // 2. AID_SYSTEM always has all permissions. See ActivityManager#checkComponentPermission.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090081 if (uid == AID_SYSTEM) {
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090082 return binder::Status::ok();
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090083 }
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090084
85 for (const char* permission : permissions) {
86 if (checkPermission(String16(permission), pid, uid)) {
87 return binder::Status::ok();
88 }
89 }
90
91 auto err = StringPrintf("UID %d / PID %d does not have any of the following permissions: %s",
92 uid, pid, android::base::Join(permissions, ',').c_str());
93 return binder::Status::fromExceptionCode(binder::Status::EX_SECURITY, err.c_str());
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090094}
95
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090096#define ENFORCE_ANY_PERMISSION(...) \
97 do { \
98 binder::Status status = checkAnyPermission({__VA_ARGS__}); \
99 if (!status.isOk()) { \
100 return status; \
101 } \
102 } while (0)
Robin Lee2cf56172016-09-13 18:55:42 +0900103
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900104#define NETD_LOCKING_RPC(lock, ... /* permissions */) \
105 ENFORCE_ANY_PERMISSION(__VA_ARGS__); \
Bernie Innocentiabf8a342018-08-10 15:17:16 +0900106 std::lock_guard _lock(lock);
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900107
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900108#define NETD_BIG_LOCK_RPC(... /* permissions */) NETD_LOCKING_RPC(gBigNetdLock, __VA_ARGS__)
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900109
Luke Huangf7782042018-08-08 13:13:04 +0800110#define RETURN_BINDER_STATUS_IF_NOT_OK(logEntry, res) \
111 do { \
112 if (!isOk((res))) { \
113 logErrorStatus((logEntry), (res)); \
114 return asBinderStatus((res)); \
115 } \
116 } while (0)
117
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900118#define ENFORCE_INTERNAL_PERMISSIONS() \
119 ENFORCE_ANY_PERMISSION(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK)
120
121#define ENFORCE_NETWORK_STACK_PERMISSIONS() \
122 ENFORCE_ANY_PERMISSION(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK)
123
Luke Huangf7782042018-08-08 13:13:04 +0800124void logErrorStatus(netdutils::LogEntry& logEntry, const netdutils::Status& status) {
125 gLog.log(logEntry.returns(status.code()).withAutomaticDuration());
126}
127
Bernie Innocenti97f388f2018-10-16 19:17:08 +0900128binder::Status asBinderStatus(const netdutils::Status& status) {
129 if (isOk(status)) {
130 return binder::Status::ok();
131 }
132 return binder::Status::fromServiceSpecificError(status.code(), status.msg().c_str());
133}
134
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900135inline binder::Status statusFromErrcode(int ret) {
136 if (ret) {
137 return binder::Status::fromServiceSpecificError(-ret, strerror(-ret));
138 }
139 return binder::Status::ok();
140}
141
Erik Klineb31fd692018-06-06 20:50:11 +0900142bool contains(const Vector<String16>& words, const String16& word) {
143 for (const auto& w : words) {
144 if (w == word) return true;
145 }
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900146
Erik Klineb31fd692018-06-06 20:50:11 +0900147 return false;
148}
149
Xiao Ma64b15b72019-03-20 11:33:15 +0900150std::string exceptionToString(int32_t exception) {
151 std::string ret = "UnknownException";
152 switch (exception) {
153 case binder::Status::EX_SECURITY:
154 ret = "SecurityException";
155 break;
156 case binder::Status::EX_BAD_PARCELABLE:
157 ret = "BadParcelableException";
158 break;
159 case binder::Status::EX_ILLEGAL_ARGUMENT:
160 ret = "IllegalArgumentException";
161 break;
162 case binder::Status::EX_NETWORK_MAIN_THREAD:
163 ret = "NetworkMainThreadException";
164 break;
165 case binder::Status::EX_UNSUPPORTED_OPERATION:
166 ret = "UnsupportedOperationException";
167 break;
168 case binder::Status::EX_SERVICE_SPECIFIC:
169 ret = "ServiceSpecificException";
170 break;
171 case binder::Status::EX_PARCELABLE:
172 ret = "ParcelableException";
173 break;
174 case binder::Status::EX_HAS_REPLY_HEADER:
175 ret = "HasReplyHeaderException";
176 break;
177 case binder::Status::EX_TRANSACTION_FAILED:
178 ret = "TransactionFailedException";
179 break;
180 }
181 return ret;
182}
183
Erik Klineb31fd692018-06-06 20:50:11 +0900184} // namespace
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900185
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900186status_t NetdNativeService::start() {
187 IPCThreadState::self()->disableBackgroundScheduling(true);
Erik Klineb31fd692018-06-06 20:50:11 +0900188 const status_t ret = BinderService<NetdNativeService>::publish();
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900189 if (ret != android::OK) {
190 return ret;
191 }
192 sp<ProcessState> ps(ProcessState::self());
193 ps->startThreadPool();
194 ps->giveThreadPoolName();
Xiao Ma33d562a2018-12-16 16:27:38 +0900195
196 // register log callback to BnNetd::logFunc
197 BnNetd::logFunc = [](const Json::Value& logTransaction) {
Xiao Ma64b15b72019-03-20 11:33:15 +0900198 using namespace std::string_literals;
199
Xiao Ma33d562a2018-12-16 16:27:38 +0900200 bool hasReturnArgs;
201 std::string output;
Xiao Ma33d562a2018-12-16 16:27:38 +0900202 const Json::Value& returnArgs = logTransaction["_aidl_return"];
Xiao Ma64b15b72019-03-20 11:33:15 +0900203 const Json::Value& inputArgsArray = logTransaction["input_args"];
204 const int exceptionCode = logTransaction["binder_status"]["exception_code"].asInt();
Xiao Ma33d562a2018-12-16 16:27:38 +0900205
206 hasReturnArgs = !returnArgs.empty();
Xiao Ma64b15b72019-03-20 11:33:15 +0900207 output.append(logTransaction["method_name"].asString() + "("s);
Xiao Ma33d562a2018-12-16 16:27:38 +0900208
209 // input args
Jeongik Cha374ca5b2019-03-22 12:11:25 +0900210 Json::FastWriter fastWriter;
211 fastWriter.omitEndingLineFeed();
Xiao Ma64b15b72019-03-20 11:33:15 +0900212 for (Json::Value::ArrayIndex i = 0; i < inputArgsArray.size(); ++i) {
213 std::string value = fastWriter.write(inputArgsArray[i]["value"]);
Xiao Ma33d562a2018-12-16 16:27:38 +0900214 output.append(value);
Xiao Ma64b15b72019-03-20 11:33:15 +0900215 if (i != inputArgsArray.size() - 1) {
216 output.append(", "s);
Xiao Ma33d562a2018-12-16 16:27:38 +0900217 }
218 }
Xiao Ma64b15b72019-03-20 11:33:15 +0900219 output.append(")"s);
220 if (hasReturnArgs || exceptionCode != binder::Status::EX_NONE) output.append(" -> "s);
221 // return status
222 if (!binder::Status::fromExceptionCode(exceptionCode).isOk()) {
223 // an exception occurred
224 if (exceptionCode == binder::Status::EX_SERVICE_SPECIFIC) {
225 output.append(StringPrintf(
226 "%s(%d, \"%s\")", exceptionToString(exceptionCode).c_str(),
227 logTransaction["binder_status"]["service_specific_error_code"].asInt(),
228 logTransaction["binder_status"]["exception_message"].asString().c_str()));
229 } else {
230 output.append(StringPrintf(
231 "%s(%d, \"%s\")", exceptionToString(exceptionCode).c_str(), exceptionCode,
232 logTransaction["binder_status"]["exception_message"].asString().c_str()));
233 }
234 }
Xiao Ma33d562a2018-12-16 16:27:38 +0900235 // return args
236 if (hasReturnArgs) {
Xiao Ma64b15b72019-03-20 11:33:15 +0900237 output.append(StringPrintf("{%s}", fastWriter.write(returnArgs).c_str()));
Xiao Ma33d562a2018-12-16 16:27:38 +0900238 }
239 // duration time
Xiao Ma64b15b72019-03-20 11:33:15 +0900240 output.append(StringPrintf(" <%.2fms>", logTransaction["duration_ms"].asFloat()));
Xiao Ma33d562a2018-12-16 16:27:38 +0900241 gLog.info("%s", output.c_str());
242 };
243
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900244 return android::OK;
245}
246
Hugo Benichi7b314e12018-01-15 21:54:00 +0900247status_t NetdNativeService::dump(int fd, const Vector<String16> &args) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900248 const binder::Status dump_permission = checkAnyPermission({PERM_DUMP});
Erik Kline2d3a1632016-03-15 16:33:48 +0900249 if (!dump_permission.isOk()) {
250 const String8 msg(dump_permission.toString8());
251 write(fd, msg.string(), msg.size());
252 return PERMISSION_DENIED;
253 }
254
255 // This method does not grab any locks. If individual classes need locking
256 // their dump() methods MUST handle locking appropriately.
Hugo Benichi7b314e12018-01-15 21:54:00 +0900257
Erik Kline2d3a1632016-03-15 16:33:48 +0900258 DumpWriter dw(fd);
Hugo Benichi7b314e12018-01-15 21:54:00 +0900259
260 if (!args.isEmpty() && args[0] == TcpSocketMonitor::DUMP_KEYWORD) {
261 dw.blankline();
262 gCtls->tcpSocketMonitor.dump(dw);
263 dw.blankline();
264 return NO_ERROR;
265 }
266
Chenbo Fengef297172018-03-26 10:53:33 -0700267 if (!args.isEmpty() && args[0] == TrafficController::DUMP_KEYWORD) {
268 dw.blankline();
269 gCtls->trafficCtrl.dump(dw, true);
270 dw.blankline();
271 return NO_ERROR;
272 }
273
Erik Kline85890042018-05-25 19:19:11 +0900274 process::dump(dw);
Erik Kline2d3a1632016-03-15 16:33:48 +0900275 dw.blankline();
276 gCtls->netCtrl.dump(dw);
277 dw.blankline();
278
Chenbo Fengef297172018-03-26 10:53:33 -0700279 gCtls->trafficCtrl.dump(dw, false);
280 dw.blankline();
281
Benedict Wongaf855432018-05-10 17:07:37 -0700282 gCtls->xfrmCtrl.dump(dw);
283 dw.blankline();
284
Maciej Żenczykowski55262712019-03-29 23:44:56 -0700285 gCtls->clatdCtrl.dump(dw);
286 dw.blankline();
287
Erik Klineb31fd692018-06-06 20:50:11 +0900288 {
289 ScopedIndent indentLog(dw);
290 if (contains(args, String16(OPT_SHORT))) {
291 dw.println("Log: <omitted>");
292 } else {
293 dw.println("Log:");
294 ScopedIndent indentLogEntries(dw);
295 gLog.forEachEntry([&dw](const std::string& entry) mutable { dw.println(entry); });
296 }
297 dw.blankline();
298 }
299
Luke Huang528af602018-08-29 19:06:05 +0800300 {
301 ScopedIndent indentLog(dw);
302 if (contains(args, String16(OPT_SHORT))) {
303 dw.println("UnsolicitedLog: <omitted>");
304 } else {
305 dw.println("UnsolicitedLog:");
306 ScopedIndent indentLogEntries(dw);
307 gUnsolicitedLog.forEachEntry(
308 [&dw](const std::string& entry) mutable { dw.println(entry); });
309 }
310 dw.blankline();
311 }
312
Erik Kline2d3a1632016-03-15 16:33:48 +0900313 return NO_ERROR;
314}
315
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900316binder::Status NetdNativeService::isAlive(bool *alive) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900317 NETD_BIG_LOCK_RPC(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900318
319 *alive = true;
Erik Klineb31fd692018-06-06 20:50:11 +0900320
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900321 return binder::Status::ok();
322}
323
Erik Klinef52d4522018-03-14 15:01:46 +0900324binder::Status NetdNativeService::firewallReplaceUidChain(const std::string& chainName,
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900325 bool isWhitelist, const std::vector<int32_t>& uids, bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900326 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_CONNECTIVITY_INTERNAL,
327 PERM_MAINLINE_NETWORK_STACK);
Erik Klinef52d4522018-03-14 15:01:46 +0900328 int err = gCtls->firewallCtrl.replaceUidChain(chainName, isWhitelist, uids);
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900329 *ret = (err == 0);
330 return binder::Status::ok();
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900331}
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900332
333binder::Status NetdNativeService::bandwidthEnableDataSaver(bool enable, bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900334 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_CONNECTIVITY_INTERNAL,
335 PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900336 int err = gCtls->bandwidthCtrl.enableDataSaver(enable);
337 *ret = (err == 0);
338 return binder::Status::ok();
339}
340
Luke Huang531f5d32018-08-03 15:19:05 +0800341binder::Status NetdNativeService::bandwidthSetInterfaceQuota(const std::string& ifName,
342 int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900343 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800344 int res = gCtls->bandwidthCtrl.setInterfaceQuota(ifName, bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800345 return statusFromErrcode(res);
346}
347
348binder::Status NetdNativeService::bandwidthRemoveInterfaceQuota(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900349 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800350 int res = gCtls->bandwidthCtrl.removeInterfaceQuota(ifName);
Luke Huang531f5d32018-08-03 15:19:05 +0800351 return statusFromErrcode(res);
352}
353
354binder::Status NetdNativeService::bandwidthSetInterfaceAlert(const std::string& ifName,
355 int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900356 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800357 int res = gCtls->bandwidthCtrl.setInterfaceAlert(ifName, bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800358 return statusFromErrcode(res);
359}
360
361binder::Status NetdNativeService::bandwidthRemoveInterfaceAlert(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900362 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800363 int res = gCtls->bandwidthCtrl.removeInterfaceAlert(ifName);
Luke Huang531f5d32018-08-03 15:19:05 +0800364 return statusFromErrcode(res);
365}
366
367binder::Status NetdNativeService::bandwidthSetGlobalAlert(int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900368 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800369 int res = gCtls->bandwidthCtrl.setGlobalAlert(bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800370 return statusFromErrcode(res);
371}
372
373binder::Status NetdNativeService::bandwidthAddNaughtyApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900374 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800375 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
376 int res = gCtls->bandwidthCtrl.addNaughtyApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800377 return statusFromErrcode(res);
378}
379
380binder::Status NetdNativeService::bandwidthRemoveNaughtyApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900381 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800382 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
383 int res = gCtls->bandwidthCtrl.removeNaughtyApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800384 return statusFromErrcode(res);
385}
386
387binder::Status NetdNativeService::bandwidthAddNiceApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900388 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800389 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
390 int res = gCtls->bandwidthCtrl.addNiceApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800391 return statusFromErrcode(res);
392}
393
394binder::Status NetdNativeService::bandwidthRemoveNiceApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900395 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800396 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
397 int res = gCtls->bandwidthCtrl.removeNiceApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800398 return statusFromErrcode(res);
399}
400
Luke Huangb670d162018-08-23 20:01:13 +0800401binder::Status NetdNativeService::networkCreatePhysical(int32_t netId, int32_t permission) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900402 ENFORCE_INTERNAL_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +0800403 int ret = gCtls->netCtrl.createPhysicalNetwork(netId, convertPermission(permission));
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900404 return statusFromErrcode(ret);
405}
406
cken67cd14c2018-12-05 17:26:59 +0900407binder::Status NetdNativeService::networkCreateVpn(int32_t netId, bool secure) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900408 ENFORCE_NETWORK_STACK_PERMISSIONS();
cken67cd14c2018-12-05 17:26:59 +0900409 int ret = gCtls->netCtrl.createVirtualNetwork(netId, secure);
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900410 return statusFromErrcode(ret);
411}
412
413binder::Status NetdNativeService::networkDestroy(int32_t netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900414 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangd33a8f42019-03-14 16:10:04 +0800415 // NetworkController::destroyNetwork is thread-safe.
Mike Yu4fe1b9c2019-01-29 17:50:19 +0800416 const int ret = gCtls->netCtrl.destroyNetwork(netId);
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900417 return statusFromErrcode(ret);
418}
419
420binder::Status NetdNativeService::networkAddInterface(int32_t netId, const std::string& iface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900421 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900422 int ret = gCtls->netCtrl.addInterfaceToNetwork(netId, iface.c_str());
423 return statusFromErrcode(ret);
424}
425
426binder::Status NetdNativeService::networkRemoveInterface(int32_t netId, const std::string& iface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900427 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900428 int ret = gCtls->netCtrl.removeInterfaceFromNetwork(netId, iface.c_str());
429 return statusFromErrcode(ret);
430}
431
Luke Huang94658ac2018-10-18 19:35:12 +0900432binder::Status NetdNativeService::networkAddUidRanges(
433 int32_t netId, const std::vector<UidRangeParcel>& uidRangeArray) {
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900434 // NetworkController::addUsersToNetwork is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900435 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900436 int ret = gCtls->netCtrl.addUsersToNetwork(netId, UidRanges(uidRangeArray));
437 return statusFromErrcode(ret);
438}
439
Luke Huang94658ac2018-10-18 19:35:12 +0900440binder::Status NetdNativeService::networkRemoveUidRanges(
441 int32_t netId, const std::vector<UidRangeParcel>& uidRangeArray) {
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900442 // NetworkController::removeUsersFromNetwork is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900443 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900444 int ret = gCtls->netCtrl.removeUsersFromNetwork(netId, UidRanges(uidRangeArray));
445 return statusFromErrcode(ret);
446}
447
Luke Huang94658ac2018-10-18 19:35:12 +0900448binder::Status NetdNativeService::networkRejectNonSecureVpn(
449 bool add, const std::vector<UidRangeParcel>& uidRangeArray) {
Robin Leeb8087362016-03-30 18:43:08 +0100450 // TODO: elsewhere RouteController is only used from the tethering and network controllers, so
451 // it should be possible to use the same lock as NetworkController. However, every call through
452 // the CommandListener "network" command will need to hold this lock too, not just the ones that
453 // read/modify network internal state (that is sufficient for ::dump() because it doesn't
454 // look at routes, but it's not enough here).
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900455 NETD_BIG_LOCK_RPC(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900456 UidRanges uidRanges(uidRangeArray);
Robin Leeb8087362016-03-30 18:43:08 +0100457
458 int err;
459 if (add) {
460 err = RouteController::addUsersToRejectNonSecureNetworkRule(uidRanges);
461 } else {
462 err = RouteController::removeUsersFromRejectNonSecureNetworkRule(uidRanges);
463 }
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900464 return statusFromErrcode(err);
Robin Leeb8087362016-03-30 18:43:08 +0100465}
466
Luke Huang94658ac2018-10-18 19:35:12 +0900467binder::Status NetdNativeService::socketDestroy(const std::vector<UidRangeParcel>& uids,
468 const std::vector<int32_t>& skipUids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900469 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900470
471 SockDiag sd;
472 if (!sd.open()) {
473 return binder::Status::fromServiceSpecificError(EIO,
474 String8("Could not open SOCK_DIAG socket"));
475 }
476
477 UidRanges uidRanges(uids);
Lorenzo Colittie5c3c992016-07-26 17:53:50 +0900478 int err = sd.destroySockets(uidRanges, std::set<uid_t>(skipUids.begin(), skipUids.end()),
479 true /* excludeLoopback */);
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900480 if (err) {
481 return binder::Status::fromServiceSpecificError(-err,
482 String8::format("destroySockets: %s", strerror(-err)));
483 }
Pierre Imaibeedec32016-04-13 06:44:51 +0900484 return binder::Status::ok();
485}
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900486
Erik Klinef48e4dd2016-07-18 04:02:07 +0900487binder::Status NetdNativeService::tetherApplyDnsInterfaces(bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900488 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Erik Klinef48e4dd2016-07-18 04:02:07 +0900489 *ret = gCtls->tetherCtrl.applyDnsInterfaces();
490 return binder::Status::ok();
491}
492
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900493namespace {
494
Luke Huangcaebcbb2018-09-27 20:37:14 +0800495void tetherAddStatsByInterface(TetherController::TetherStats* tetherStatsParcel,
496 const TetherController::TetherStats& tetherStats) {
497 if (tetherStatsParcel->extIface == tetherStats.extIface) {
498 tetherStatsParcel->rxBytes += tetherStats.rxBytes;
499 tetherStatsParcel->rxPackets += tetherStats.rxPackets;
500 tetherStatsParcel->txBytes += tetherStats.txBytes;
501 tetherStatsParcel->txPackets += tetherStats.txPackets;
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900502 }
Luke Huangcaebcbb2018-09-27 20:37:14 +0800503}
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900504
Luke Huangcaebcbb2018-09-27 20:37:14 +0800505TetherStatsParcel toTetherStatsParcel(const TetherController::TetherStats& stats) {
506 TetherStatsParcel result;
507 result.iface = stats.extIface;
508 result.rxBytes = stats.rxBytes;
509 result.rxPackets = stats.rxPackets;
510 result.txBytes = stats.txBytes;
511 result.txPackets = stats.txPackets;
512 return result;
513}
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900514
Luke Huangcaebcbb2018-09-27 20:37:14 +0800515void setTetherStatsParcelVecByInterface(std::vector<TetherStatsParcel>* tetherStatsVec,
516 const TetherController::TetherStatsList& statsList) {
517 std::map<std::string, TetherController::TetherStats> statsMap;
518 for (const auto& stats : statsList) {
519 auto iter = statsMap.find(stats.extIface);
520 if (iter != statsMap.end()) {
521 tetherAddStatsByInterface(&(iter->second), stats);
522 } else {
523 statsMap.insert(
524 std::pair<std::string, TetherController::TetherStats>(stats.extIface, stats));
525 }
526 }
527 for (auto iter = statsMap.begin(); iter != statsMap.end(); iter++) {
528 tetherStatsVec->push_back(toTetherStatsParcel(iter->second));
529 }
530}
531
532std::vector<std::string> tetherStatsParcelVecToStringVec(std::vector<TetherStatsParcel>* tVec) {
533 std::vector<std::string> result;
534 for (const auto& t : *tVec) {
535 result.push_back(StringPrintf("%s:%" PRId64 ",%" PRId64 ",%" PRId64 ",%" PRId64,
536 t.iface.c_str(), t.rxBytes, t.rxPackets, t.txBytes,
537 t.txPackets));
538 }
539 return result;
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900540}
541
542} // namespace
543
Luke Huangcaebcbb2018-09-27 20:37:14 +0800544binder::Status NetdNativeService::tetherGetStats(
545 std::vector<TetherStatsParcel>* tetherStatsParcelVec) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900546 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti5192bf72017-09-04 13:30:59 +0900547 const auto& statsList = gCtls->tetherCtrl.getTetherStats();
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900548 if (!isOk(statsList)) {
Nathan Harold28ccfef2018-03-16 19:02:47 -0700549 return asBinderStatus(statsList);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900550 }
Luke Huangcaebcbb2018-09-27 20:37:14 +0800551 setTetherStatsParcelVecByInterface(tetherStatsParcelVec, statsList.value());
552 auto statsResults = tetherStatsParcelVecToStringVec(tetherStatsParcelVec);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900553 return binder::Status::ok();
554}
555
Erik Kline53c20882016-08-02 15:22:53 +0900556binder::Status NetdNativeService::interfaceAddAddress(const std::string &ifName,
557 const std::string &addrString, int prefixLength) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900558 ENFORCE_INTERNAL_PERMISSIONS();
Erik Kline53c20882016-08-02 15:22:53 +0900559 const int err = InterfaceController::addAddress(
560 ifName.c_str(), addrString.c_str(), prefixLength);
561 if (err != 0) {
562 return binder::Status::fromServiceSpecificError(-err,
563 String8::format("InterfaceController error: %s", strerror(-err)));
564 }
565 return binder::Status::ok();
566}
567
568binder::Status NetdNativeService::interfaceDelAddress(const std::string &ifName,
569 const std::string &addrString, int prefixLength) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900570 ENFORCE_INTERNAL_PERMISSIONS();
Erik Kline53c20882016-08-02 15:22:53 +0900571 const int err = InterfaceController::delAddress(
572 ifName.c_str(), addrString.c_str(), prefixLength);
573 if (err != 0) {
574 return binder::Status::fromServiceSpecificError(-err,
575 String8::format("InterfaceController error: %s", strerror(-err)));
576 }
577 return binder::Status::ok();
578}
579
Erik Kline38e51f12018-09-06 20:14:44 +0900580namespace {
Erik Kline55b06f82016-07-04 09:57:18 +0900581
Erik Kline38e51f12018-09-06 20:14:44 +0900582std::tuple<binder::Status, const char*, const char*> getPathComponents(int32_t ipversion,
583 int32_t category) {
584 const char* ipversionStr = nullptr;
585 switch (ipversion) {
Erik Kline55b06f82016-07-04 09:57:18 +0900586 case INetd::IPV4:
Erik Kline38e51f12018-09-06 20:14:44 +0900587 ipversionStr = "ipv4";
Erik Kline55b06f82016-07-04 09:57:18 +0900588 break;
589 case INetd::IPV6:
Erik Kline38e51f12018-09-06 20:14:44 +0900590 ipversionStr = "ipv6";
Erik Kline55b06f82016-07-04 09:57:18 +0900591 break;
592 default:
Erik Kline38e51f12018-09-06 20:14:44 +0900593 return {binder::Status::fromServiceSpecificError(EAFNOSUPPORT, "Bad IP version"),
594 nullptr, nullptr};
Erik Kline55b06f82016-07-04 09:57:18 +0900595 }
596
Erik Kline38e51f12018-09-06 20:14:44 +0900597 const char* whichStr = nullptr;
598 switch (category) {
Erik Kline55b06f82016-07-04 09:57:18 +0900599 case INetd::CONF:
600 whichStr = "conf";
601 break;
602 case INetd::NEIGH:
603 whichStr = "neigh";
604 break;
605 default:
Erik Kline38e51f12018-09-06 20:14:44 +0900606 return {binder::Status::fromServiceSpecificError(EINVAL, "Bad category"), nullptr,
607 nullptr};
Erik Kline55b06f82016-07-04 09:57:18 +0900608 }
609
Erik Kline38e51f12018-09-06 20:14:44 +0900610 return {binder::Status::ok(), ipversionStr, whichStr};
611}
612
613} // namespace
614
615binder::Status NetdNativeService::getProcSysNet(int32_t ipversion, int32_t which,
616 const std::string& ifname,
617 const std::string& parameter, std::string* value) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900618 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline38e51f12018-09-06 20:14:44 +0900619 const auto pathParts = getPathComponents(ipversion, which);
620 const auto& pathStatus = std::get<0>(pathParts);
621 if (!pathStatus.isOk()) {
Erik Kline38e51f12018-09-06 20:14:44 +0900622 return pathStatus;
Erik Kline55b06f82016-07-04 09:57:18 +0900623 }
Erik Kline38e51f12018-09-06 20:14:44 +0900624
625 const int err = InterfaceController::getParameter(std::get<1>(pathParts),
626 std::get<2>(pathParts), ifname.c_str(),
627 parameter.c_str(), value);
Erik Kline38e51f12018-09-06 20:14:44 +0900628 return statusFromErrcode(err);
629}
630
631binder::Status NetdNativeService::setProcSysNet(int32_t ipversion, int32_t which,
632 const std::string& ifname,
633 const std::string& parameter,
634 const std::string& value) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900635 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline38e51f12018-09-06 20:14:44 +0900636 const auto pathParts = getPathComponents(ipversion, which);
637 const auto& pathStatus = std::get<0>(pathParts);
638 if (!pathStatus.isOk()) {
Erik Kline38e51f12018-09-06 20:14:44 +0900639 return pathStatus;
640 }
641
642 const int err = InterfaceController::setParameter(std::get<1>(pathParts),
643 std::get<2>(pathParts), ifname.c_str(),
644 parameter.c_str(), value.c_str());
Erik Kline38e51f12018-09-06 20:14:44 +0900645 return statusFromErrcode(err);
Erik Kline55b06f82016-07-04 09:57:18 +0900646}
647
Luke Huange203a152018-11-23 11:47:28 +0800648binder::Status NetdNativeService::ipSecSetEncapSocketOwner(const ParcelFileDescriptor& socket,
649 int newUid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900650 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900651 gLog.log("ipSecSetEncapSocketOwner()");
Benedict Wongb2daefb2017-12-06 22:05:46 -0800652
653 uid_t callerUid = IPCThreadState::self()->getCallingUid();
Luke Huange203a152018-11-23 11:47:28 +0800654 return asBinderStatus(
655 gCtls->xfrmCtrl.ipSecSetEncapSocketOwner(socket.get(), newUid, callerUid));
Benedict Wongb2daefb2017-12-06 22:05:46 -0800656}
657
Nathan Harold1a371532017-01-30 12:30:48 -0800658binder::Status NetdNativeService::ipSecAllocateSpi(
659 int32_t transformId,
Nathan Haroldda54f122018-01-09 16:42:57 -0800660 const std::string& sourceAddress,
661 const std::string& destinationAddress,
Nathan Harold1a371532017-01-30 12:30:48 -0800662 int32_t inSpi,
663 int32_t* outSpi) {
664 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900665 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900666 gLog.log("ipSecAllocateSpi()");
ludi6e8eccd2017-08-14 14:40:37 -0700667 return asBinderStatus(gCtls->xfrmCtrl.ipSecAllocateSpi(
Nathan Harold1a371532017-01-30 12:30:48 -0800668 transformId,
Nathan Haroldda54f122018-01-09 16:42:57 -0800669 sourceAddress,
670 destinationAddress,
Nathan Harold1a371532017-01-30 12:30:48 -0800671 inSpi,
672 outSpi));
673}
674
675binder::Status NetdNativeService::ipSecAddSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700676 int32_t transformId, int32_t mode, const std::string& sourceAddress,
677 const std::string& destinationAddress, int32_t underlyingNetId, int32_t spi,
678 int32_t markValue, int32_t markMask, const std::string& authAlgo,
679 const std::vector<uint8_t>& authKey, int32_t authTruncBits, const std::string& cryptAlgo,
680 const std::vector<uint8_t>& cryptKey, int32_t cryptTruncBits, const std::string& aeadAlgo,
681 const std::vector<uint8_t>& aeadKey, int32_t aeadIcvBits, int32_t encapType,
682 int32_t encapLocalPort, int32_t encapRemotePort, int32_t interfaceId) {
Nathan Harold1a371532017-01-30 12:30:48 -0800683 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900684 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900685 gLog.log("ipSecAddSecurityAssociation()");
ludi6e8eccd2017-08-14 14:40:37 -0700686 return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityAssociation(
Benedict Wongad600cb2018-05-14 17:22:35 -0700687 transformId, mode, sourceAddress, destinationAddress, underlyingNetId, spi, markValue,
688 markMask, authAlgo, authKey, authTruncBits, cryptAlgo, cryptKey, cryptTruncBits,
Benedict Wonga450e722018-05-07 10:29:02 -0700689 aeadAlgo, aeadKey, aeadIcvBits, encapType, encapLocalPort, encapRemotePort,
690 interfaceId));
Nathan Harold1a371532017-01-30 12:30:48 -0800691}
692
693binder::Status NetdNativeService::ipSecDeleteSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700694 int32_t transformId, const std::string& sourceAddress,
695 const std::string& destinationAddress, int32_t spi, int32_t markValue, int32_t markMask,
696 int32_t interfaceId) {
Nathan Harold1a371532017-01-30 12:30:48 -0800697 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900698 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900699 gLog.log("ipSecDeleteSecurityAssociation()");
ludi6e8eccd2017-08-14 14:40:37 -0700700 return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700701 transformId, sourceAddress, destinationAddress, spi, markValue, markMask, interfaceId));
Nathan Harold1a371532017-01-30 12:30:48 -0800702}
703
704binder::Status NetdNativeService::ipSecApplyTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800705 const ParcelFileDescriptor& socket, int32_t transformId, int32_t direction,
706 const std::string& sourceAddress, const std::string& destinationAddress, int32_t spi) {
Nathan Harold1a371532017-01-30 12:30:48 -0800707 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900708 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900709 gLog.log("ipSecApplyTransportModeTransform()");
ludi6e8eccd2017-08-14 14:40:37 -0700710 return asBinderStatus(gCtls->xfrmCtrl.ipSecApplyTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800711 socket.get(), transformId, direction, sourceAddress, destinationAddress, spi));
Nathan Harold1a371532017-01-30 12:30:48 -0800712}
713
714binder::Status NetdNativeService::ipSecRemoveTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800715 const ParcelFileDescriptor& socket) {
Nathan Harold1a371532017-01-30 12:30:48 -0800716 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900717 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900718 gLog.log("ipSecRemoveTransportModeTransform()");
Luke Huange203a152018-11-23 11:47:28 +0800719 return asBinderStatus(gCtls->xfrmCtrl.ipSecRemoveTransportModeTransform(socket.get()));
Nathan Harold1a371532017-01-30 12:30:48 -0800720}
721
Benedict Wonga04ffa72018-05-09 21:42:42 -0700722binder::Status NetdNativeService::ipSecAddSecurityPolicy(int32_t transformId, int32_t selAddrFamily,
723 int32_t direction,
Benedict Wongad600cb2018-05-14 17:22:35 -0700724 const std::string& tmplSrcAddress,
725 const std::string& tmplDstAddress,
726 int32_t spi, int32_t markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700727 int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800728 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900729 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900730 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800731 return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityPolicy(
Benedict Wonga04ffa72018-05-09 21:42:42 -0700732 transformId, selAddrFamily, direction, tmplSrcAddress, tmplDstAddress, spi, markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700733 markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800734}
735
Benedict Wonga450e722018-05-07 10:29:02 -0700736binder::Status NetdNativeService::ipSecUpdateSecurityPolicy(
737 int32_t transformId, int32_t selAddrFamily, int32_t direction,
738 const std::string& tmplSrcAddress, const std::string& tmplDstAddress, int32_t spi,
739 int32_t markValue, int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800740 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900741 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900742 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800743 return asBinderStatus(gCtls->xfrmCtrl.ipSecUpdateSecurityPolicy(
Benedict Wonga04ffa72018-05-09 21:42:42 -0700744 transformId, selAddrFamily, direction, tmplSrcAddress, tmplDstAddress, spi, markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700745 markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800746}
747
Benedict Wonga04ffa72018-05-09 21:42:42 -0700748binder::Status NetdNativeService::ipSecDeleteSecurityPolicy(int32_t transformId,
749 int32_t selAddrFamily,
750 int32_t direction, int32_t markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700751 int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800752 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900753 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900754 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800755 return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityPolicy(
Benedict Wonga450e722018-05-07 10:29:02 -0700756 transformId, selAddrFamily, direction, markValue, markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800757}
758
Benedict Wong319f17e2018-05-15 17:06:44 -0700759binder::Status NetdNativeService::ipSecAddTunnelInterface(const std::string& deviceName,
760 const std::string& localAddress,
761 const std::string& remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700762 int32_t iKey, int32_t oKey,
763 int32_t interfaceId) {
manojboopathi8707f232018-01-02 14:45:47 -0800764 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900765 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700766 netdutils::Status result = gCtls->xfrmCtrl.ipSecAddTunnelInterface(
Benedict Wonga450e722018-05-07 10:29:02 -0700767 deviceName, localAddress, remoteAddress, iKey, oKey, interfaceId, false);
Benedict Wong319f17e2018-05-15 17:06:44 -0700768 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800769}
770
Benedict Wong319f17e2018-05-15 17:06:44 -0700771binder::Status NetdNativeService::ipSecUpdateTunnelInterface(const std::string& deviceName,
772 const std::string& localAddress,
773 const std::string& remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700774 int32_t iKey, int32_t oKey,
775 int32_t interfaceId) {
manojboopathi8707f232018-01-02 14:45:47 -0800776 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900777 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700778 netdutils::Status result = gCtls->xfrmCtrl.ipSecAddTunnelInterface(
Benedict Wonga450e722018-05-07 10:29:02 -0700779 deviceName, localAddress, remoteAddress, iKey, oKey, interfaceId, true);
Benedict Wong319f17e2018-05-15 17:06:44 -0700780 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800781}
782
Benedict Wong319f17e2018-05-15 17:06:44 -0700783binder::Status NetdNativeService::ipSecRemoveTunnelInterface(const std::string& deviceName) {
manojboopathi8707f232018-01-02 14:45:47 -0800784 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900785 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700786 netdutils::Status result = gCtls->xfrmCtrl.ipSecRemoveTunnelInterface(deviceName);
Benedict Wong319f17e2018-05-15 17:06:44 -0700787 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800788}
789
Joel Scherpelzde937962017-06-01 13:20:21 +0900790binder::Status NetdNativeService::setIPv6AddrGenMode(const std::string& ifName,
791 int32_t mode) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900792 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700793 return asBinderStatus(InterfaceController::setIPv6AddrGenMode(ifName, mode));
Joel Scherpelzde937962017-06-01 13:20:21 +0900794}
795
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900796binder::Status NetdNativeService::wakeupAddInterface(const std::string& ifName,
797 const std::string& prefix, int32_t mark,
798 int32_t mask) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900799 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700800 return asBinderStatus(gCtls->wakeupCtrl.addInterface(ifName, prefix, mark, mask));
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900801}
802
803binder::Status NetdNativeService::wakeupDelInterface(const std::string& ifName,
804 const std::string& prefix, int32_t mark,
805 int32_t mask) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900806 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700807 return asBinderStatus(gCtls->wakeupCtrl.delInterface(ifName, prefix, mark, mask));
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900808}
809
Chenbo Feng873ae142019-04-10 12:26:06 -0700810binder::Status NetdNativeService::trafficSwapActiveStatsMap() {
811 ENFORCE_NETWORK_STACK_PERMISSIONS();
812 return asBinderStatus(gCtls->trafficCtrl.swapActiveStatsMap());
813}
814
Luke Huang0051a622018-07-23 20:30:16 +0800815binder::Status NetdNativeService::idletimerAddInterface(const std::string& ifName, int32_t timeout,
816 const std::string& classLabel) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900817 NETD_LOCKING_RPC(gCtls->idletimerCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang0051a622018-07-23 20:30:16 +0800818 int res =
819 gCtls->idletimerCtrl.addInterfaceIdletimer(ifName.c_str(), timeout, classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +0800820 return statusFromErrcode(res);
821}
822
823binder::Status NetdNativeService::idletimerRemoveInterface(const std::string& ifName,
824 int32_t timeout,
825 const std::string& classLabel) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900826 NETD_LOCKING_RPC(gCtls->idletimerCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang0051a622018-07-23 20:30:16 +0800827 int res = gCtls->idletimerCtrl.removeInterfaceIdletimer(ifName.c_str(), timeout,
828 classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +0800829 return statusFromErrcode(res);
830}
Luke Huanga67dd562018-07-17 19:58:25 +0800831
832binder::Status NetdNativeService::strictUidCleartextPenalty(int32_t uid, int32_t policyPenalty) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900833 NETD_LOCKING_RPC(gCtls->strictCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huanga67dd562018-07-17 19:58:25 +0800834 StrictPenalty penalty;
835 switch (policyPenalty) {
836 case INetd::PENALTY_POLICY_REJECT:
837 penalty = REJECT;
838 break;
839 case INetd::PENALTY_POLICY_LOG:
840 penalty = LOG;
841 break;
842 case INetd::PENALTY_POLICY_ACCEPT:
843 penalty = ACCEPT;
844 break;
845 default:
846 return statusFromErrcode(-EINVAL);
847 break;
848 }
849 int res = gCtls->strictCtrl.setUidCleartextPenalty((uid_t) uid, penalty);
Luke Huanga67dd562018-07-17 19:58:25 +0800850 return statusFromErrcode(res);
851}
Luke Huange64fa382018-07-24 16:38:22 +0800852
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +0900853binder::Status NetdNativeService::clatdStart(const std::string& ifName,
854 const std::string& nat64Prefix, std::string* v6Addr) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900855 NETD_LOCKING_RPC(gCtls->clatdCtrl.mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +0900856 int res = gCtls->clatdCtrl.startClatd(ifName.c_str(), nat64Prefix, v6Addr);
Luke Huang6d301232018-08-01 14:05:18 +0800857 return statusFromErrcode(res);
858}
859
860binder::Status NetdNativeService::clatdStop(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900861 NETD_LOCKING_RPC(gCtls->clatdCtrl.mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang6d301232018-08-01 14:05:18 +0800862 int res = gCtls->clatdCtrl.stopClatd(ifName.c_str());
Luke Huang6d301232018-08-01 14:05:18 +0800863 return statusFromErrcode(res);
864}
Luke Huanga67dd562018-07-17 19:58:25 +0800865
Luke Huang457d4702018-08-16 15:39:15 +0800866binder::Status NetdNativeService::ipfwdEnabled(bool* status) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900867 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang728cf4c2019-03-14 19:43:02 +0800868 *status = (gCtls->tetherCtrl.getIpfwdRequesterList().size() > 0) ? true : false;
869 return binder::Status::ok();
870}
871
872binder::Status NetdNativeService::ipfwdGetRequesterList(std::vector<std::string>* requesterList) {
873 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
874 for (const auto& requester : gCtls->tetherCtrl.getIpfwdRequesterList()) {
875 requesterList->push_back(requester);
876 }
Luke Huang457d4702018-08-16 15:39:15 +0800877 return binder::Status::ok();
878}
879
880binder::Status NetdNativeService::ipfwdEnableForwarding(const std::string& requester) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900881 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang457d4702018-08-16 15:39:15 +0800882 int res = (gCtls->tetherCtrl.enableForwarding(requester.c_str())) ? 0 : -EREMOTEIO;
Luke Huang457d4702018-08-16 15:39:15 +0800883 return statusFromErrcode(res);
884}
885
886binder::Status NetdNativeService::ipfwdDisableForwarding(const std::string& requester) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900887 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang457d4702018-08-16 15:39:15 +0800888 int res = (gCtls->tetherCtrl.disableForwarding(requester.c_str())) ? 0 : -EREMOTEIO;
Luke Huang457d4702018-08-16 15:39:15 +0800889 return statusFromErrcode(res);
890}
891
892binder::Status NetdNativeService::ipfwdAddInterfaceForward(const std::string& fromIface,
893 const std::string& toIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900894 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang457d4702018-08-16 15:39:15 +0800895 int res = RouteController::enableTethering(fromIface.c_str(), toIface.c_str());
Luke Huang457d4702018-08-16 15:39:15 +0800896 return statusFromErrcode(res);
897}
898
899binder::Status NetdNativeService::ipfwdRemoveInterfaceForward(const std::string& fromIface,
900 const std::string& toIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900901 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang457d4702018-08-16 15:39:15 +0800902 int res = RouteController::disableTethering(fromIface.c_str(), toIface.c_str());
Luke Huang457d4702018-08-16 15:39:15 +0800903 return statusFromErrcode(res);
904}
905
Luke Huangf7782042018-08-08 13:13:04 +0800906namespace {
Luke Huangf7782042018-08-08 13:13:04 +0800907std::string addCurlyBrackets(const std::string& s) {
908 return "{" + s + "}";
909}
910
911} // namespace
Xiao Ma33d562a2018-12-16 16:27:38 +0900912
Luke Huangf7782042018-08-08 13:13:04 +0800913binder::Status NetdNativeService::interfaceGetList(std::vector<std::string>* interfaceListResult) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900914 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800915 const auto& ifaceList = InterfaceController::getIfaceNames();
Luke Huangf7782042018-08-08 13:13:04 +0800916
917 interfaceListResult->clear();
918 interfaceListResult->reserve(ifaceList.value().size());
919 interfaceListResult->insert(end(*interfaceListResult), begin(ifaceList.value()),
920 end(ifaceList.value()));
921
Luke Huangf7782042018-08-08 13:13:04 +0800922 return binder::Status::ok();
923}
924
925std::string interfaceConfigurationParcelToString(const InterfaceConfigurationParcel& cfg) {
926 std::vector<std::string> result{cfg.ifName, cfg.hwAddr, cfg.ipv4Addr,
927 std::to_string(cfg.prefixLength)};
928 result.insert(end(result), begin(cfg.flags), end(cfg.flags));
929 return addCurlyBrackets(base::Join(result, ", "));
930}
931
932binder::Status NetdNativeService::interfaceGetCfg(
933 const std::string& ifName, InterfaceConfigurationParcel* interfaceGetCfgResult) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900934 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800935 auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__).arg(ifName);
936
937 const auto& cfgRes = InterfaceController::getCfg(ifName);
938 RETURN_BINDER_STATUS_IF_NOT_OK(entry, cfgRes);
939
940 *interfaceGetCfgResult = cfgRes.value();
941 gLog.log(entry.returns(interfaceConfigurationParcelToString(*interfaceGetCfgResult))
942 .withAutomaticDuration());
943 return binder::Status::ok();
944}
945
946binder::Status NetdNativeService::interfaceSetCfg(const InterfaceConfigurationParcel& cfg) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900947 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800948 auto entry = gLog.newEntry()
949 .prettyFunction(__PRETTY_FUNCTION__)
950 .arg(interfaceConfigurationParcelToString(cfg));
951
952 const auto& res = InterfaceController::setCfg(cfg);
953 RETURN_BINDER_STATUS_IF_NOT_OK(entry, res);
954
955 gLog.log(entry.withAutomaticDuration());
956 return binder::Status::ok();
957}
958
959binder::Status NetdNativeService::interfaceSetIPv6PrivacyExtensions(const std::string& ifName,
960 bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900961 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800962 int res = InterfaceController::setIPv6PrivacyExtensions(ifName.c_str(), enable);
Luke Huangf7782042018-08-08 13:13:04 +0800963 return statusFromErrcode(res);
964}
965
966binder::Status NetdNativeService::interfaceClearAddrs(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900967 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800968 int res = InterfaceController::clearAddrs(ifName.c_str());
Luke Huangf7782042018-08-08 13:13:04 +0800969 return statusFromErrcode(res);
970}
971
972binder::Status NetdNativeService::interfaceSetEnableIPv6(const std::string& ifName, bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900973 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800974 int res = InterfaceController::setEnableIPv6(ifName.c_str(), enable);
Luke Huangf7782042018-08-08 13:13:04 +0800975 return statusFromErrcode(res);
976}
977
978binder::Status NetdNativeService::interfaceSetMtu(const std::string& ifName, int32_t mtuValue) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900979 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800980 std::string mtu = std::to_string(mtuValue);
981 int res = InterfaceController::setMtu(ifName.c_str(), mtu.c_str());
Luke Huangf7782042018-08-08 13:13:04 +0800982 return statusFromErrcode(res);
983}
984
Luke Huangb5733d72018-08-21 17:17:19 +0800985binder::Status NetdNativeService::tetherStart(const std::vector<std::string>& dhcpRanges) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900986 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800987 if (dhcpRanges.size() % 2 == 1) {
988 return statusFromErrcode(-EINVAL);
989 }
990 int res = gCtls->tetherCtrl.startTethering(dhcpRanges);
Luke Huangb5733d72018-08-21 17:17:19 +0800991 return statusFromErrcode(res);
992}
993
994binder::Status NetdNativeService::tetherStop() {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900995 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800996 int res = gCtls->tetherCtrl.stopTethering();
Luke Huangb5733d72018-08-21 17:17:19 +0800997 return statusFromErrcode(res);
998}
999
1000binder::Status NetdNativeService::tetherIsEnabled(bool* enabled) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001001 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001002 *enabled = gCtls->tetherCtrl.isTetheringStarted();
Luke Huangb5733d72018-08-21 17:17:19 +08001003 return binder::Status::ok();
1004}
1005
1006binder::Status NetdNativeService::tetherInterfaceAdd(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001007 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001008 int res = gCtls->tetherCtrl.tetherInterface(ifName.c_str());
Luke Huangb5733d72018-08-21 17:17:19 +08001009 return statusFromErrcode(res);
1010}
1011
1012binder::Status NetdNativeService::tetherInterfaceRemove(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001013 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001014 int res = gCtls->tetherCtrl.untetherInterface(ifName.c_str());
Luke Huangb5733d72018-08-21 17:17:19 +08001015 return statusFromErrcode(res);
1016}
1017
1018binder::Status NetdNativeService::tetherInterfaceList(std::vector<std::string>* ifList) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001019 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001020 for (const auto& ifname : gCtls->tetherCtrl.getTetheredInterfaceList()) {
1021 ifList->push_back(ifname);
1022 }
Luke Huangb5733d72018-08-21 17:17:19 +08001023 return binder::Status::ok();
1024}
1025
1026binder::Status NetdNativeService::tetherDnsSet(int32_t netId,
1027 const std::vector<std::string>& dnsAddrs) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001028 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001029 int res = gCtls->tetherCtrl.setDnsForwarders(netId, dnsAddrs);
Luke Huangb5733d72018-08-21 17:17:19 +08001030 return statusFromErrcode(res);
1031}
1032
1033binder::Status NetdNativeService::tetherDnsList(std::vector<std::string>* dnsList) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001034 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001035 for (const auto& fwdr : gCtls->tetherCtrl.getDnsForwarders()) {
1036 dnsList->push_back(fwdr);
1037 }
Luke Huangb5733d72018-08-21 17:17:19 +08001038 return binder::Status::ok();
1039}
1040
Luke Huangb670d162018-08-23 20:01:13 +08001041binder::Status NetdNativeService::networkAddRoute(int32_t netId, const std::string& ifName,
1042 const std::string& destination,
1043 const std::string& nextHop) {
1044 // Public methods of NetworkController are thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001045 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001046 bool legacy = false;
1047 uid_t uid = 0; // UID is only meaningful for legacy routes.
1048 int res = gCtls->netCtrl.addRoute(netId, ifName.c_str(), destination.c_str(),
1049 nextHop.empty() ? nullptr : nextHop.c_str(), legacy, uid);
Luke Huangb670d162018-08-23 20:01:13 +08001050 return statusFromErrcode(res);
1051}
1052
1053binder::Status NetdNativeService::networkRemoveRoute(int32_t netId, const std::string& ifName,
1054 const std::string& destination,
1055 const std::string& nextHop) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001056 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001057 bool legacy = false;
1058 uid_t uid = 0; // UID is only meaningful for legacy routes.
1059 int res = gCtls->netCtrl.removeRoute(netId, ifName.c_str(), destination.c_str(),
1060 nextHop.empty() ? nullptr : nextHop.c_str(), legacy, uid);
Luke Huangb670d162018-08-23 20:01:13 +08001061 return statusFromErrcode(res);
1062}
1063
1064binder::Status NetdNativeService::networkAddLegacyRoute(int32_t netId, const std::string& ifName,
1065 const std::string& destination,
1066 const std::string& nextHop, int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001067 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001068 bool legacy = true;
1069 int res = gCtls->netCtrl.addRoute(netId, ifName.c_str(), destination.c_str(),
1070 nextHop.empty() ? nullptr : nextHop.c_str(), legacy,
1071 (uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001072 return statusFromErrcode(res);
1073}
1074
1075binder::Status NetdNativeService::networkRemoveLegacyRoute(int32_t netId, const std::string& ifName,
1076 const std::string& destination,
1077 const std::string& nextHop,
1078 int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001079 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001080 bool legacy = true;
1081 int res = gCtls->netCtrl.removeRoute(netId, ifName.c_str(), destination.c_str(),
1082 nextHop.empty() ? nullptr : nextHop.c_str(), legacy,
1083 (uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001084 return statusFromErrcode(res);
1085}
1086
1087binder::Status NetdNativeService::networkGetDefault(int32_t* netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001088 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001089 *netId = gCtls->netCtrl.getDefaultNetwork();
Luke Huangb670d162018-08-23 20:01:13 +08001090 return binder::Status::ok();
1091}
1092
1093binder::Status NetdNativeService::networkSetDefault(int32_t netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001094 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001095 int res = gCtls->netCtrl.setDefaultNetwork(netId);
Luke Huangb670d162018-08-23 20:01:13 +08001096 return statusFromErrcode(res);
1097}
1098
1099binder::Status NetdNativeService::networkClearDefault() {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001100 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001101 unsigned netId = NETID_UNSET;
1102 int res = gCtls->netCtrl.setDefaultNetwork(netId);
Luke Huangb670d162018-08-23 20:01:13 +08001103 return statusFromErrcode(res);
1104}
1105
1106std::vector<uid_t> NetdNativeService::intsToUids(const std::vector<int32_t>& intUids) {
1107 return {begin(intUids), end(intUids)};
1108}
1109
1110Permission NetdNativeService::convertPermission(int32_t permission) {
1111 switch (permission) {
1112 case INetd::PERMISSION_NETWORK:
1113 return Permission::PERMISSION_NETWORK;
1114 case INetd::PERMISSION_SYSTEM:
1115 return Permission::PERMISSION_SYSTEM;
1116 default:
1117 return Permission::PERMISSION_NONE;
1118 }
1119}
1120
1121binder::Status NetdNativeService::networkSetPermissionForNetwork(int32_t netId,
1122 int32_t permission) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001123 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001124 std::vector<unsigned> netIds = {(unsigned) netId};
1125 int res = gCtls->netCtrl.setPermissionForNetworks(convertPermission(permission), netIds);
Luke Huangb670d162018-08-23 20:01:13 +08001126 return statusFromErrcode(res);
1127}
1128
1129binder::Status NetdNativeService::networkSetPermissionForUser(int32_t permission,
1130 const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001131 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001132 gCtls->netCtrl.setPermissionForUsers(convertPermission(permission), intsToUids(uids));
Luke Huangb670d162018-08-23 20:01:13 +08001133 return binder::Status::ok();
1134}
1135
1136binder::Status NetdNativeService::networkClearPermissionForUser(const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001137 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001138 Permission permission = Permission::PERMISSION_NONE;
1139 gCtls->netCtrl.setPermissionForUsers(permission, intsToUids(uids));
Luke Huangb670d162018-08-23 20:01:13 +08001140 return binder::Status::ok();
1141}
1142
1143binder::Status NetdNativeService::NetdNativeService::networkSetProtectAllow(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001144 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001145 std::vector<uid_t> uids = {(uid_t) uid};
1146 gCtls->netCtrl.allowProtect(uids);
Luke Huangb670d162018-08-23 20:01:13 +08001147 return binder::Status::ok();
1148}
1149
1150binder::Status NetdNativeService::networkSetProtectDeny(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001151 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001152 std::vector<uid_t> uids = {(uid_t) uid};
1153 gCtls->netCtrl.denyProtect(uids);
Luke Huangb670d162018-08-23 20:01:13 +08001154 return binder::Status::ok();
1155}
1156
1157binder::Status NetdNativeService::networkCanProtect(int32_t uid, bool* ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001158 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001159 *ret = gCtls->netCtrl.canProtect((uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001160 return binder::Status::ok();
1161}
1162
Chenbo Feng48eaed32018-12-26 17:40:21 -08001163binder::Status NetdNativeService::trafficSetNetPermForUids(int32_t permission,
1164 const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001165 ENFORCE_NETWORK_STACK_PERMISSIONS();
Chenbo Feng48eaed32018-12-26 17:40:21 -08001166 gCtls->trafficCtrl.setPermissionForUids(permission, intsToUids(uids));
Chenbo Feng48eaed32018-12-26 17:40:21 -08001167 return binder::Status::ok();
1168}
1169
Luke Huange64fa382018-07-24 16:38:22 +08001170binder::Status NetdNativeService::firewallSetFirewallType(int32_t firewallType) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001171 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001172 auto type = static_cast<FirewallType>(firewallType);
1173
1174 int res = gCtls->firewallCtrl.setFirewallType(type);
Luke Huange64fa382018-07-24 16:38:22 +08001175 return statusFromErrcode(res);
1176}
1177
1178binder::Status NetdNativeService::firewallSetInterfaceRule(const std::string& ifName,
1179 int32_t firewallRule) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001180 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001181 auto rule = static_cast<FirewallRule>(firewallRule);
1182
1183 int res = gCtls->firewallCtrl.setInterfaceRule(ifName.c_str(), rule);
Luke Huange64fa382018-07-24 16:38:22 +08001184 return statusFromErrcode(res);
1185}
1186
1187binder::Status NetdNativeService::firewallSetUidRule(int32_t childChain, int32_t uid,
1188 int32_t firewallRule) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001189 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001190 auto chain = static_cast<ChildChain>(childChain);
1191 auto rule = static_cast<FirewallRule>(firewallRule);
1192
1193 int res = gCtls->firewallCtrl.setUidRule(chain, uid, rule);
Luke Huange64fa382018-07-24 16:38:22 +08001194 return statusFromErrcode(res);
1195}
1196
1197binder::Status NetdNativeService::firewallEnableChildChain(int32_t childChain, bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001198 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001199 auto chain = static_cast<ChildChain>(childChain);
1200
1201 int res = gCtls->firewallCtrl.enableChildChains(chain, enable);
Luke Huange64fa382018-07-24 16:38:22 +08001202 return statusFromErrcode(res);
1203}
1204
Rubin Xuec27ff22019-01-08 21:33:03 +00001205binder::Status NetdNativeService::firewallAddUidInterfaceRules(const std::string& ifName,
1206 const std::vector<int32_t>& uids) {
1207 ENFORCE_NETWORK_STACK_PERMISSIONS();
1208
1209 return asBinderStatus(gCtls->trafficCtrl.addUidInterfaceRules(
1210 RouteController::getIfIndex(ifName.c_str()), uids));
1211}
1212
1213binder::Status NetdNativeService::firewallRemoveUidInterfaceRules(
1214 const std::vector<int32_t>& uids) {
1215 ENFORCE_NETWORK_STACK_PERMISSIONS();
1216
1217 return asBinderStatus(gCtls->trafficCtrl.removeUidInterfaceRules(uids));
1218}
1219
Luke Huang19b49c52018-10-22 12:12:05 +09001220binder::Status NetdNativeService::tetherAddForward(const std::string& intIface,
1221 const std::string& extIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001222 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang19b49c52018-10-22 12:12:05 +09001223
1224 int res = gCtls->tetherCtrl.enableNat(intIface.c_str(), extIface.c_str());
Luke Huang19b49c52018-10-22 12:12:05 +09001225 return statusFromErrcode(res);
1226}
1227
1228binder::Status NetdNativeService::tetherRemoveForward(const std::string& intIface,
1229 const std::string& extIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001230 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangae038f82018-11-05 11:17:31 +09001231 int res = gCtls->tetherCtrl.disableNat(intIface.c_str(), extIface.c_str());
Luke Huang19b49c52018-10-22 12:12:05 +09001232 return statusFromErrcode(res);
1233}
1234
Chenbo Fengf5663d82018-11-08 16:10:48 -08001235binder::Status NetdNativeService::setTcpRWmemorySize(const std::string& rmemValues,
1236 const std::string& wmemValues) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001237 ENFORCE_NETWORK_STACK_PERMISSIONS();
Chenbo Fengf5663d82018-11-08 16:10:48 -08001238 if (!WriteStringToFile(rmemValues, TCP_RMEM_PROC_FILE)) {
1239 int ret = -errno;
Chenbo Fengf5663d82018-11-08 16:10:48 -08001240 return statusFromErrcode(ret);
1241 }
1242
1243 if (!WriteStringToFile(wmemValues, TCP_WMEM_PROC_FILE)) {
1244 int ret = -errno;
Chenbo Fengf5663d82018-11-08 16:10:48 -08001245 return statusFromErrcode(ret);
1246 }
Chenbo Fengf5663d82018-11-08 16:10:48 -08001247 return binder::Status::ok();
1248}
1249
Luke Huang528af602018-08-29 19:06:05 +08001250binder::Status NetdNativeService::registerUnsolicitedEventListener(
1251 const android::sp<android::net::INetdUnsolicitedEventListener>& listener) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001252 ENFORCE_NETWORK_STACK_PERMISSIONS();
Bernie Innocenti9ee088d2019-02-01 17:14:32 +09001253 gCtls->eventReporter.registerUnsolEventListener(listener);
Luke Huang528af602018-08-29 19:06:05 +08001254 return binder::Status::ok();
1255}
1256
Lorenzo Colittie4d626e2016-02-02 17:19:04 +09001257} // namespace net
1258} // namespace android