blob: 65d47272f3df188e2d0907bdae3154918305fbfc [file] [log] [blame]
Lorenzo Colittie4d626e2016-02-02 17:19:04 +09001/**
2 * Copyright (c) 2016, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "Netd"
18
Luke Huangcaebcbb2018-09-27 20:37:14 +080019#include <cinttypes>
Xiao Ma33d562a2018-12-16 16:27:38 +090020#include <numeric>
Ben Schwartz4204ecf2017-10-02 12:35:48 -040021#include <set>
Xiao Ma64b15b72019-03-20 11:33:15 +090022#include <string>
Erik Kline38e51f12018-09-06 20:14:44 +090023#include <tuple>
Lorenzo Colitti89faa342016-02-26 11:38:47 +090024#include <vector>
25
Chenbo Fengf5663d82018-11-08 16:10:48 -080026#include <android-base/file.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090027#include <android-base/stringprintf.h>
Ben Schwartz4204ecf2017-10-02 12:35:48 -040028#include <android-base/strings.h>
Luke Huange3f11812019-05-02 18:10:15 +080029#include <binder/IPCThreadState.h>
30#include <binder/IServiceManager.h>
31#include <binder/Status.h>
Robin Lee2cf56172016-09-13 18:55:42 +090032#include <cutils/properties.h>
Luke Huange3f11812019-05-02 18:10:15 +080033#include <json/value.h>
34#include <json/writer.h>
Logan Chien3f461482018-04-23 14:31:32 +080035#include <log/log.h>
Luke Huange3f11812019-05-02 18:10:15 +080036#include <netdutils/DumpWriter.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090037#include <utils/Errors.h>
Pierre Imaibeedec32016-04-13 06:44:51 +090038#include <utils/String16.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090039
Luke Huange3f11812019-05-02 18:10:15 +080040#include "BinderUtil.h"
Lorenzo Colitti89faa342016-02-26 11:38:47 +090041#include "Controllers.h"
Erik Kline55b06f82016-07-04 09:57:18 +090042#include "InterfaceController.h"
Mike Yu5ae61542018-10-19 22:11:43 +080043#include "NetdConstants.h" // SHA256_SIZE
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090044#include "NetdNativeService.h"
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090045#include "NetdPermissions.h"
Luke Huang0e5e69d2019-03-06 15:42:38 +080046#include "OemNetdListener.h"
Luke Huangb670d162018-08-23 20:01:13 +080047#include "Permission.h"
Erik Kline85890042018-05-25 19:19:11 +090048#include "Process.h"
Robin Leeb8087362016-03-30 18:43:08 +010049#include "RouteController.h"
Lorenzo Colitti563d98b2016-04-24 13:13:14 +090050#include "SockDiag.h"
Robin Leeb8087362016-03-30 18:43:08 +010051#include "UidRanges.h"
Xiao Ma33d562a2018-12-16 16:27:38 +090052#include "android/net/BnNetd.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
151} // namespace
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900152
Luke Huange3f11812019-05-02 18:10:15 +0800153NetdNativeService::NetdNativeService() {
154 // register log callback to BnNetd::logFunc
155 BnNetd::logFunc = std::bind(binderCallLogFn, std::placeholders::_1,
156 [](const std::string& msg) { gLog.info("%s", msg.c_str()); });
157}
158
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900159status_t NetdNativeService::start() {
160 IPCThreadState::self()->disableBackgroundScheduling(true);
Erik Klineb31fd692018-06-06 20:50:11 +0900161 const status_t ret = BinderService<NetdNativeService>::publish();
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900162 if (ret != android::OK) {
163 return ret;
164 }
165 sp<ProcessState> ps(ProcessState::self());
166 ps->startThreadPool();
167 ps->giveThreadPoolName();
Xiao Ma33d562a2018-12-16 16:27:38 +0900168
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900169 return android::OK;
170}
171
Hugo Benichi7b314e12018-01-15 21:54:00 +0900172status_t NetdNativeService::dump(int fd, const Vector<String16> &args) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900173 const binder::Status dump_permission = checkAnyPermission({PERM_DUMP});
Erik Kline2d3a1632016-03-15 16:33:48 +0900174 if (!dump_permission.isOk()) {
175 const String8 msg(dump_permission.toString8());
176 write(fd, msg.string(), msg.size());
177 return PERMISSION_DENIED;
178 }
179
180 // This method does not grab any locks. If individual classes need locking
181 // their dump() methods MUST handle locking appropriately.
Hugo Benichi7b314e12018-01-15 21:54:00 +0900182
Erik Kline2d3a1632016-03-15 16:33:48 +0900183 DumpWriter dw(fd);
Hugo Benichi7b314e12018-01-15 21:54:00 +0900184
185 if (!args.isEmpty() && args[0] == TcpSocketMonitor::DUMP_KEYWORD) {
186 dw.blankline();
187 gCtls->tcpSocketMonitor.dump(dw);
188 dw.blankline();
189 return NO_ERROR;
190 }
191
Chenbo Fengef297172018-03-26 10:53:33 -0700192 if (!args.isEmpty() && args[0] == TrafficController::DUMP_KEYWORD) {
193 dw.blankline();
194 gCtls->trafficCtrl.dump(dw, true);
195 dw.blankline();
196 return NO_ERROR;
197 }
198
Erik Kline85890042018-05-25 19:19:11 +0900199 process::dump(dw);
Erik Kline2d3a1632016-03-15 16:33:48 +0900200 dw.blankline();
201 gCtls->netCtrl.dump(dw);
202 dw.blankline();
203
Chenbo Fengef297172018-03-26 10:53:33 -0700204 gCtls->trafficCtrl.dump(dw, false);
205 dw.blankline();
206
Benedict Wongaf855432018-05-10 17:07:37 -0700207 gCtls->xfrmCtrl.dump(dw);
208 dw.blankline();
209
Maciej Żenczykowski55262712019-03-29 23:44:56 -0700210 gCtls->clatdCtrl.dump(dw);
211 dw.blankline();
212
Erik Klineb31fd692018-06-06 20:50:11 +0900213 {
214 ScopedIndent indentLog(dw);
215 if (contains(args, String16(OPT_SHORT))) {
216 dw.println("Log: <omitted>");
217 } else {
218 dw.println("Log:");
219 ScopedIndent indentLogEntries(dw);
220 gLog.forEachEntry([&dw](const std::string& entry) mutable { dw.println(entry); });
221 }
222 dw.blankline();
223 }
224
Luke Huang528af602018-08-29 19:06:05 +0800225 {
226 ScopedIndent indentLog(dw);
227 if (contains(args, String16(OPT_SHORT))) {
228 dw.println("UnsolicitedLog: <omitted>");
229 } else {
230 dw.println("UnsolicitedLog:");
231 ScopedIndent indentLogEntries(dw);
232 gUnsolicitedLog.forEachEntry(
233 [&dw](const std::string& entry) mutable { dw.println(entry); });
234 }
235 dw.blankline();
236 }
237
Erik Kline2d3a1632016-03-15 16:33:48 +0900238 return NO_ERROR;
239}
240
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900241binder::Status NetdNativeService::isAlive(bool *alive) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900242 NETD_BIG_LOCK_RPC(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900243
244 *alive = true;
Erik Klineb31fd692018-06-06 20:50:11 +0900245
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900246 return binder::Status::ok();
247}
248
Erik Klinef52d4522018-03-14 15:01:46 +0900249binder::Status NetdNativeService::firewallReplaceUidChain(const std::string& chainName,
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900250 bool isWhitelist, const std::vector<int32_t>& uids, bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900251 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_CONNECTIVITY_INTERNAL,
252 PERM_MAINLINE_NETWORK_STACK);
Erik Klinef52d4522018-03-14 15:01:46 +0900253 int err = gCtls->firewallCtrl.replaceUidChain(chainName, isWhitelist, uids);
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900254 *ret = (err == 0);
255 return binder::Status::ok();
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900256}
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900257
258binder::Status NetdNativeService::bandwidthEnableDataSaver(bool enable, bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900259 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_CONNECTIVITY_INTERNAL,
260 PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900261 int err = gCtls->bandwidthCtrl.enableDataSaver(enable);
262 *ret = (err == 0);
263 return binder::Status::ok();
264}
265
Luke Huang531f5d32018-08-03 15:19:05 +0800266binder::Status NetdNativeService::bandwidthSetInterfaceQuota(const std::string& ifName,
267 int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900268 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800269 int res = gCtls->bandwidthCtrl.setInterfaceQuota(ifName, bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800270 return statusFromErrcode(res);
271}
272
273binder::Status NetdNativeService::bandwidthRemoveInterfaceQuota(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900274 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800275 int res = gCtls->bandwidthCtrl.removeInterfaceQuota(ifName);
Luke Huang531f5d32018-08-03 15:19:05 +0800276 return statusFromErrcode(res);
277}
278
279binder::Status NetdNativeService::bandwidthSetInterfaceAlert(const std::string& ifName,
280 int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900281 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800282 int res = gCtls->bandwidthCtrl.setInterfaceAlert(ifName, bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800283 return statusFromErrcode(res);
284}
285
286binder::Status NetdNativeService::bandwidthRemoveInterfaceAlert(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900287 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800288 int res = gCtls->bandwidthCtrl.removeInterfaceAlert(ifName);
Luke Huang531f5d32018-08-03 15:19:05 +0800289 return statusFromErrcode(res);
290}
291
292binder::Status NetdNativeService::bandwidthSetGlobalAlert(int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900293 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800294 int res = gCtls->bandwidthCtrl.setGlobalAlert(bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800295 return statusFromErrcode(res);
296}
297
298binder::Status NetdNativeService::bandwidthAddNaughtyApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900299 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800300 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
301 int res = gCtls->bandwidthCtrl.addNaughtyApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800302 return statusFromErrcode(res);
303}
304
305binder::Status NetdNativeService::bandwidthRemoveNaughtyApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900306 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800307 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
308 int res = gCtls->bandwidthCtrl.removeNaughtyApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800309 return statusFromErrcode(res);
310}
311
312binder::Status NetdNativeService::bandwidthAddNiceApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900313 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800314 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
315 int res = gCtls->bandwidthCtrl.addNiceApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800316 return statusFromErrcode(res);
317}
318
319binder::Status NetdNativeService::bandwidthRemoveNiceApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900320 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800321 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
322 int res = gCtls->bandwidthCtrl.removeNiceApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800323 return statusFromErrcode(res);
324}
325
Luke Huangb670d162018-08-23 20:01:13 +0800326binder::Status NetdNativeService::networkCreatePhysical(int32_t netId, int32_t permission) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900327 ENFORCE_INTERNAL_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +0800328 int ret = gCtls->netCtrl.createPhysicalNetwork(netId, convertPermission(permission));
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900329 return statusFromErrcode(ret);
330}
331
cken67cd14c2018-12-05 17:26:59 +0900332binder::Status NetdNativeService::networkCreateVpn(int32_t netId, bool secure) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900333 ENFORCE_NETWORK_STACK_PERMISSIONS();
cken67cd14c2018-12-05 17:26:59 +0900334 int ret = gCtls->netCtrl.createVirtualNetwork(netId, secure);
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900335 return statusFromErrcode(ret);
336}
337
338binder::Status NetdNativeService::networkDestroy(int32_t netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900339 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangd33a8f42019-03-14 16:10:04 +0800340 // NetworkController::destroyNetwork is thread-safe.
Mike Yu4fe1b9c2019-01-29 17:50:19 +0800341 const int ret = gCtls->netCtrl.destroyNetwork(netId);
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900342 return statusFromErrcode(ret);
343}
344
345binder::Status NetdNativeService::networkAddInterface(int32_t netId, const std::string& iface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900346 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900347 int ret = gCtls->netCtrl.addInterfaceToNetwork(netId, iface.c_str());
348 return statusFromErrcode(ret);
349}
350
351binder::Status NetdNativeService::networkRemoveInterface(int32_t netId, const std::string& iface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900352 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900353 int ret = gCtls->netCtrl.removeInterfaceFromNetwork(netId, iface.c_str());
354 return statusFromErrcode(ret);
355}
356
Luke Huang94658ac2018-10-18 19:35:12 +0900357binder::Status NetdNativeService::networkAddUidRanges(
358 int32_t netId, const std::vector<UidRangeParcel>& uidRangeArray) {
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900359 // NetworkController::addUsersToNetwork is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900360 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900361 int ret = gCtls->netCtrl.addUsersToNetwork(netId, UidRanges(uidRangeArray));
362 return statusFromErrcode(ret);
363}
364
Luke Huang94658ac2018-10-18 19:35:12 +0900365binder::Status NetdNativeService::networkRemoveUidRanges(
366 int32_t netId, const std::vector<UidRangeParcel>& uidRangeArray) {
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900367 // NetworkController::removeUsersFromNetwork is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900368 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900369 int ret = gCtls->netCtrl.removeUsersFromNetwork(netId, UidRanges(uidRangeArray));
370 return statusFromErrcode(ret);
371}
372
Luke Huang94658ac2018-10-18 19:35:12 +0900373binder::Status NetdNativeService::networkRejectNonSecureVpn(
374 bool add, const std::vector<UidRangeParcel>& uidRangeArray) {
Robin Leeb8087362016-03-30 18:43:08 +0100375 // TODO: elsewhere RouteController is only used from the tethering and network controllers, so
376 // it should be possible to use the same lock as NetworkController. However, every call through
377 // the CommandListener "network" command will need to hold this lock too, not just the ones that
378 // read/modify network internal state (that is sufficient for ::dump() because it doesn't
379 // look at routes, but it's not enough here).
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900380 NETD_BIG_LOCK_RPC(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900381 UidRanges uidRanges(uidRangeArray);
Robin Leeb8087362016-03-30 18:43:08 +0100382
383 int err;
384 if (add) {
385 err = RouteController::addUsersToRejectNonSecureNetworkRule(uidRanges);
386 } else {
387 err = RouteController::removeUsersFromRejectNonSecureNetworkRule(uidRanges);
388 }
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900389 return statusFromErrcode(err);
Robin Leeb8087362016-03-30 18:43:08 +0100390}
391
Luke Huang94658ac2018-10-18 19:35:12 +0900392binder::Status NetdNativeService::socketDestroy(const std::vector<UidRangeParcel>& uids,
393 const std::vector<int32_t>& skipUids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900394 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900395
396 SockDiag sd;
397 if (!sd.open()) {
398 return binder::Status::fromServiceSpecificError(EIO,
399 String8("Could not open SOCK_DIAG socket"));
400 }
401
402 UidRanges uidRanges(uids);
Lorenzo Colittie5c3c992016-07-26 17:53:50 +0900403 int err = sd.destroySockets(uidRanges, std::set<uid_t>(skipUids.begin(), skipUids.end()),
404 true /* excludeLoopback */);
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900405 if (err) {
406 return binder::Status::fromServiceSpecificError(-err,
407 String8::format("destroySockets: %s", strerror(-err)));
408 }
Pierre Imaibeedec32016-04-13 06:44:51 +0900409 return binder::Status::ok();
410}
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900411
Erik Klinef48e4dd2016-07-18 04:02:07 +0900412binder::Status NetdNativeService::tetherApplyDnsInterfaces(bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900413 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Erik Klinef48e4dd2016-07-18 04:02:07 +0900414 *ret = gCtls->tetherCtrl.applyDnsInterfaces();
415 return binder::Status::ok();
416}
417
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900418namespace {
419
Luke Huangcaebcbb2018-09-27 20:37:14 +0800420void tetherAddStatsByInterface(TetherController::TetherStats* tetherStatsParcel,
421 const TetherController::TetherStats& tetherStats) {
422 if (tetherStatsParcel->extIface == tetherStats.extIface) {
423 tetherStatsParcel->rxBytes += tetherStats.rxBytes;
424 tetherStatsParcel->rxPackets += tetherStats.rxPackets;
425 tetherStatsParcel->txBytes += tetherStats.txBytes;
426 tetherStatsParcel->txPackets += tetherStats.txPackets;
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900427 }
Luke Huangcaebcbb2018-09-27 20:37:14 +0800428}
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900429
Luke Huangcaebcbb2018-09-27 20:37:14 +0800430TetherStatsParcel toTetherStatsParcel(const TetherController::TetherStats& stats) {
431 TetherStatsParcel result;
432 result.iface = stats.extIface;
433 result.rxBytes = stats.rxBytes;
434 result.rxPackets = stats.rxPackets;
435 result.txBytes = stats.txBytes;
436 result.txPackets = stats.txPackets;
437 return result;
438}
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900439
Luke Huangcaebcbb2018-09-27 20:37:14 +0800440void setTetherStatsParcelVecByInterface(std::vector<TetherStatsParcel>* tetherStatsVec,
441 const TetherController::TetherStatsList& statsList) {
442 std::map<std::string, TetherController::TetherStats> statsMap;
443 for (const auto& stats : statsList) {
444 auto iter = statsMap.find(stats.extIface);
445 if (iter != statsMap.end()) {
446 tetherAddStatsByInterface(&(iter->second), stats);
447 } else {
448 statsMap.insert(
449 std::pair<std::string, TetherController::TetherStats>(stats.extIface, stats));
450 }
451 }
452 for (auto iter = statsMap.begin(); iter != statsMap.end(); iter++) {
453 tetherStatsVec->push_back(toTetherStatsParcel(iter->second));
454 }
455}
456
457std::vector<std::string> tetherStatsParcelVecToStringVec(std::vector<TetherStatsParcel>* tVec) {
458 std::vector<std::string> result;
459 for (const auto& t : *tVec) {
460 result.push_back(StringPrintf("%s:%" PRId64 ",%" PRId64 ",%" PRId64 ",%" PRId64,
461 t.iface.c_str(), t.rxBytes, t.rxPackets, t.txBytes,
462 t.txPackets));
463 }
464 return result;
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900465}
466
467} // namespace
468
Luke Huangcaebcbb2018-09-27 20:37:14 +0800469binder::Status NetdNativeService::tetherGetStats(
470 std::vector<TetherStatsParcel>* tetherStatsParcelVec) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900471 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti5192bf72017-09-04 13:30:59 +0900472 const auto& statsList = gCtls->tetherCtrl.getTetherStats();
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900473 if (!isOk(statsList)) {
Nathan Harold28ccfef2018-03-16 19:02:47 -0700474 return asBinderStatus(statsList);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900475 }
Luke Huangcaebcbb2018-09-27 20:37:14 +0800476 setTetherStatsParcelVecByInterface(tetherStatsParcelVec, statsList.value());
477 auto statsResults = tetherStatsParcelVecToStringVec(tetherStatsParcelVec);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900478 return binder::Status::ok();
479}
480
Erik Kline53c20882016-08-02 15:22:53 +0900481binder::Status NetdNativeService::interfaceAddAddress(const std::string &ifName,
482 const std::string &addrString, int prefixLength) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900483 ENFORCE_INTERNAL_PERMISSIONS();
Erik Kline53c20882016-08-02 15:22:53 +0900484 const int err = InterfaceController::addAddress(
485 ifName.c_str(), addrString.c_str(), prefixLength);
486 if (err != 0) {
487 return binder::Status::fromServiceSpecificError(-err,
488 String8::format("InterfaceController error: %s", strerror(-err)));
489 }
490 return binder::Status::ok();
491}
492
493binder::Status NetdNativeService::interfaceDelAddress(const std::string &ifName,
494 const std::string &addrString, int prefixLength) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900495 ENFORCE_INTERNAL_PERMISSIONS();
Erik Kline53c20882016-08-02 15:22:53 +0900496 const int err = InterfaceController::delAddress(
497 ifName.c_str(), addrString.c_str(), prefixLength);
498 if (err != 0) {
499 return binder::Status::fromServiceSpecificError(-err,
500 String8::format("InterfaceController error: %s", strerror(-err)));
501 }
502 return binder::Status::ok();
503}
504
Erik Kline38e51f12018-09-06 20:14:44 +0900505namespace {
Erik Kline55b06f82016-07-04 09:57:18 +0900506
Erik Kline38e51f12018-09-06 20:14:44 +0900507std::tuple<binder::Status, const char*, const char*> getPathComponents(int32_t ipversion,
508 int32_t category) {
509 const char* ipversionStr = nullptr;
510 switch (ipversion) {
Erik Kline55b06f82016-07-04 09:57:18 +0900511 case INetd::IPV4:
Erik Kline38e51f12018-09-06 20:14:44 +0900512 ipversionStr = "ipv4";
Erik Kline55b06f82016-07-04 09:57:18 +0900513 break;
514 case INetd::IPV6:
Erik Kline38e51f12018-09-06 20:14:44 +0900515 ipversionStr = "ipv6";
Erik Kline55b06f82016-07-04 09:57:18 +0900516 break;
517 default:
Erik Kline38e51f12018-09-06 20:14:44 +0900518 return {binder::Status::fromServiceSpecificError(EAFNOSUPPORT, "Bad IP version"),
519 nullptr, nullptr};
Erik Kline55b06f82016-07-04 09:57:18 +0900520 }
521
Erik Kline38e51f12018-09-06 20:14:44 +0900522 const char* whichStr = nullptr;
523 switch (category) {
Erik Kline55b06f82016-07-04 09:57:18 +0900524 case INetd::CONF:
525 whichStr = "conf";
526 break;
527 case INetd::NEIGH:
528 whichStr = "neigh";
529 break;
530 default:
Erik Kline38e51f12018-09-06 20:14:44 +0900531 return {binder::Status::fromServiceSpecificError(EINVAL, "Bad category"), nullptr,
532 nullptr};
Erik Kline55b06f82016-07-04 09:57:18 +0900533 }
534
Erik Kline38e51f12018-09-06 20:14:44 +0900535 return {binder::Status::ok(), ipversionStr, whichStr};
536}
537
538} // namespace
539
540binder::Status NetdNativeService::getProcSysNet(int32_t ipversion, int32_t which,
541 const std::string& ifname,
542 const std::string& parameter, std::string* value) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900543 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline38e51f12018-09-06 20:14:44 +0900544 const auto pathParts = getPathComponents(ipversion, which);
545 const auto& pathStatus = std::get<0>(pathParts);
546 if (!pathStatus.isOk()) {
Erik Kline38e51f12018-09-06 20:14:44 +0900547 return pathStatus;
Erik Kline55b06f82016-07-04 09:57:18 +0900548 }
Erik Kline38e51f12018-09-06 20:14:44 +0900549
550 const int err = InterfaceController::getParameter(std::get<1>(pathParts),
551 std::get<2>(pathParts), ifname.c_str(),
552 parameter.c_str(), value);
Erik Kline38e51f12018-09-06 20:14:44 +0900553 return statusFromErrcode(err);
554}
555
556binder::Status NetdNativeService::setProcSysNet(int32_t ipversion, int32_t which,
557 const std::string& ifname,
558 const std::string& parameter,
559 const std::string& value) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900560 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline38e51f12018-09-06 20:14:44 +0900561 const auto pathParts = getPathComponents(ipversion, which);
562 const auto& pathStatus = std::get<0>(pathParts);
563 if (!pathStatus.isOk()) {
Erik Kline38e51f12018-09-06 20:14:44 +0900564 return pathStatus;
565 }
566
567 const int err = InterfaceController::setParameter(std::get<1>(pathParts),
568 std::get<2>(pathParts), ifname.c_str(),
569 parameter.c_str(), value.c_str());
Erik Kline38e51f12018-09-06 20:14:44 +0900570 return statusFromErrcode(err);
Erik Kline55b06f82016-07-04 09:57:18 +0900571}
572
Luke Huange203a152018-11-23 11:47:28 +0800573binder::Status NetdNativeService::ipSecSetEncapSocketOwner(const ParcelFileDescriptor& socket,
574 int newUid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900575 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900576 gLog.log("ipSecSetEncapSocketOwner()");
Benedict Wongb2daefb2017-12-06 22:05:46 -0800577
578 uid_t callerUid = IPCThreadState::self()->getCallingUid();
Luke Huange203a152018-11-23 11:47:28 +0800579 return asBinderStatus(
580 gCtls->xfrmCtrl.ipSecSetEncapSocketOwner(socket.get(), newUid, callerUid));
Benedict Wongb2daefb2017-12-06 22:05:46 -0800581}
582
Nathan Harold1a371532017-01-30 12:30:48 -0800583binder::Status NetdNativeService::ipSecAllocateSpi(
584 int32_t transformId,
Nathan Haroldda54f122018-01-09 16:42:57 -0800585 const std::string& sourceAddress,
586 const std::string& destinationAddress,
Nathan Harold1a371532017-01-30 12:30:48 -0800587 int32_t inSpi,
588 int32_t* outSpi) {
589 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900590 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900591 gLog.log("ipSecAllocateSpi()");
ludi6e8eccd2017-08-14 14:40:37 -0700592 return asBinderStatus(gCtls->xfrmCtrl.ipSecAllocateSpi(
Nathan Harold1a371532017-01-30 12:30:48 -0800593 transformId,
Nathan Haroldda54f122018-01-09 16:42:57 -0800594 sourceAddress,
595 destinationAddress,
Nathan Harold1a371532017-01-30 12:30:48 -0800596 inSpi,
597 outSpi));
598}
599
600binder::Status NetdNativeService::ipSecAddSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700601 int32_t transformId, int32_t mode, const std::string& sourceAddress,
602 const std::string& destinationAddress, int32_t underlyingNetId, int32_t spi,
603 int32_t markValue, int32_t markMask, const std::string& authAlgo,
604 const std::vector<uint8_t>& authKey, int32_t authTruncBits, const std::string& cryptAlgo,
605 const std::vector<uint8_t>& cryptKey, int32_t cryptTruncBits, const std::string& aeadAlgo,
606 const std::vector<uint8_t>& aeadKey, int32_t aeadIcvBits, int32_t encapType,
607 int32_t encapLocalPort, int32_t encapRemotePort, int32_t interfaceId) {
Nathan Harold1a371532017-01-30 12:30:48 -0800608 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900609 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900610 gLog.log("ipSecAddSecurityAssociation()");
ludi6e8eccd2017-08-14 14:40:37 -0700611 return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityAssociation(
Benedict Wongad600cb2018-05-14 17:22:35 -0700612 transformId, mode, sourceAddress, destinationAddress, underlyingNetId, spi, markValue,
613 markMask, authAlgo, authKey, authTruncBits, cryptAlgo, cryptKey, cryptTruncBits,
Benedict Wonga450e722018-05-07 10:29:02 -0700614 aeadAlgo, aeadKey, aeadIcvBits, encapType, encapLocalPort, encapRemotePort,
615 interfaceId));
Nathan Harold1a371532017-01-30 12:30:48 -0800616}
617
618binder::Status NetdNativeService::ipSecDeleteSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700619 int32_t transformId, const std::string& sourceAddress,
620 const std::string& destinationAddress, int32_t spi, int32_t markValue, int32_t markMask,
621 int32_t interfaceId) {
Nathan Harold1a371532017-01-30 12:30:48 -0800622 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900623 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900624 gLog.log("ipSecDeleteSecurityAssociation()");
ludi6e8eccd2017-08-14 14:40:37 -0700625 return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700626 transformId, sourceAddress, destinationAddress, spi, markValue, markMask, interfaceId));
Nathan Harold1a371532017-01-30 12:30:48 -0800627}
628
629binder::Status NetdNativeService::ipSecApplyTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800630 const ParcelFileDescriptor& socket, int32_t transformId, int32_t direction,
631 const std::string& sourceAddress, const std::string& destinationAddress, int32_t spi) {
Nathan Harold1a371532017-01-30 12:30:48 -0800632 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900633 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900634 gLog.log("ipSecApplyTransportModeTransform()");
ludi6e8eccd2017-08-14 14:40:37 -0700635 return asBinderStatus(gCtls->xfrmCtrl.ipSecApplyTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800636 socket.get(), transformId, direction, sourceAddress, destinationAddress, spi));
Nathan Harold1a371532017-01-30 12:30:48 -0800637}
638
639binder::Status NetdNativeService::ipSecRemoveTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800640 const ParcelFileDescriptor& socket) {
Nathan Harold1a371532017-01-30 12:30:48 -0800641 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900642 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900643 gLog.log("ipSecRemoveTransportModeTransform()");
Luke Huange203a152018-11-23 11:47:28 +0800644 return asBinderStatus(gCtls->xfrmCtrl.ipSecRemoveTransportModeTransform(socket.get()));
Nathan Harold1a371532017-01-30 12:30:48 -0800645}
646
Benedict Wonga04ffa72018-05-09 21:42:42 -0700647binder::Status NetdNativeService::ipSecAddSecurityPolicy(int32_t transformId, int32_t selAddrFamily,
648 int32_t direction,
Benedict Wongad600cb2018-05-14 17:22:35 -0700649 const std::string& tmplSrcAddress,
650 const std::string& tmplDstAddress,
651 int32_t spi, int32_t markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700652 int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800653 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900654 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900655 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800656 return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityPolicy(
Benedict Wonga04ffa72018-05-09 21:42:42 -0700657 transformId, selAddrFamily, direction, tmplSrcAddress, tmplDstAddress, spi, markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700658 markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800659}
660
Benedict Wonga450e722018-05-07 10:29:02 -0700661binder::Status NetdNativeService::ipSecUpdateSecurityPolicy(
662 int32_t transformId, int32_t selAddrFamily, int32_t direction,
663 const std::string& tmplSrcAddress, const std::string& tmplDstAddress, int32_t spi,
664 int32_t markValue, int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800665 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900666 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900667 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800668 return asBinderStatus(gCtls->xfrmCtrl.ipSecUpdateSecurityPolicy(
Benedict Wonga04ffa72018-05-09 21:42:42 -0700669 transformId, selAddrFamily, direction, tmplSrcAddress, tmplDstAddress, spi, markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700670 markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800671}
672
Benedict Wonga04ffa72018-05-09 21:42:42 -0700673binder::Status NetdNativeService::ipSecDeleteSecurityPolicy(int32_t transformId,
674 int32_t selAddrFamily,
675 int32_t direction, int32_t markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700676 int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800677 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900678 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900679 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800680 return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityPolicy(
Benedict Wonga450e722018-05-07 10:29:02 -0700681 transformId, selAddrFamily, direction, markValue, markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800682}
683
Benedict Wong319f17e2018-05-15 17:06:44 -0700684binder::Status NetdNativeService::ipSecAddTunnelInterface(const std::string& deviceName,
685 const std::string& localAddress,
686 const std::string& remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700687 int32_t iKey, int32_t oKey,
688 int32_t interfaceId) {
manojboopathi8707f232018-01-02 14:45:47 -0800689 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900690 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700691 netdutils::Status result = gCtls->xfrmCtrl.ipSecAddTunnelInterface(
Benedict Wonga450e722018-05-07 10:29:02 -0700692 deviceName, localAddress, remoteAddress, iKey, oKey, interfaceId, false);
Benedict Wong319f17e2018-05-15 17:06:44 -0700693 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800694}
695
Benedict Wong319f17e2018-05-15 17:06:44 -0700696binder::Status NetdNativeService::ipSecUpdateTunnelInterface(const std::string& deviceName,
697 const std::string& localAddress,
698 const std::string& remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700699 int32_t iKey, int32_t oKey,
700 int32_t interfaceId) {
manojboopathi8707f232018-01-02 14:45:47 -0800701 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900702 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700703 netdutils::Status result = gCtls->xfrmCtrl.ipSecAddTunnelInterface(
Benedict Wonga450e722018-05-07 10:29:02 -0700704 deviceName, localAddress, remoteAddress, iKey, oKey, interfaceId, true);
Benedict Wong319f17e2018-05-15 17:06:44 -0700705 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800706}
707
Benedict Wong319f17e2018-05-15 17:06:44 -0700708binder::Status NetdNativeService::ipSecRemoveTunnelInterface(const std::string& deviceName) {
manojboopathi8707f232018-01-02 14:45:47 -0800709 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900710 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700711 netdutils::Status result = gCtls->xfrmCtrl.ipSecRemoveTunnelInterface(deviceName);
Benedict Wong319f17e2018-05-15 17:06:44 -0700712 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800713}
714
Joel Scherpelzde937962017-06-01 13:20:21 +0900715binder::Status NetdNativeService::setIPv6AddrGenMode(const std::string& ifName,
716 int32_t mode) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900717 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700718 return asBinderStatus(InterfaceController::setIPv6AddrGenMode(ifName, mode));
Joel Scherpelzde937962017-06-01 13:20:21 +0900719}
720
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900721binder::Status NetdNativeService::wakeupAddInterface(const std::string& ifName,
722 const std::string& prefix, int32_t mark,
723 int32_t mask) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900724 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700725 return asBinderStatus(gCtls->wakeupCtrl.addInterface(ifName, prefix, mark, mask));
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900726}
727
728binder::Status NetdNativeService::wakeupDelInterface(const std::string& ifName,
729 const std::string& prefix, int32_t mark,
730 int32_t mask) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900731 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700732 return asBinderStatus(gCtls->wakeupCtrl.delInterface(ifName, prefix, mark, mask));
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900733}
734
Chenbo Feng873ae142019-04-10 12:26:06 -0700735binder::Status NetdNativeService::trafficSwapActiveStatsMap() {
736 ENFORCE_NETWORK_STACK_PERMISSIONS();
737 return asBinderStatus(gCtls->trafficCtrl.swapActiveStatsMap());
738}
739
Luke Huang0051a622018-07-23 20:30:16 +0800740binder::Status NetdNativeService::idletimerAddInterface(const std::string& ifName, int32_t timeout,
741 const std::string& classLabel) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900742 NETD_LOCKING_RPC(gCtls->idletimerCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang0051a622018-07-23 20:30:16 +0800743 int res =
744 gCtls->idletimerCtrl.addInterfaceIdletimer(ifName.c_str(), timeout, classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +0800745 return statusFromErrcode(res);
746}
747
748binder::Status NetdNativeService::idletimerRemoveInterface(const std::string& ifName,
749 int32_t timeout,
750 const std::string& classLabel) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900751 NETD_LOCKING_RPC(gCtls->idletimerCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang0051a622018-07-23 20:30:16 +0800752 int res = gCtls->idletimerCtrl.removeInterfaceIdletimer(ifName.c_str(), timeout,
753 classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +0800754 return statusFromErrcode(res);
755}
Luke Huanga67dd562018-07-17 19:58:25 +0800756
757binder::Status NetdNativeService::strictUidCleartextPenalty(int32_t uid, int32_t policyPenalty) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900758 NETD_LOCKING_RPC(gCtls->strictCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huanga67dd562018-07-17 19:58:25 +0800759 StrictPenalty penalty;
760 switch (policyPenalty) {
761 case INetd::PENALTY_POLICY_REJECT:
762 penalty = REJECT;
763 break;
764 case INetd::PENALTY_POLICY_LOG:
765 penalty = LOG;
766 break;
767 case INetd::PENALTY_POLICY_ACCEPT:
768 penalty = ACCEPT;
769 break;
770 default:
771 return statusFromErrcode(-EINVAL);
772 break;
773 }
774 int res = gCtls->strictCtrl.setUidCleartextPenalty((uid_t) uid, penalty);
Luke Huanga67dd562018-07-17 19:58:25 +0800775 return statusFromErrcode(res);
776}
Luke Huange64fa382018-07-24 16:38:22 +0800777
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +0900778binder::Status NetdNativeService::clatdStart(const std::string& ifName,
779 const std::string& nat64Prefix, std::string* v6Addr) {
Maciej Żenczykowski56280272019-03-30 03:32:51 -0700780 ENFORCE_ANY_PERMISSION(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +0900781 int res = gCtls->clatdCtrl.startClatd(ifName.c_str(), nat64Prefix, v6Addr);
Luke Huang6d301232018-08-01 14:05:18 +0800782 return statusFromErrcode(res);
783}
784
785binder::Status NetdNativeService::clatdStop(const std::string& ifName) {
Maciej Żenczykowski56280272019-03-30 03:32:51 -0700786 ENFORCE_ANY_PERMISSION(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang6d301232018-08-01 14:05:18 +0800787 int res = gCtls->clatdCtrl.stopClatd(ifName.c_str());
Luke Huang6d301232018-08-01 14:05:18 +0800788 return statusFromErrcode(res);
789}
Luke Huanga67dd562018-07-17 19:58:25 +0800790
Luke Huang457d4702018-08-16 15:39:15 +0800791binder::Status NetdNativeService::ipfwdEnabled(bool* status) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900792 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang728cf4c2019-03-14 19:43:02 +0800793 *status = (gCtls->tetherCtrl.getIpfwdRequesterList().size() > 0) ? true : false;
794 return binder::Status::ok();
795}
796
797binder::Status NetdNativeService::ipfwdGetRequesterList(std::vector<std::string>* requesterList) {
798 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
799 for (const auto& requester : gCtls->tetherCtrl.getIpfwdRequesterList()) {
800 requesterList->push_back(requester);
801 }
Luke Huang457d4702018-08-16 15:39:15 +0800802 return binder::Status::ok();
803}
804
805binder::Status NetdNativeService::ipfwdEnableForwarding(const std::string& requester) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900806 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang457d4702018-08-16 15:39:15 +0800807 int res = (gCtls->tetherCtrl.enableForwarding(requester.c_str())) ? 0 : -EREMOTEIO;
Luke Huang457d4702018-08-16 15:39:15 +0800808 return statusFromErrcode(res);
809}
810
811binder::Status NetdNativeService::ipfwdDisableForwarding(const std::string& requester) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900812 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang457d4702018-08-16 15:39:15 +0800813 int res = (gCtls->tetherCtrl.disableForwarding(requester.c_str())) ? 0 : -EREMOTEIO;
Luke Huang457d4702018-08-16 15:39:15 +0800814 return statusFromErrcode(res);
815}
816
817binder::Status NetdNativeService::ipfwdAddInterfaceForward(const std::string& fromIface,
818 const std::string& toIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900819 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang457d4702018-08-16 15:39:15 +0800820 int res = RouteController::enableTethering(fromIface.c_str(), toIface.c_str());
Luke Huang457d4702018-08-16 15:39:15 +0800821 return statusFromErrcode(res);
822}
823
824binder::Status NetdNativeService::ipfwdRemoveInterfaceForward(const std::string& fromIface,
825 const std::string& toIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900826 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang457d4702018-08-16 15:39:15 +0800827 int res = RouteController::disableTethering(fromIface.c_str(), toIface.c_str());
Luke Huang457d4702018-08-16 15:39:15 +0800828 return statusFromErrcode(res);
829}
830
Luke Huangf7782042018-08-08 13:13:04 +0800831namespace {
Luke Huangf7782042018-08-08 13:13:04 +0800832std::string addCurlyBrackets(const std::string& s) {
833 return "{" + s + "}";
834}
835
836} // namespace
Xiao Ma33d562a2018-12-16 16:27:38 +0900837
Luke Huangf7782042018-08-08 13:13:04 +0800838binder::Status NetdNativeService::interfaceGetList(std::vector<std::string>* interfaceListResult) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900839 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800840 const auto& ifaceList = InterfaceController::getIfaceNames();
Luke Huangf7782042018-08-08 13:13:04 +0800841
842 interfaceListResult->clear();
843 interfaceListResult->reserve(ifaceList.value().size());
844 interfaceListResult->insert(end(*interfaceListResult), begin(ifaceList.value()),
845 end(ifaceList.value()));
846
Luke Huangf7782042018-08-08 13:13:04 +0800847 return binder::Status::ok();
848}
849
850std::string interfaceConfigurationParcelToString(const InterfaceConfigurationParcel& cfg) {
851 std::vector<std::string> result{cfg.ifName, cfg.hwAddr, cfg.ipv4Addr,
852 std::to_string(cfg.prefixLength)};
853 result.insert(end(result), begin(cfg.flags), end(cfg.flags));
854 return addCurlyBrackets(base::Join(result, ", "));
855}
856
857binder::Status NetdNativeService::interfaceGetCfg(
858 const std::string& ifName, InterfaceConfigurationParcel* interfaceGetCfgResult) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900859 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800860 auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__).arg(ifName);
861
862 const auto& cfgRes = InterfaceController::getCfg(ifName);
863 RETURN_BINDER_STATUS_IF_NOT_OK(entry, cfgRes);
864
865 *interfaceGetCfgResult = cfgRes.value();
866 gLog.log(entry.returns(interfaceConfigurationParcelToString(*interfaceGetCfgResult))
867 .withAutomaticDuration());
868 return binder::Status::ok();
869}
870
871binder::Status NetdNativeService::interfaceSetCfg(const InterfaceConfigurationParcel& cfg) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900872 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800873 auto entry = gLog.newEntry()
874 .prettyFunction(__PRETTY_FUNCTION__)
875 .arg(interfaceConfigurationParcelToString(cfg));
876
877 const auto& res = InterfaceController::setCfg(cfg);
878 RETURN_BINDER_STATUS_IF_NOT_OK(entry, res);
879
880 gLog.log(entry.withAutomaticDuration());
881 return binder::Status::ok();
882}
883
884binder::Status NetdNativeService::interfaceSetIPv6PrivacyExtensions(const std::string& ifName,
885 bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900886 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800887 int res = InterfaceController::setIPv6PrivacyExtensions(ifName.c_str(), enable);
Luke Huangf7782042018-08-08 13:13:04 +0800888 return statusFromErrcode(res);
889}
890
891binder::Status NetdNativeService::interfaceClearAddrs(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900892 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800893 int res = InterfaceController::clearAddrs(ifName.c_str());
Luke Huangf7782042018-08-08 13:13:04 +0800894 return statusFromErrcode(res);
895}
896
897binder::Status NetdNativeService::interfaceSetEnableIPv6(const std::string& ifName, bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900898 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800899 int res = InterfaceController::setEnableIPv6(ifName.c_str(), enable);
Luke Huangf7782042018-08-08 13:13:04 +0800900 return statusFromErrcode(res);
901}
902
903binder::Status NetdNativeService::interfaceSetMtu(const std::string& ifName, int32_t mtuValue) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900904 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800905 std::string mtu = std::to_string(mtuValue);
906 int res = InterfaceController::setMtu(ifName.c_str(), mtu.c_str());
Luke Huangf7782042018-08-08 13:13:04 +0800907 return statusFromErrcode(res);
908}
909
Luke Huangb5733d72018-08-21 17:17:19 +0800910binder::Status NetdNativeService::tetherStart(const std::vector<std::string>& dhcpRanges) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900911 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800912 if (dhcpRanges.size() % 2 == 1) {
913 return statusFromErrcode(-EINVAL);
914 }
915 int res = gCtls->tetherCtrl.startTethering(dhcpRanges);
Luke Huangb5733d72018-08-21 17:17:19 +0800916 return statusFromErrcode(res);
917}
918
919binder::Status NetdNativeService::tetherStop() {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900920 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800921 int res = gCtls->tetherCtrl.stopTethering();
Luke Huangb5733d72018-08-21 17:17:19 +0800922 return statusFromErrcode(res);
923}
924
925binder::Status NetdNativeService::tetherIsEnabled(bool* enabled) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900926 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800927 *enabled = gCtls->tetherCtrl.isTetheringStarted();
Luke Huangb5733d72018-08-21 17:17:19 +0800928 return binder::Status::ok();
929}
930
931binder::Status NetdNativeService::tetherInterfaceAdd(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900932 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800933 int res = gCtls->tetherCtrl.tetherInterface(ifName.c_str());
Luke Huangb5733d72018-08-21 17:17:19 +0800934 return statusFromErrcode(res);
935}
936
937binder::Status NetdNativeService::tetherInterfaceRemove(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900938 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800939 int res = gCtls->tetherCtrl.untetherInterface(ifName.c_str());
Luke Huangb5733d72018-08-21 17:17:19 +0800940 return statusFromErrcode(res);
941}
942
943binder::Status NetdNativeService::tetherInterfaceList(std::vector<std::string>* ifList) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900944 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800945 for (const auto& ifname : gCtls->tetherCtrl.getTetheredInterfaceList()) {
946 ifList->push_back(ifname);
947 }
Luke Huangb5733d72018-08-21 17:17:19 +0800948 return binder::Status::ok();
949}
950
951binder::Status NetdNativeService::tetherDnsSet(int32_t netId,
952 const std::vector<std::string>& dnsAddrs) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900953 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800954 int res = gCtls->tetherCtrl.setDnsForwarders(netId, dnsAddrs);
Luke Huangb5733d72018-08-21 17:17:19 +0800955 return statusFromErrcode(res);
956}
957
958binder::Status NetdNativeService::tetherDnsList(std::vector<std::string>* dnsList) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900959 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800960 for (const auto& fwdr : gCtls->tetherCtrl.getDnsForwarders()) {
961 dnsList->push_back(fwdr);
962 }
Luke Huangb5733d72018-08-21 17:17:19 +0800963 return binder::Status::ok();
964}
965
Luke Huangb670d162018-08-23 20:01:13 +0800966binder::Status NetdNativeService::networkAddRoute(int32_t netId, const std::string& ifName,
967 const std::string& destination,
968 const std::string& nextHop) {
969 // Public methods of NetworkController are thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900970 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +0800971 bool legacy = false;
972 uid_t uid = 0; // UID is only meaningful for legacy routes.
973 int res = gCtls->netCtrl.addRoute(netId, ifName.c_str(), destination.c_str(),
974 nextHop.empty() ? nullptr : nextHop.c_str(), legacy, uid);
Luke Huangb670d162018-08-23 20:01:13 +0800975 return statusFromErrcode(res);
976}
977
978binder::Status NetdNativeService::networkRemoveRoute(int32_t netId, const std::string& ifName,
979 const std::string& destination,
980 const std::string& nextHop) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900981 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +0800982 bool legacy = false;
983 uid_t uid = 0; // UID is only meaningful for legacy routes.
984 int res = gCtls->netCtrl.removeRoute(netId, ifName.c_str(), destination.c_str(),
985 nextHop.empty() ? nullptr : nextHop.c_str(), legacy, uid);
Luke Huangb670d162018-08-23 20:01:13 +0800986 return statusFromErrcode(res);
987}
988
989binder::Status NetdNativeService::networkAddLegacyRoute(int32_t netId, const std::string& ifName,
990 const std::string& destination,
991 const std::string& nextHop, int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900992 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +0800993 bool legacy = true;
994 int res = gCtls->netCtrl.addRoute(netId, ifName.c_str(), destination.c_str(),
995 nextHop.empty() ? nullptr : nextHop.c_str(), legacy,
996 (uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +0800997 return statusFromErrcode(res);
998}
999
1000binder::Status NetdNativeService::networkRemoveLegacyRoute(int32_t netId, const std::string& ifName,
1001 const std::string& destination,
1002 const std::string& nextHop,
1003 int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001004 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001005 bool legacy = true;
1006 int res = gCtls->netCtrl.removeRoute(netId, ifName.c_str(), destination.c_str(),
1007 nextHop.empty() ? nullptr : nextHop.c_str(), legacy,
1008 (uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001009 return statusFromErrcode(res);
1010}
1011
1012binder::Status NetdNativeService::networkGetDefault(int32_t* netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001013 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001014 *netId = gCtls->netCtrl.getDefaultNetwork();
Luke Huangb670d162018-08-23 20:01:13 +08001015 return binder::Status::ok();
1016}
1017
1018binder::Status NetdNativeService::networkSetDefault(int32_t netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001019 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001020 int res = gCtls->netCtrl.setDefaultNetwork(netId);
Luke Huangb670d162018-08-23 20:01:13 +08001021 return statusFromErrcode(res);
1022}
1023
1024binder::Status NetdNativeService::networkClearDefault() {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001025 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001026 unsigned netId = NETID_UNSET;
1027 int res = gCtls->netCtrl.setDefaultNetwork(netId);
Luke Huangb670d162018-08-23 20:01:13 +08001028 return statusFromErrcode(res);
1029}
1030
1031std::vector<uid_t> NetdNativeService::intsToUids(const std::vector<int32_t>& intUids) {
1032 return {begin(intUids), end(intUids)};
1033}
1034
1035Permission NetdNativeService::convertPermission(int32_t permission) {
1036 switch (permission) {
1037 case INetd::PERMISSION_NETWORK:
1038 return Permission::PERMISSION_NETWORK;
1039 case INetd::PERMISSION_SYSTEM:
1040 return Permission::PERMISSION_SYSTEM;
1041 default:
1042 return Permission::PERMISSION_NONE;
1043 }
1044}
1045
1046binder::Status NetdNativeService::networkSetPermissionForNetwork(int32_t netId,
1047 int32_t permission) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001048 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001049 std::vector<unsigned> netIds = {(unsigned) netId};
1050 int res = gCtls->netCtrl.setPermissionForNetworks(convertPermission(permission), netIds);
Luke Huangb670d162018-08-23 20:01:13 +08001051 return statusFromErrcode(res);
1052}
1053
1054binder::Status NetdNativeService::networkSetPermissionForUser(int32_t permission,
1055 const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001056 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001057 gCtls->netCtrl.setPermissionForUsers(convertPermission(permission), intsToUids(uids));
Luke Huangb670d162018-08-23 20:01:13 +08001058 return binder::Status::ok();
1059}
1060
1061binder::Status NetdNativeService::networkClearPermissionForUser(const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001062 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001063 Permission permission = Permission::PERMISSION_NONE;
1064 gCtls->netCtrl.setPermissionForUsers(permission, intsToUids(uids));
Luke Huangb670d162018-08-23 20:01:13 +08001065 return binder::Status::ok();
1066}
1067
1068binder::Status NetdNativeService::NetdNativeService::networkSetProtectAllow(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001069 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001070 std::vector<uid_t> uids = {(uid_t) uid};
1071 gCtls->netCtrl.allowProtect(uids);
Luke Huangb670d162018-08-23 20:01:13 +08001072 return binder::Status::ok();
1073}
1074
1075binder::Status NetdNativeService::networkSetProtectDeny(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001076 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001077 std::vector<uid_t> uids = {(uid_t) uid};
1078 gCtls->netCtrl.denyProtect(uids);
Luke Huangb670d162018-08-23 20:01:13 +08001079 return binder::Status::ok();
1080}
1081
1082binder::Status NetdNativeService::networkCanProtect(int32_t uid, bool* ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001083 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001084 *ret = gCtls->netCtrl.canProtect((uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001085 return binder::Status::ok();
1086}
1087
Chenbo Feng48eaed32018-12-26 17:40:21 -08001088binder::Status NetdNativeService::trafficSetNetPermForUids(int32_t permission,
1089 const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001090 ENFORCE_NETWORK_STACK_PERMISSIONS();
Chenbo Feng48eaed32018-12-26 17:40:21 -08001091 gCtls->trafficCtrl.setPermissionForUids(permission, intsToUids(uids));
Chenbo Feng48eaed32018-12-26 17:40:21 -08001092 return binder::Status::ok();
1093}
1094
Luke Huange64fa382018-07-24 16:38:22 +08001095binder::Status NetdNativeService::firewallSetFirewallType(int32_t firewallType) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001096 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001097 auto type = static_cast<FirewallType>(firewallType);
1098
1099 int res = gCtls->firewallCtrl.setFirewallType(type);
Luke Huange64fa382018-07-24 16:38:22 +08001100 return statusFromErrcode(res);
1101}
1102
1103binder::Status NetdNativeService::firewallSetInterfaceRule(const std::string& ifName,
1104 int32_t firewallRule) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001105 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001106 auto rule = static_cast<FirewallRule>(firewallRule);
1107
1108 int res = gCtls->firewallCtrl.setInterfaceRule(ifName.c_str(), rule);
Luke Huange64fa382018-07-24 16:38:22 +08001109 return statusFromErrcode(res);
1110}
1111
1112binder::Status NetdNativeService::firewallSetUidRule(int32_t childChain, int32_t uid,
1113 int32_t firewallRule) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001114 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001115 auto chain = static_cast<ChildChain>(childChain);
1116 auto rule = static_cast<FirewallRule>(firewallRule);
1117
1118 int res = gCtls->firewallCtrl.setUidRule(chain, uid, rule);
Luke Huange64fa382018-07-24 16:38:22 +08001119 return statusFromErrcode(res);
1120}
1121
1122binder::Status NetdNativeService::firewallEnableChildChain(int32_t childChain, bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001123 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001124 auto chain = static_cast<ChildChain>(childChain);
1125
1126 int res = gCtls->firewallCtrl.enableChildChains(chain, enable);
Luke Huange64fa382018-07-24 16:38:22 +08001127 return statusFromErrcode(res);
1128}
1129
Rubin Xuec27ff22019-01-08 21:33:03 +00001130binder::Status NetdNativeService::firewallAddUidInterfaceRules(const std::string& ifName,
1131 const std::vector<int32_t>& uids) {
1132 ENFORCE_NETWORK_STACK_PERMISSIONS();
1133
1134 return asBinderStatus(gCtls->trafficCtrl.addUidInterfaceRules(
1135 RouteController::getIfIndex(ifName.c_str()), uids));
1136}
1137
1138binder::Status NetdNativeService::firewallRemoveUidInterfaceRules(
1139 const std::vector<int32_t>& uids) {
1140 ENFORCE_NETWORK_STACK_PERMISSIONS();
1141
1142 return asBinderStatus(gCtls->trafficCtrl.removeUidInterfaceRules(uids));
1143}
1144
Luke Huang19b49c52018-10-22 12:12:05 +09001145binder::Status NetdNativeService::tetherAddForward(const std::string& intIface,
1146 const std::string& extIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001147 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang19b49c52018-10-22 12:12:05 +09001148
1149 int res = gCtls->tetherCtrl.enableNat(intIface.c_str(), extIface.c_str());
Luke Huang19b49c52018-10-22 12:12:05 +09001150 return statusFromErrcode(res);
1151}
1152
1153binder::Status NetdNativeService::tetherRemoveForward(const std::string& intIface,
1154 const std::string& extIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001155 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangae038f82018-11-05 11:17:31 +09001156 int res = gCtls->tetherCtrl.disableNat(intIface.c_str(), extIface.c_str());
Luke Huang19b49c52018-10-22 12:12:05 +09001157 return statusFromErrcode(res);
1158}
1159
Chenbo Fengf5663d82018-11-08 16:10:48 -08001160binder::Status NetdNativeService::setTcpRWmemorySize(const std::string& rmemValues,
1161 const std::string& wmemValues) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001162 ENFORCE_NETWORK_STACK_PERMISSIONS();
Chenbo Fengf5663d82018-11-08 16:10:48 -08001163 if (!WriteStringToFile(rmemValues, TCP_RMEM_PROC_FILE)) {
1164 int ret = -errno;
Chenbo Fengf5663d82018-11-08 16:10:48 -08001165 return statusFromErrcode(ret);
1166 }
1167
1168 if (!WriteStringToFile(wmemValues, TCP_WMEM_PROC_FILE)) {
1169 int ret = -errno;
Chenbo Fengf5663d82018-11-08 16:10:48 -08001170 return statusFromErrcode(ret);
1171 }
Chenbo Fengf5663d82018-11-08 16:10:48 -08001172 return binder::Status::ok();
1173}
1174
Luke Huang528af602018-08-29 19:06:05 +08001175binder::Status NetdNativeService::registerUnsolicitedEventListener(
1176 const android::sp<android::net::INetdUnsolicitedEventListener>& listener) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001177 ENFORCE_NETWORK_STACK_PERMISSIONS();
Bernie Innocenti9ee088d2019-02-01 17:14:32 +09001178 gCtls->eventReporter.registerUnsolEventListener(listener);
Luke Huang528af602018-08-29 19:06:05 +08001179 return binder::Status::ok();
1180}
1181
Luke Huange60bfd82019-04-26 11:39:31 +08001182binder::Status NetdNativeService::getOemNetd(android::sp<android::IBinder>* listener) {
1183 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang0e5e69d2019-03-06 15:42:38 +08001184 *listener = com::android::internal::net::OemNetdListener::getListener();
1185
Luke Huange60bfd82019-04-26 11:39:31 +08001186 return binder::Status::ok();
1187}
1188
Lorenzo Colittie4d626e2016-02-02 17:19:04 +09001189} // namespace net
1190} // namespace android