blob: 9aec5e235be61826d735cfb2860b059739f63532 [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>
Logan Chien3f461482018-04-23 14:31:32 +080033#include <log/log.h>
Luke Huange3f11812019-05-02 18:10:15 +080034#include <netdutils/DumpWriter.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090035#include <utils/Errors.h>
Pierre Imaibeedec32016-04-13 06:44:51 +090036#include <utils/String16.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090037
Luke Huange3f11812019-05-02 18:10:15 +080038#include "BinderUtil.h"
Lorenzo Colitti89faa342016-02-26 11:38:47 +090039#include "Controllers.h"
Erik Kline55b06f82016-07-04 09:57:18 +090040#include "InterfaceController.h"
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090041#include "NetdNativeService.h"
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090042#include "NetdPermissions.h"
Luke Huang0e5e69d2019-03-06 15:42:38 +080043#include "OemNetdListener.h"
Luke Huangb670d162018-08-23 20:01:13 +080044#include "Permission.h"
Erik Kline85890042018-05-25 19:19:11 +090045#include "Process.h"
Robin Leeb8087362016-03-30 18:43:08 +010046#include "RouteController.h"
Lorenzo Colitti563d98b2016-04-24 13:13:14 +090047#include "SockDiag.h"
Robin Leeb8087362016-03-30 18:43:08 +010048#include "UidRanges.h"
Xiao Ma33d562a2018-12-16 16:27:38 +090049#include "android/net/BnNetd.h"
Bernie Innocenti189eb502018-10-01 23:10:18 +090050#include "netid_client.h" // NETID_UNSET
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090051
52using android::base::StringPrintf;
Chenbo Fengf5663d82018-11-08 16:10:48 -080053using android::base::WriteStringToFile;
Luke Huangcaebcbb2018-09-27 20:37:14 +080054using android::net::TetherStatsParcel;
Luke Huang94658ac2018-10-18 19:35:12 +090055using android::net::UidRangeParcel;
Luke Huangb257d612019-03-14 21:19:13 +080056using android::netdutils::DumpWriter;
57using android::netdutils::ScopedIndent;
Luke Huange203a152018-11-23 11:47:28 +080058using android::os::ParcelFileDescriptor;
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090059
60namespace android {
61namespace net {
62
63namespace {
Erik Klineb31fd692018-06-06 20:50:11 +090064const char OPT_SHORT[] = "--short";
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090065
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090066binder::Status checkAnyPermission(const std::vector<const char*>& permissions) {
Luke Huanga38b65c2018-09-26 16:31:03 +080067 pid_t pid = IPCThreadState::self()->getCallingPid();
68 uid_t uid = IPCThreadState::self()->getCallingUid();
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090069
Luke Huanga38b65c2018-09-26 16:31:03 +080070 // If the caller is the system UID, don't check permissions.
71 // Otherwise, if the system server's binder thread pool is full, and all the threads are
72 // blocked on a thread that's waiting for us to complete, we deadlock. http://b/69389492
73 //
74 // From a security perspective, there is currently no difference, because:
75 // 1. The only permissions we check in netd's binder interface are CONNECTIVITY_INTERNAL
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090076 // and NETWORK_STACK, which the system server always has (or MAINLINE_NETWORK_STACK, which
77 // is equivalent to having both CONNECTIVITY_INTERNAL and NETWORK_STACK).
Luke Huanga38b65c2018-09-26 16:31:03 +080078 // 2. AID_SYSTEM always has all permissions. See ActivityManager#checkComponentPermission.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090079 if (uid == AID_SYSTEM) {
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090080 return binder::Status::ok();
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090081 }
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090082
83 for (const char* permission : permissions) {
84 if (checkPermission(String16(permission), pid, uid)) {
85 return binder::Status::ok();
86 }
87 }
88
89 auto err = StringPrintf("UID %d / PID %d does not have any of the following permissions: %s",
90 uid, pid, android::base::Join(permissions, ',').c_str());
91 return binder::Status::fromExceptionCode(binder::Status::EX_SECURITY, err.c_str());
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090092}
93
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090094#define ENFORCE_ANY_PERMISSION(...) \
95 do { \
96 binder::Status status = checkAnyPermission({__VA_ARGS__}); \
97 if (!status.isOk()) { \
98 return status; \
99 } \
100 } while (0)
Robin Lee2cf56172016-09-13 18:55:42 +0900101
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900102#define NETD_LOCKING_RPC(lock, ... /* permissions */) \
103 ENFORCE_ANY_PERMISSION(__VA_ARGS__); \
Bernie Innocentiabf8a342018-08-10 15:17:16 +0900104 std::lock_guard _lock(lock);
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900105
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900106#define NETD_BIG_LOCK_RPC(... /* permissions */) NETD_LOCKING_RPC(gBigNetdLock, __VA_ARGS__)
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900107
Luke Huangf7782042018-08-08 13:13:04 +0800108#define RETURN_BINDER_STATUS_IF_NOT_OK(logEntry, res) \
109 do { \
110 if (!isOk((res))) { \
111 logErrorStatus((logEntry), (res)); \
112 return asBinderStatus((res)); \
113 } \
114 } while (0)
115
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900116#define ENFORCE_INTERNAL_PERMISSIONS() \
117 ENFORCE_ANY_PERMISSION(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK)
118
119#define ENFORCE_NETWORK_STACK_PERMISSIONS() \
120 ENFORCE_ANY_PERMISSION(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK)
121
Luke Huangf7782042018-08-08 13:13:04 +0800122void logErrorStatus(netdutils::LogEntry& logEntry, const netdutils::Status& status) {
123 gLog.log(logEntry.returns(status.code()).withAutomaticDuration());
124}
125
Bernie Innocenti97f388f2018-10-16 19:17:08 +0900126binder::Status asBinderStatus(const netdutils::Status& status) {
127 if (isOk(status)) {
128 return binder::Status::ok();
129 }
130 return binder::Status::fromServiceSpecificError(status.code(), status.msg().c_str());
131}
132
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900133inline binder::Status statusFromErrcode(int ret) {
134 if (ret) {
135 return binder::Status::fromServiceSpecificError(-ret, strerror(-ret));
136 }
137 return binder::Status::ok();
138}
139
Erik Klineb31fd692018-06-06 20:50:11 +0900140bool contains(const Vector<String16>& words, const String16& word) {
141 for (const auto& w : words) {
142 if (w == word) return true;
143 }
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900144
Erik Klineb31fd692018-06-06 20:50:11 +0900145 return false;
146}
147
148} // namespace
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900149
Luke Huange3f11812019-05-02 18:10:15 +0800150NetdNativeService::NetdNativeService() {
151 // register log callback to BnNetd::logFunc
152 BnNetd::logFunc = std::bind(binderCallLogFn, std::placeholders::_1,
153 [](const std::string& msg) { gLog.info("%s", msg.c_str()); });
154}
155
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900156status_t NetdNativeService::start() {
157 IPCThreadState::self()->disableBackgroundScheduling(true);
Erik Klineb31fd692018-06-06 20:50:11 +0900158 const status_t ret = BinderService<NetdNativeService>::publish();
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900159 if (ret != android::OK) {
160 return ret;
161 }
162 sp<ProcessState> ps(ProcessState::self());
163 ps->startThreadPool();
164 ps->giveThreadPoolName();
Xiao Ma33d562a2018-12-16 16:27:38 +0900165
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900166 return android::OK;
167}
168
Hugo Benichi7b314e12018-01-15 21:54:00 +0900169status_t NetdNativeService::dump(int fd, const Vector<String16> &args) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900170 const binder::Status dump_permission = checkAnyPermission({PERM_DUMP});
Erik Kline2d3a1632016-03-15 16:33:48 +0900171 if (!dump_permission.isOk()) {
172 const String8 msg(dump_permission.toString8());
173 write(fd, msg.string(), msg.size());
174 return PERMISSION_DENIED;
175 }
176
177 // This method does not grab any locks. If individual classes need locking
178 // their dump() methods MUST handle locking appropriately.
Hugo Benichi7b314e12018-01-15 21:54:00 +0900179
Erik Kline2d3a1632016-03-15 16:33:48 +0900180 DumpWriter dw(fd);
Hugo Benichi7b314e12018-01-15 21:54:00 +0900181
182 if (!args.isEmpty() && args[0] == TcpSocketMonitor::DUMP_KEYWORD) {
183 dw.blankline();
184 gCtls->tcpSocketMonitor.dump(dw);
185 dw.blankline();
186 return NO_ERROR;
187 }
188
Chenbo Fengef297172018-03-26 10:53:33 -0700189 if (!args.isEmpty() && args[0] == TrafficController::DUMP_KEYWORD) {
190 dw.blankline();
191 gCtls->trafficCtrl.dump(dw, true);
192 dw.blankline();
193 return NO_ERROR;
194 }
195
Erik Kline85890042018-05-25 19:19:11 +0900196 process::dump(dw);
Erik Kline2d3a1632016-03-15 16:33:48 +0900197 dw.blankline();
198 gCtls->netCtrl.dump(dw);
199 dw.blankline();
200
Chenbo Fengef297172018-03-26 10:53:33 -0700201 gCtls->trafficCtrl.dump(dw, false);
202 dw.blankline();
203
Benedict Wongaf855432018-05-10 17:07:37 -0700204 gCtls->xfrmCtrl.dump(dw);
205 dw.blankline();
206
Maciej Żenczykowski55262712019-03-29 23:44:56 -0700207 gCtls->clatdCtrl.dump(dw);
208 dw.blankline();
209
Erik Klineb31fd692018-06-06 20:50:11 +0900210 {
211 ScopedIndent indentLog(dw);
212 if (contains(args, String16(OPT_SHORT))) {
213 dw.println("Log: <omitted>");
214 } else {
215 dw.println("Log:");
216 ScopedIndent indentLogEntries(dw);
217 gLog.forEachEntry([&dw](const std::string& entry) mutable { dw.println(entry); });
218 }
219 dw.blankline();
220 }
221
Luke Huang528af602018-08-29 19:06:05 +0800222 {
223 ScopedIndent indentLog(dw);
224 if (contains(args, String16(OPT_SHORT))) {
225 dw.println("UnsolicitedLog: <omitted>");
226 } else {
227 dw.println("UnsolicitedLog:");
228 ScopedIndent indentLogEntries(dw);
229 gUnsolicitedLog.forEachEntry(
230 [&dw](const std::string& entry) mutable { dw.println(entry); });
231 }
232 dw.blankline();
233 }
234
Erik Kline2d3a1632016-03-15 16:33:48 +0900235 return NO_ERROR;
236}
237
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900238binder::Status NetdNativeService::isAlive(bool *alive) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900239 NETD_BIG_LOCK_RPC(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900240
241 *alive = true;
Erik Klineb31fd692018-06-06 20:50:11 +0900242
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900243 return binder::Status::ok();
244}
245
Erik Klinef52d4522018-03-14 15:01:46 +0900246binder::Status NetdNativeService::firewallReplaceUidChain(const std::string& chainName,
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900247 bool isWhitelist, const std::vector<int32_t>& uids, bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900248 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_CONNECTIVITY_INTERNAL,
249 PERM_MAINLINE_NETWORK_STACK);
Erik Klinef52d4522018-03-14 15:01:46 +0900250 int err = gCtls->firewallCtrl.replaceUidChain(chainName, isWhitelist, uids);
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900251 *ret = (err == 0);
252 return binder::Status::ok();
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900253}
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900254
255binder::Status NetdNativeService::bandwidthEnableDataSaver(bool enable, bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900256 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_CONNECTIVITY_INTERNAL,
257 PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900258 int err = gCtls->bandwidthCtrl.enableDataSaver(enable);
259 *ret = (err == 0);
260 return binder::Status::ok();
261}
262
Luke Huang531f5d32018-08-03 15:19:05 +0800263binder::Status NetdNativeService::bandwidthSetInterfaceQuota(const std::string& ifName,
264 int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900265 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800266 int res = gCtls->bandwidthCtrl.setInterfaceQuota(ifName, bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800267 return statusFromErrcode(res);
268}
269
270binder::Status NetdNativeService::bandwidthRemoveInterfaceQuota(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900271 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800272 int res = gCtls->bandwidthCtrl.removeInterfaceQuota(ifName);
Luke Huang531f5d32018-08-03 15:19:05 +0800273 return statusFromErrcode(res);
274}
275
276binder::Status NetdNativeService::bandwidthSetInterfaceAlert(const std::string& ifName,
277 int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900278 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800279 int res = gCtls->bandwidthCtrl.setInterfaceAlert(ifName, bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800280 return statusFromErrcode(res);
281}
282
283binder::Status NetdNativeService::bandwidthRemoveInterfaceAlert(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900284 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800285 int res = gCtls->bandwidthCtrl.removeInterfaceAlert(ifName);
Luke Huang531f5d32018-08-03 15:19:05 +0800286 return statusFromErrcode(res);
287}
288
289binder::Status NetdNativeService::bandwidthSetGlobalAlert(int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900290 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800291 int res = gCtls->bandwidthCtrl.setGlobalAlert(bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800292 return statusFromErrcode(res);
293}
294
295binder::Status NetdNativeService::bandwidthAddNaughtyApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900296 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800297 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
298 int res = gCtls->bandwidthCtrl.addNaughtyApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800299 return statusFromErrcode(res);
300}
301
302binder::Status NetdNativeService::bandwidthRemoveNaughtyApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900303 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800304 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
305 int res = gCtls->bandwidthCtrl.removeNaughtyApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800306 return statusFromErrcode(res);
307}
308
309binder::Status NetdNativeService::bandwidthAddNiceApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900310 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800311 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
312 int res = gCtls->bandwidthCtrl.addNiceApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800313 return statusFromErrcode(res);
314}
315
316binder::Status NetdNativeService::bandwidthRemoveNiceApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900317 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800318 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
319 int res = gCtls->bandwidthCtrl.removeNiceApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800320 return statusFromErrcode(res);
321}
322
Luke Huangb670d162018-08-23 20:01:13 +0800323binder::Status NetdNativeService::networkCreatePhysical(int32_t netId, int32_t permission) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900324 ENFORCE_INTERNAL_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +0800325 int ret = gCtls->netCtrl.createPhysicalNetwork(netId, convertPermission(permission));
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900326 return statusFromErrcode(ret);
327}
328
cken67cd14c2018-12-05 17:26:59 +0900329binder::Status NetdNativeService::networkCreateVpn(int32_t netId, bool secure) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900330 ENFORCE_NETWORK_STACK_PERMISSIONS();
cken67cd14c2018-12-05 17:26:59 +0900331 int ret = gCtls->netCtrl.createVirtualNetwork(netId, secure);
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900332 return statusFromErrcode(ret);
333}
334
335binder::Status NetdNativeService::networkDestroy(int32_t netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900336 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangd33a8f42019-03-14 16:10:04 +0800337 // NetworkController::destroyNetwork is thread-safe.
Mike Yu4fe1b9c2019-01-29 17:50:19 +0800338 const int ret = gCtls->netCtrl.destroyNetwork(netId);
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900339 return statusFromErrcode(ret);
340}
341
342binder::Status NetdNativeService::networkAddInterface(int32_t netId, const std::string& iface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900343 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900344 int ret = gCtls->netCtrl.addInterfaceToNetwork(netId, iface.c_str());
345 return statusFromErrcode(ret);
346}
347
348binder::Status NetdNativeService::networkRemoveInterface(int32_t netId, const std::string& iface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900349 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900350 int ret = gCtls->netCtrl.removeInterfaceFromNetwork(netId, iface.c_str());
351 return statusFromErrcode(ret);
352}
353
Luke Huang94658ac2018-10-18 19:35:12 +0900354binder::Status NetdNativeService::networkAddUidRanges(
355 int32_t netId, const std::vector<UidRangeParcel>& uidRangeArray) {
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900356 // NetworkController::addUsersToNetwork is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900357 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900358 int ret = gCtls->netCtrl.addUsersToNetwork(netId, UidRanges(uidRangeArray));
359 return statusFromErrcode(ret);
360}
361
Luke Huang94658ac2018-10-18 19:35:12 +0900362binder::Status NetdNativeService::networkRemoveUidRanges(
363 int32_t netId, const std::vector<UidRangeParcel>& uidRangeArray) {
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900364 // NetworkController::removeUsersFromNetwork is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900365 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900366 int ret = gCtls->netCtrl.removeUsersFromNetwork(netId, UidRanges(uidRangeArray));
367 return statusFromErrcode(ret);
368}
369
Luke Huang94658ac2018-10-18 19:35:12 +0900370binder::Status NetdNativeService::networkRejectNonSecureVpn(
371 bool add, const std::vector<UidRangeParcel>& uidRangeArray) {
Robin Leeb8087362016-03-30 18:43:08 +0100372 // TODO: elsewhere RouteController is only used from the tethering and network controllers, so
373 // it should be possible to use the same lock as NetworkController. However, every call through
374 // the CommandListener "network" command will need to hold this lock too, not just the ones that
375 // read/modify network internal state (that is sufficient for ::dump() because it doesn't
376 // look at routes, but it's not enough here).
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900377 NETD_BIG_LOCK_RPC(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900378 UidRanges uidRanges(uidRangeArray);
Robin Leeb8087362016-03-30 18:43:08 +0100379
380 int err;
381 if (add) {
382 err = RouteController::addUsersToRejectNonSecureNetworkRule(uidRanges);
383 } else {
384 err = RouteController::removeUsersFromRejectNonSecureNetworkRule(uidRanges);
385 }
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900386 return statusFromErrcode(err);
Robin Leeb8087362016-03-30 18:43:08 +0100387}
388
Luke Huang94658ac2018-10-18 19:35:12 +0900389binder::Status NetdNativeService::socketDestroy(const std::vector<UidRangeParcel>& uids,
390 const std::vector<int32_t>& skipUids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900391 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900392
393 SockDiag sd;
394 if (!sd.open()) {
395 return binder::Status::fromServiceSpecificError(EIO,
396 String8("Could not open SOCK_DIAG socket"));
397 }
398
399 UidRanges uidRanges(uids);
Lorenzo Colittie5c3c992016-07-26 17:53:50 +0900400 int err = sd.destroySockets(uidRanges, std::set<uid_t>(skipUids.begin(), skipUids.end()),
401 true /* excludeLoopback */);
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900402 if (err) {
403 return binder::Status::fromServiceSpecificError(-err,
404 String8::format("destroySockets: %s", strerror(-err)));
405 }
Pierre Imaibeedec32016-04-13 06:44:51 +0900406 return binder::Status::ok();
407}
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900408
Erik Klinef48e4dd2016-07-18 04:02:07 +0900409binder::Status NetdNativeService::tetherApplyDnsInterfaces(bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900410 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Erik Klinef48e4dd2016-07-18 04:02:07 +0900411 *ret = gCtls->tetherCtrl.applyDnsInterfaces();
412 return binder::Status::ok();
413}
414
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900415namespace {
416
Luke Huangcaebcbb2018-09-27 20:37:14 +0800417void tetherAddStatsByInterface(TetherController::TetherStats* tetherStatsParcel,
418 const TetherController::TetherStats& tetherStats) {
419 if (tetherStatsParcel->extIface == tetherStats.extIface) {
420 tetherStatsParcel->rxBytes += tetherStats.rxBytes;
421 tetherStatsParcel->rxPackets += tetherStats.rxPackets;
422 tetherStatsParcel->txBytes += tetherStats.txBytes;
423 tetherStatsParcel->txPackets += tetherStats.txPackets;
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900424 }
Luke Huangcaebcbb2018-09-27 20:37:14 +0800425}
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900426
Luke Huangcaebcbb2018-09-27 20:37:14 +0800427TetherStatsParcel toTetherStatsParcel(const TetherController::TetherStats& stats) {
428 TetherStatsParcel result;
429 result.iface = stats.extIface;
430 result.rxBytes = stats.rxBytes;
431 result.rxPackets = stats.rxPackets;
432 result.txBytes = stats.txBytes;
433 result.txPackets = stats.txPackets;
434 return result;
435}
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900436
Luke Huangcaebcbb2018-09-27 20:37:14 +0800437void setTetherStatsParcelVecByInterface(std::vector<TetherStatsParcel>* tetherStatsVec,
438 const TetherController::TetherStatsList& statsList) {
439 std::map<std::string, TetherController::TetherStats> statsMap;
440 for (const auto& stats : statsList) {
441 auto iter = statsMap.find(stats.extIface);
442 if (iter != statsMap.end()) {
443 tetherAddStatsByInterface(&(iter->second), stats);
444 } else {
445 statsMap.insert(
446 std::pair<std::string, TetherController::TetherStats>(stats.extIface, stats));
447 }
448 }
449 for (auto iter = statsMap.begin(); iter != statsMap.end(); iter++) {
450 tetherStatsVec->push_back(toTetherStatsParcel(iter->second));
451 }
452}
453
454std::vector<std::string> tetherStatsParcelVecToStringVec(std::vector<TetherStatsParcel>* tVec) {
455 std::vector<std::string> result;
456 for (const auto& t : *tVec) {
457 result.push_back(StringPrintf("%s:%" PRId64 ",%" PRId64 ",%" PRId64 ",%" PRId64,
458 t.iface.c_str(), t.rxBytes, t.rxPackets, t.txBytes,
459 t.txPackets));
460 }
461 return result;
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900462}
463
464} // namespace
465
Luke Huangcaebcbb2018-09-27 20:37:14 +0800466binder::Status NetdNativeService::tetherGetStats(
467 std::vector<TetherStatsParcel>* tetherStatsParcelVec) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900468 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti5192bf72017-09-04 13:30:59 +0900469 const auto& statsList = gCtls->tetherCtrl.getTetherStats();
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900470 if (!isOk(statsList)) {
Nathan Harold28ccfef2018-03-16 19:02:47 -0700471 return asBinderStatus(statsList);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900472 }
Luke Huangcaebcbb2018-09-27 20:37:14 +0800473 setTetherStatsParcelVecByInterface(tetherStatsParcelVec, statsList.value());
474 auto statsResults = tetherStatsParcelVecToStringVec(tetherStatsParcelVec);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900475 return binder::Status::ok();
476}
477
Erik Kline53c20882016-08-02 15:22:53 +0900478binder::Status NetdNativeService::interfaceAddAddress(const std::string &ifName,
479 const std::string &addrString, int prefixLength) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900480 ENFORCE_INTERNAL_PERMISSIONS();
Erik Kline53c20882016-08-02 15:22:53 +0900481 const int err = InterfaceController::addAddress(
482 ifName.c_str(), addrString.c_str(), prefixLength);
483 if (err != 0) {
484 return binder::Status::fromServiceSpecificError(-err,
485 String8::format("InterfaceController error: %s", strerror(-err)));
486 }
487 return binder::Status::ok();
488}
489
490binder::Status NetdNativeService::interfaceDelAddress(const std::string &ifName,
491 const std::string &addrString, int prefixLength) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900492 ENFORCE_INTERNAL_PERMISSIONS();
Erik Kline53c20882016-08-02 15:22:53 +0900493 const int err = InterfaceController::delAddress(
494 ifName.c_str(), addrString.c_str(), prefixLength);
495 if (err != 0) {
496 return binder::Status::fromServiceSpecificError(-err,
497 String8::format("InterfaceController error: %s", strerror(-err)));
498 }
499 return binder::Status::ok();
500}
501
Erik Kline38e51f12018-09-06 20:14:44 +0900502namespace {
Erik Kline55b06f82016-07-04 09:57:18 +0900503
Erik Kline38e51f12018-09-06 20:14:44 +0900504std::tuple<binder::Status, const char*, const char*> getPathComponents(int32_t ipversion,
505 int32_t category) {
506 const char* ipversionStr = nullptr;
507 switch (ipversion) {
Erik Kline55b06f82016-07-04 09:57:18 +0900508 case INetd::IPV4:
Erik Kline38e51f12018-09-06 20:14:44 +0900509 ipversionStr = "ipv4";
Erik Kline55b06f82016-07-04 09:57:18 +0900510 break;
511 case INetd::IPV6:
Erik Kline38e51f12018-09-06 20:14:44 +0900512 ipversionStr = "ipv6";
Erik Kline55b06f82016-07-04 09:57:18 +0900513 break;
514 default:
Erik Kline38e51f12018-09-06 20:14:44 +0900515 return {binder::Status::fromServiceSpecificError(EAFNOSUPPORT, "Bad IP version"),
516 nullptr, nullptr};
Erik Kline55b06f82016-07-04 09:57:18 +0900517 }
518
Erik Kline38e51f12018-09-06 20:14:44 +0900519 const char* whichStr = nullptr;
520 switch (category) {
Erik Kline55b06f82016-07-04 09:57:18 +0900521 case INetd::CONF:
522 whichStr = "conf";
523 break;
524 case INetd::NEIGH:
525 whichStr = "neigh";
526 break;
527 default:
Erik Kline38e51f12018-09-06 20:14:44 +0900528 return {binder::Status::fromServiceSpecificError(EINVAL, "Bad category"), nullptr,
529 nullptr};
Erik Kline55b06f82016-07-04 09:57:18 +0900530 }
531
Erik Kline38e51f12018-09-06 20:14:44 +0900532 return {binder::Status::ok(), ipversionStr, whichStr};
533}
534
535} // namespace
536
537binder::Status NetdNativeService::getProcSysNet(int32_t ipversion, int32_t which,
538 const std::string& ifname,
539 const std::string& parameter, std::string* value) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900540 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline38e51f12018-09-06 20:14:44 +0900541 const auto pathParts = getPathComponents(ipversion, which);
542 const auto& pathStatus = std::get<0>(pathParts);
543 if (!pathStatus.isOk()) {
Erik Kline38e51f12018-09-06 20:14:44 +0900544 return pathStatus;
Erik Kline55b06f82016-07-04 09:57:18 +0900545 }
Erik Kline38e51f12018-09-06 20:14:44 +0900546
547 const int err = InterfaceController::getParameter(std::get<1>(pathParts),
548 std::get<2>(pathParts), ifname.c_str(),
549 parameter.c_str(), value);
Erik Kline38e51f12018-09-06 20:14:44 +0900550 return statusFromErrcode(err);
551}
552
553binder::Status NetdNativeService::setProcSysNet(int32_t ipversion, int32_t which,
554 const std::string& ifname,
555 const std::string& parameter,
556 const std::string& value) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900557 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline38e51f12018-09-06 20:14:44 +0900558 const auto pathParts = getPathComponents(ipversion, which);
559 const auto& pathStatus = std::get<0>(pathParts);
560 if (!pathStatus.isOk()) {
Erik Kline38e51f12018-09-06 20:14:44 +0900561 return pathStatus;
562 }
563
564 const int err = InterfaceController::setParameter(std::get<1>(pathParts),
565 std::get<2>(pathParts), ifname.c_str(),
566 parameter.c_str(), value.c_str());
Erik Kline38e51f12018-09-06 20:14:44 +0900567 return statusFromErrcode(err);
Erik Kline55b06f82016-07-04 09:57:18 +0900568}
569
Luke Huange203a152018-11-23 11:47:28 +0800570binder::Status NetdNativeService::ipSecSetEncapSocketOwner(const ParcelFileDescriptor& socket,
571 int newUid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900572 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900573 gLog.log("ipSecSetEncapSocketOwner()");
Benedict Wongb2daefb2017-12-06 22:05:46 -0800574
575 uid_t callerUid = IPCThreadState::self()->getCallingUid();
Luke Huange203a152018-11-23 11:47:28 +0800576 return asBinderStatus(
577 gCtls->xfrmCtrl.ipSecSetEncapSocketOwner(socket.get(), newUid, callerUid));
Benedict Wongb2daefb2017-12-06 22:05:46 -0800578}
579
Nathan Harold1a371532017-01-30 12:30:48 -0800580binder::Status NetdNativeService::ipSecAllocateSpi(
581 int32_t transformId,
Nathan Haroldda54f122018-01-09 16:42:57 -0800582 const std::string& sourceAddress,
583 const std::string& destinationAddress,
Nathan Harold1a371532017-01-30 12:30:48 -0800584 int32_t inSpi,
585 int32_t* outSpi) {
586 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900587 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900588 gLog.log("ipSecAllocateSpi()");
ludi6e8eccd2017-08-14 14:40:37 -0700589 return asBinderStatus(gCtls->xfrmCtrl.ipSecAllocateSpi(
Nathan Harold1a371532017-01-30 12:30:48 -0800590 transformId,
Nathan Haroldda54f122018-01-09 16:42:57 -0800591 sourceAddress,
592 destinationAddress,
Nathan Harold1a371532017-01-30 12:30:48 -0800593 inSpi,
594 outSpi));
595}
596
597binder::Status NetdNativeService::ipSecAddSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700598 int32_t transformId, int32_t mode, const std::string& sourceAddress,
599 const std::string& destinationAddress, int32_t underlyingNetId, int32_t spi,
600 int32_t markValue, int32_t markMask, const std::string& authAlgo,
601 const std::vector<uint8_t>& authKey, int32_t authTruncBits, const std::string& cryptAlgo,
602 const std::vector<uint8_t>& cryptKey, int32_t cryptTruncBits, const std::string& aeadAlgo,
603 const std::vector<uint8_t>& aeadKey, int32_t aeadIcvBits, int32_t encapType,
604 int32_t encapLocalPort, int32_t encapRemotePort, int32_t interfaceId) {
Nathan Harold1a371532017-01-30 12:30:48 -0800605 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900606 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900607 gLog.log("ipSecAddSecurityAssociation()");
ludi6e8eccd2017-08-14 14:40:37 -0700608 return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityAssociation(
Benedict Wongad600cb2018-05-14 17:22:35 -0700609 transformId, mode, sourceAddress, destinationAddress, underlyingNetId, spi, markValue,
610 markMask, authAlgo, authKey, authTruncBits, cryptAlgo, cryptKey, cryptTruncBits,
Benedict Wonga450e722018-05-07 10:29:02 -0700611 aeadAlgo, aeadKey, aeadIcvBits, encapType, encapLocalPort, encapRemotePort,
612 interfaceId));
Nathan Harold1a371532017-01-30 12:30:48 -0800613}
614
615binder::Status NetdNativeService::ipSecDeleteSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700616 int32_t transformId, const std::string& sourceAddress,
617 const std::string& destinationAddress, int32_t spi, int32_t markValue, int32_t markMask,
618 int32_t interfaceId) {
Nathan Harold1a371532017-01-30 12:30:48 -0800619 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900620 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900621 gLog.log("ipSecDeleteSecurityAssociation()");
ludi6e8eccd2017-08-14 14:40:37 -0700622 return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700623 transformId, sourceAddress, destinationAddress, spi, markValue, markMask, interfaceId));
Nathan Harold1a371532017-01-30 12:30:48 -0800624}
625
626binder::Status NetdNativeService::ipSecApplyTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800627 const ParcelFileDescriptor& socket, int32_t transformId, int32_t direction,
628 const std::string& sourceAddress, const std::string& destinationAddress, int32_t spi) {
Nathan Harold1a371532017-01-30 12:30:48 -0800629 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900630 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900631 gLog.log("ipSecApplyTransportModeTransform()");
ludi6e8eccd2017-08-14 14:40:37 -0700632 return asBinderStatus(gCtls->xfrmCtrl.ipSecApplyTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800633 socket.get(), transformId, direction, sourceAddress, destinationAddress, spi));
Nathan Harold1a371532017-01-30 12:30:48 -0800634}
635
636binder::Status NetdNativeService::ipSecRemoveTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800637 const ParcelFileDescriptor& socket) {
Nathan Harold1a371532017-01-30 12:30:48 -0800638 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900639 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900640 gLog.log("ipSecRemoveTransportModeTransform()");
Luke Huange203a152018-11-23 11:47:28 +0800641 return asBinderStatus(gCtls->xfrmCtrl.ipSecRemoveTransportModeTransform(socket.get()));
Nathan Harold1a371532017-01-30 12:30:48 -0800642}
643
Benedict Wonga04ffa72018-05-09 21:42:42 -0700644binder::Status NetdNativeService::ipSecAddSecurityPolicy(int32_t transformId, int32_t selAddrFamily,
645 int32_t direction,
Benedict Wongad600cb2018-05-14 17:22:35 -0700646 const std::string& tmplSrcAddress,
647 const std::string& tmplDstAddress,
648 int32_t spi, int32_t markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700649 int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800650 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900651 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900652 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800653 return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityPolicy(
Benedict Wonga04ffa72018-05-09 21:42:42 -0700654 transformId, selAddrFamily, direction, tmplSrcAddress, tmplDstAddress, spi, markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700655 markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800656}
657
Benedict Wonga450e722018-05-07 10:29:02 -0700658binder::Status NetdNativeService::ipSecUpdateSecurityPolicy(
659 int32_t transformId, int32_t selAddrFamily, int32_t direction,
660 const std::string& tmplSrcAddress, const std::string& tmplDstAddress, int32_t spi,
661 int32_t markValue, int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800662 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900663 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900664 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800665 return asBinderStatus(gCtls->xfrmCtrl.ipSecUpdateSecurityPolicy(
Benedict Wonga04ffa72018-05-09 21:42:42 -0700666 transformId, selAddrFamily, direction, tmplSrcAddress, tmplDstAddress, spi, markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700667 markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800668}
669
Benedict Wonga04ffa72018-05-09 21:42:42 -0700670binder::Status NetdNativeService::ipSecDeleteSecurityPolicy(int32_t transformId,
671 int32_t selAddrFamily,
672 int32_t direction, int32_t markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700673 int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800674 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900675 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900676 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800677 return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityPolicy(
Benedict Wonga450e722018-05-07 10:29:02 -0700678 transformId, selAddrFamily, direction, markValue, markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800679}
680
Benedict Wong319f17e2018-05-15 17:06:44 -0700681binder::Status NetdNativeService::ipSecAddTunnelInterface(const std::string& deviceName,
682 const std::string& localAddress,
683 const std::string& remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700684 int32_t iKey, int32_t oKey,
685 int32_t interfaceId) {
manojboopathi8707f232018-01-02 14:45:47 -0800686 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900687 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700688 netdutils::Status result = gCtls->xfrmCtrl.ipSecAddTunnelInterface(
Benedict Wonga450e722018-05-07 10:29:02 -0700689 deviceName, localAddress, remoteAddress, iKey, oKey, interfaceId, false);
Benedict Wong319f17e2018-05-15 17:06:44 -0700690 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800691}
692
Benedict Wong319f17e2018-05-15 17:06:44 -0700693binder::Status NetdNativeService::ipSecUpdateTunnelInterface(const std::string& deviceName,
694 const std::string& localAddress,
695 const std::string& remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700696 int32_t iKey, int32_t oKey,
697 int32_t interfaceId) {
manojboopathi8707f232018-01-02 14:45:47 -0800698 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900699 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700700 netdutils::Status result = gCtls->xfrmCtrl.ipSecAddTunnelInterface(
Benedict Wonga450e722018-05-07 10:29:02 -0700701 deviceName, localAddress, remoteAddress, iKey, oKey, interfaceId, true);
Benedict Wong319f17e2018-05-15 17:06:44 -0700702 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800703}
704
Benedict Wong319f17e2018-05-15 17:06:44 -0700705binder::Status NetdNativeService::ipSecRemoveTunnelInterface(const std::string& deviceName) {
manojboopathi8707f232018-01-02 14:45:47 -0800706 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900707 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700708 netdutils::Status result = gCtls->xfrmCtrl.ipSecRemoveTunnelInterface(deviceName);
Benedict Wong319f17e2018-05-15 17:06:44 -0700709 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800710}
711
Joel Scherpelzde937962017-06-01 13:20:21 +0900712binder::Status NetdNativeService::setIPv6AddrGenMode(const std::string& ifName,
713 int32_t mode) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900714 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700715 return asBinderStatus(InterfaceController::setIPv6AddrGenMode(ifName, mode));
Joel Scherpelzde937962017-06-01 13:20:21 +0900716}
717
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900718binder::Status NetdNativeService::wakeupAddInterface(const std::string& ifName,
719 const std::string& prefix, int32_t mark,
720 int32_t mask) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900721 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700722 return asBinderStatus(gCtls->wakeupCtrl.addInterface(ifName, prefix, mark, mask));
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900723}
724
725binder::Status NetdNativeService::wakeupDelInterface(const std::string& ifName,
726 const std::string& prefix, int32_t mark,
727 int32_t mask) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900728 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700729 return asBinderStatus(gCtls->wakeupCtrl.delInterface(ifName, prefix, mark, mask));
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900730}
731
Chenbo Feng873ae142019-04-10 12:26:06 -0700732binder::Status NetdNativeService::trafficSwapActiveStatsMap() {
733 ENFORCE_NETWORK_STACK_PERMISSIONS();
734 return asBinderStatus(gCtls->trafficCtrl.swapActiveStatsMap());
735}
736
Luke Huang0051a622018-07-23 20:30:16 +0800737binder::Status NetdNativeService::idletimerAddInterface(const std::string& ifName, int32_t timeout,
738 const std::string& classLabel) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900739 NETD_LOCKING_RPC(gCtls->idletimerCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang0051a622018-07-23 20:30:16 +0800740 int res =
741 gCtls->idletimerCtrl.addInterfaceIdletimer(ifName.c_str(), timeout, classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +0800742 return statusFromErrcode(res);
743}
744
745binder::Status NetdNativeService::idletimerRemoveInterface(const std::string& ifName,
746 int32_t timeout,
747 const std::string& classLabel) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900748 NETD_LOCKING_RPC(gCtls->idletimerCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang0051a622018-07-23 20:30:16 +0800749 int res = gCtls->idletimerCtrl.removeInterfaceIdletimer(ifName.c_str(), timeout,
750 classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +0800751 return statusFromErrcode(res);
752}
Luke Huanga67dd562018-07-17 19:58:25 +0800753
754binder::Status NetdNativeService::strictUidCleartextPenalty(int32_t uid, int32_t policyPenalty) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900755 NETD_LOCKING_RPC(gCtls->strictCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huanga67dd562018-07-17 19:58:25 +0800756 StrictPenalty penalty;
757 switch (policyPenalty) {
758 case INetd::PENALTY_POLICY_REJECT:
759 penalty = REJECT;
760 break;
761 case INetd::PENALTY_POLICY_LOG:
762 penalty = LOG;
763 break;
764 case INetd::PENALTY_POLICY_ACCEPT:
765 penalty = ACCEPT;
766 break;
767 default:
768 return statusFromErrcode(-EINVAL);
769 break;
770 }
771 int res = gCtls->strictCtrl.setUidCleartextPenalty((uid_t) uid, penalty);
Luke Huanga67dd562018-07-17 19:58:25 +0800772 return statusFromErrcode(res);
773}
Luke Huange64fa382018-07-24 16:38:22 +0800774
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +0900775binder::Status NetdNativeService::clatdStart(const std::string& ifName,
776 const std::string& nat64Prefix, std::string* v6Addr) {
Maciej Żenczykowski56280272019-03-30 03:32:51 -0700777 ENFORCE_ANY_PERMISSION(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +0900778 int res = gCtls->clatdCtrl.startClatd(ifName.c_str(), nat64Prefix, v6Addr);
Luke Huang6d301232018-08-01 14:05:18 +0800779 return statusFromErrcode(res);
780}
781
782binder::Status NetdNativeService::clatdStop(const std::string& ifName) {
Maciej Żenczykowski56280272019-03-30 03:32:51 -0700783 ENFORCE_ANY_PERMISSION(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang6d301232018-08-01 14:05:18 +0800784 int res = gCtls->clatdCtrl.stopClatd(ifName.c_str());
Luke Huang6d301232018-08-01 14:05:18 +0800785 return statusFromErrcode(res);
786}
Luke Huanga67dd562018-07-17 19:58:25 +0800787
Luke Huang457d4702018-08-16 15:39:15 +0800788binder::Status NetdNativeService::ipfwdEnabled(bool* status) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900789 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang728cf4c2019-03-14 19:43:02 +0800790 *status = (gCtls->tetherCtrl.getIpfwdRequesterList().size() > 0) ? true : false;
791 return binder::Status::ok();
792}
793
794binder::Status NetdNativeService::ipfwdGetRequesterList(std::vector<std::string>* requesterList) {
795 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
796 for (const auto& requester : gCtls->tetherCtrl.getIpfwdRequesterList()) {
797 requesterList->push_back(requester);
798 }
Luke Huang457d4702018-08-16 15:39:15 +0800799 return binder::Status::ok();
800}
801
802binder::Status NetdNativeService::ipfwdEnableForwarding(const std::string& requester) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900803 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang457d4702018-08-16 15:39:15 +0800804 int res = (gCtls->tetherCtrl.enableForwarding(requester.c_str())) ? 0 : -EREMOTEIO;
Luke Huang457d4702018-08-16 15:39:15 +0800805 return statusFromErrcode(res);
806}
807
808binder::Status NetdNativeService::ipfwdDisableForwarding(const std::string& requester) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900809 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang457d4702018-08-16 15:39:15 +0800810 int res = (gCtls->tetherCtrl.disableForwarding(requester.c_str())) ? 0 : -EREMOTEIO;
Luke Huang457d4702018-08-16 15:39:15 +0800811 return statusFromErrcode(res);
812}
813
814binder::Status NetdNativeService::ipfwdAddInterfaceForward(const std::string& fromIface,
815 const std::string& toIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900816 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang457d4702018-08-16 15:39:15 +0800817 int res = RouteController::enableTethering(fromIface.c_str(), toIface.c_str());
Luke Huang457d4702018-08-16 15:39:15 +0800818 return statusFromErrcode(res);
819}
820
821binder::Status NetdNativeService::ipfwdRemoveInterfaceForward(const std::string& fromIface,
822 const std::string& toIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900823 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang457d4702018-08-16 15:39:15 +0800824 int res = RouteController::disableTethering(fromIface.c_str(), toIface.c_str());
Luke Huang457d4702018-08-16 15:39:15 +0800825 return statusFromErrcode(res);
826}
827
Luke Huangf7782042018-08-08 13:13:04 +0800828namespace {
Luke Huangf7782042018-08-08 13:13:04 +0800829std::string addCurlyBrackets(const std::string& s) {
830 return "{" + s + "}";
831}
832
833} // namespace
Xiao Ma33d562a2018-12-16 16:27:38 +0900834
Luke Huangf7782042018-08-08 13:13:04 +0800835binder::Status NetdNativeService::interfaceGetList(std::vector<std::string>* interfaceListResult) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900836 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800837 const auto& ifaceList = InterfaceController::getIfaceNames();
Luke Huangf7782042018-08-08 13:13:04 +0800838
839 interfaceListResult->clear();
840 interfaceListResult->reserve(ifaceList.value().size());
841 interfaceListResult->insert(end(*interfaceListResult), begin(ifaceList.value()),
842 end(ifaceList.value()));
843
Luke Huangf7782042018-08-08 13:13:04 +0800844 return binder::Status::ok();
845}
846
847std::string interfaceConfigurationParcelToString(const InterfaceConfigurationParcel& cfg) {
848 std::vector<std::string> result{cfg.ifName, cfg.hwAddr, cfg.ipv4Addr,
849 std::to_string(cfg.prefixLength)};
850 result.insert(end(result), begin(cfg.flags), end(cfg.flags));
851 return addCurlyBrackets(base::Join(result, ", "));
852}
853
854binder::Status NetdNativeService::interfaceGetCfg(
855 const std::string& ifName, InterfaceConfigurationParcel* interfaceGetCfgResult) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900856 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800857 auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__).arg(ifName);
858
859 const auto& cfgRes = InterfaceController::getCfg(ifName);
860 RETURN_BINDER_STATUS_IF_NOT_OK(entry, cfgRes);
861
862 *interfaceGetCfgResult = cfgRes.value();
863 gLog.log(entry.returns(interfaceConfigurationParcelToString(*interfaceGetCfgResult))
864 .withAutomaticDuration());
865 return binder::Status::ok();
866}
867
868binder::Status NetdNativeService::interfaceSetCfg(const InterfaceConfigurationParcel& cfg) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900869 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800870 auto entry = gLog.newEntry()
871 .prettyFunction(__PRETTY_FUNCTION__)
872 .arg(interfaceConfigurationParcelToString(cfg));
873
874 const auto& res = InterfaceController::setCfg(cfg);
875 RETURN_BINDER_STATUS_IF_NOT_OK(entry, res);
876
877 gLog.log(entry.withAutomaticDuration());
878 return binder::Status::ok();
879}
880
881binder::Status NetdNativeService::interfaceSetIPv6PrivacyExtensions(const std::string& ifName,
882 bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900883 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800884 int res = InterfaceController::setIPv6PrivacyExtensions(ifName.c_str(), enable);
Luke Huangf7782042018-08-08 13:13:04 +0800885 return statusFromErrcode(res);
886}
887
888binder::Status NetdNativeService::interfaceClearAddrs(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900889 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800890 int res = InterfaceController::clearAddrs(ifName.c_str());
Luke Huangf7782042018-08-08 13:13:04 +0800891 return statusFromErrcode(res);
892}
893
894binder::Status NetdNativeService::interfaceSetEnableIPv6(const std::string& ifName, bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900895 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800896 int res = InterfaceController::setEnableIPv6(ifName.c_str(), enable);
Luke Huangf7782042018-08-08 13:13:04 +0800897 return statusFromErrcode(res);
898}
899
900binder::Status NetdNativeService::interfaceSetMtu(const std::string& ifName, int32_t mtuValue) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900901 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800902 std::string mtu = std::to_string(mtuValue);
903 int res = InterfaceController::setMtu(ifName.c_str(), mtu.c_str());
Luke Huangf7782042018-08-08 13:13:04 +0800904 return statusFromErrcode(res);
905}
906
Luke Huangb5733d72018-08-21 17:17:19 +0800907binder::Status NetdNativeService::tetherStart(const std::vector<std::string>& dhcpRanges) {
Luke Huang91bd3e12019-08-20 11:33:52 +0800908 return tetherStartWithConfiguration(true, dhcpRanges);
909}
910
911binder::Status NetdNativeService::tetherStartWithConfiguration(
912 bool usingLegacyDnsProxy, const std::vector<std::string>& dhcpRanges) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900913 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800914 if (dhcpRanges.size() % 2 == 1) {
915 return statusFromErrcode(-EINVAL);
916 }
Luke Huang91bd3e12019-08-20 11:33:52 +0800917 int res = gCtls->tetherCtrl.startTethering(usingLegacyDnsProxy, dhcpRanges);
Luke Huangb5733d72018-08-21 17:17:19 +0800918 return statusFromErrcode(res);
919}
920
921binder::Status NetdNativeService::tetherStop() {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900922 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800923 int res = gCtls->tetherCtrl.stopTethering();
Luke Huangb5733d72018-08-21 17:17:19 +0800924 return statusFromErrcode(res);
925}
926
927binder::Status NetdNativeService::tetherIsEnabled(bool* enabled) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900928 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800929 *enabled = gCtls->tetherCtrl.isTetheringStarted();
Luke Huangb5733d72018-08-21 17:17:19 +0800930 return binder::Status::ok();
931}
932
933binder::Status NetdNativeService::tetherInterfaceAdd(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900934 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800935 int res = gCtls->tetherCtrl.tetherInterface(ifName.c_str());
Luke Huangb5733d72018-08-21 17:17:19 +0800936 return statusFromErrcode(res);
937}
938
939binder::Status NetdNativeService::tetherInterfaceRemove(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900940 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800941 int res = gCtls->tetherCtrl.untetherInterface(ifName.c_str());
Luke Huangb5733d72018-08-21 17:17:19 +0800942 return statusFromErrcode(res);
943}
944
945binder::Status NetdNativeService::tetherInterfaceList(std::vector<std::string>* ifList) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900946 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800947 for (const auto& ifname : gCtls->tetherCtrl.getTetheredInterfaceList()) {
948 ifList->push_back(ifname);
949 }
Luke Huangb5733d72018-08-21 17:17:19 +0800950 return binder::Status::ok();
951}
952
953binder::Status NetdNativeService::tetherDnsSet(int32_t netId,
954 const std::vector<std::string>& dnsAddrs) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900955 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800956 int res = gCtls->tetherCtrl.setDnsForwarders(netId, dnsAddrs);
Luke Huangb5733d72018-08-21 17:17:19 +0800957 return statusFromErrcode(res);
958}
959
960binder::Status NetdNativeService::tetherDnsList(std::vector<std::string>* dnsList) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900961 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +0800962 for (const auto& fwdr : gCtls->tetherCtrl.getDnsForwarders()) {
963 dnsList->push_back(fwdr);
964 }
Luke Huangb5733d72018-08-21 17:17:19 +0800965 return binder::Status::ok();
966}
967
Luke Huangb670d162018-08-23 20:01:13 +0800968binder::Status NetdNativeService::networkAddRoute(int32_t netId, const std::string& ifName,
969 const std::string& destination,
970 const std::string& nextHop) {
971 // Public methods of NetworkController are thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900972 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +0800973 bool legacy = false;
974 uid_t uid = 0; // UID is only meaningful for legacy routes.
975 int res = gCtls->netCtrl.addRoute(netId, ifName.c_str(), destination.c_str(),
976 nextHop.empty() ? nullptr : nextHop.c_str(), legacy, uid);
Luke Huangb670d162018-08-23 20:01:13 +0800977 return statusFromErrcode(res);
978}
979
980binder::Status NetdNativeService::networkRemoveRoute(int32_t netId, const std::string& ifName,
981 const std::string& destination,
982 const std::string& nextHop) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900983 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +0800984 bool legacy = false;
985 uid_t uid = 0; // UID is only meaningful for legacy routes.
986 int res = gCtls->netCtrl.removeRoute(netId, ifName.c_str(), destination.c_str(),
987 nextHop.empty() ? nullptr : nextHop.c_str(), legacy, uid);
Luke Huangb670d162018-08-23 20:01:13 +0800988 return statusFromErrcode(res);
989}
990
991binder::Status NetdNativeService::networkAddLegacyRoute(int32_t netId, const std::string& ifName,
992 const std::string& destination,
993 const std::string& nextHop, int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900994 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +0800995 bool legacy = true;
996 int res = gCtls->netCtrl.addRoute(netId, ifName.c_str(), destination.c_str(),
997 nextHop.empty() ? nullptr : nextHop.c_str(), legacy,
998 (uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +0800999 return statusFromErrcode(res);
1000}
1001
1002binder::Status NetdNativeService::networkRemoveLegacyRoute(int32_t netId, const std::string& ifName,
1003 const std::string& destination,
1004 const std::string& nextHop,
1005 int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001006 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001007 bool legacy = true;
1008 int res = gCtls->netCtrl.removeRoute(netId, ifName.c_str(), destination.c_str(),
1009 nextHop.empty() ? nullptr : nextHop.c_str(), legacy,
1010 (uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001011 return statusFromErrcode(res);
1012}
1013
1014binder::Status NetdNativeService::networkGetDefault(int32_t* netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001015 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001016 *netId = gCtls->netCtrl.getDefaultNetwork();
Luke Huangb670d162018-08-23 20:01:13 +08001017 return binder::Status::ok();
1018}
1019
1020binder::Status NetdNativeService::networkSetDefault(int32_t netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001021 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001022 int res = gCtls->netCtrl.setDefaultNetwork(netId);
Luke Huangb670d162018-08-23 20:01:13 +08001023 return statusFromErrcode(res);
1024}
1025
1026binder::Status NetdNativeService::networkClearDefault() {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001027 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001028 unsigned netId = NETID_UNSET;
1029 int res = gCtls->netCtrl.setDefaultNetwork(netId);
Luke Huangb670d162018-08-23 20:01:13 +08001030 return statusFromErrcode(res);
1031}
1032
1033std::vector<uid_t> NetdNativeService::intsToUids(const std::vector<int32_t>& intUids) {
1034 return {begin(intUids), end(intUids)};
1035}
1036
1037Permission NetdNativeService::convertPermission(int32_t permission) {
1038 switch (permission) {
1039 case INetd::PERMISSION_NETWORK:
1040 return Permission::PERMISSION_NETWORK;
1041 case INetd::PERMISSION_SYSTEM:
1042 return Permission::PERMISSION_SYSTEM;
1043 default:
1044 return Permission::PERMISSION_NONE;
1045 }
1046}
1047
1048binder::Status NetdNativeService::networkSetPermissionForNetwork(int32_t netId,
1049 int32_t permission) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001050 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001051 std::vector<unsigned> netIds = {(unsigned) netId};
1052 int res = gCtls->netCtrl.setPermissionForNetworks(convertPermission(permission), netIds);
Luke Huangb670d162018-08-23 20:01:13 +08001053 return statusFromErrcode(res);
1054}
1055
1056binder::Status NetdNativeService::networkSetPermissionForUser(int32_t permission,
1057 const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001058 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001059 gCtls->netCtrl.setPermissionForUsers(convertPermission(permission), intsToUids(uids));
Luke Huangb670d162018-08-23 20:01:13 +08001060 return binder::Status::ok();
1061}
1062
1063binder::Status NetdNativeService::networkClearPermissionForUser(const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001064 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001065 Permission permission = Permission::PERMISSION_NONE;
1066 gCtls->netCtrl.setPermissionForUsers(permission, intsToUids(uids));
Luke Huangb670d162018-08-23 20:01:13 +08001067 return binder::Status::ok();
1068}
1069
1070binder::Status NetdNativeService::NetdNativeService::networkSetProtectAllow(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001071 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001072 std::vector<uid_t> uids = {(uid_t) uid};
1073 gCtls->netCtrl.allowProtect(uids);
Luke Huangb670d162018-08-23 20:01:13 +08001074 return binder::Status::ok();
1075}
1076
1077binder::Status NetdNativeService::networkSetProtectDeny(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001078 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001079 std::vector<uid_t> uids = {(uid_t) uid};
1080 gCtls->netCtrl.denyProtect(uids);
Luke Huangb670d162018-08-23 20:01:13 +08001081 return binder::Status::ok();
1082}
1083
1084binder::Status NetdNativeService::networkCanProtect(int32_t uid, bool* ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001085 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001086 *ret = gCtls->netCtrl.canProtect((uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001087 return binder::Status::ok();
1088}
1089
Chenbo Feng48eaed32018-12-26 17:40:21 -08001090binder::Status NetdNativeService::trafficSetNetPermForUids(int32_t permission,
1091 const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001092 ENFORCE_NETWORK_STACK_PERMISSIONS();
Chenbo Feng48eaed32018-12-26 17:40:21 -08001093 gCtls->trafficCtrl.setPermissionForUids(permission, intsToUids(uids));
Chenbo Feng48eaed32018-12-26 17:40:21 -08001094 return binder::Status::ok();
1095}
1096
Luke Huange64fa382018-07-24 16:38:22 +08001097binder::Status NetdNativeService::firewallSetFirewallType(int32_t firewallType) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001098 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001099 auto type = static_cast<FirewallType>(firewallType);
1100
1101 int res = gCtls->firewallCtrl.setFirewallType(type);
Luke Huange64fa382018-07-24 16:38:22 +08001102 return statusFromErrcode(res);
1103}
1104
1105binder::Status NetdNativeService::firewallSetInterfaceRule(const std::string& ifName,
1106 int32_t firewallRule) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001107 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001108 auto rule = static_cast<FirewallRule>(firewallRule);
1109
1110 int res = gCtls->firewallCtrl.setInterfaceRule(ifName.c_str(), rule);
Luke Huange64fa382018-07-24 16:38:22 +08001111 return statusFromErrcode(res);
1112}
1113
1114binder::Status NetdNativeService::firewallSetUidRule(int32_t childChain, int32_t uid,
1115 int32_t firewallRule) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001116 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001117 auto chain = static_cast<ChildChain>(childChain);
1118 auto rule = static_cast<FirewallRule>(firewallRule);
1119
1120 int res = gCtls->firewallCtrl.setUidRule(chain, uid, rule);
Luke Huange64fa382018-07-24 16:38:22 +08001121 return statusFromErrcode(res);
1122}
1123
1124binder::Status NetdNativeService::firewallEnableChildChain(int32_t childChain, bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001125 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001126 auto chain = static_cast<ChildChain>(childChain);
1127
1128 int res = gCtls->firewallCtrl.enableChildChains(chain, enable);
Luke Huange64fa382018-07-24 16:38:22 +08001129 return statusFromErrcode(res);
1130}
1131
Rubin Xuec27ff22019-01-08 21:33:03 +00001132binder::Status NetdNativeService::firewallAddUidInterfaceRules(const std::string& ifName,
1133 const std::vector<int32_t>& uids) {
1134 ENFORCE_NETWORK_STACK_PERMISSIONS();
1135
1136 return asBinderStatus(gCtls->trafficCtrl.addUidInterfaceRules(
1137 RouteController::getIfIndex(ifName.c_str()), uids));
1138}
1139
1140binder::Status NetdNativeService::firewallRemoveUidInterfaceRules(
1141 const std::vector<int32_t>& uids) {
1142 ENFORCE_NETWORK_STACK_PERMISSIONS();
1143
1144 return asBinderStatus(gCtls->trafficCtrl.removeUidInterfaceRules(uids));
1145}
1146
Luke Huang19b49c52018-10-22 12:12:05 +09001147binder::Status NetdNativeService::tetherAddForward(const std::string& intIface,
1148 const std::string& extIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001149 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang19b49c52018-10-22 12:12:05 +09001150
1151 int res = gCtls->tetherCtrl.enableNat(intIface.c_str(), extIface.c_str());
Luke Huang19b49c52018-10-22 12:12:05 +09001152 return statusFromErrcode(res);
1153}
1154
1155binder::Status NetdNativeService::tetherRemoveForward(const std::string& intIface,
1156 const std::string& extIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001157 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangae038f82018-11-05 11:17:31 +09001158 int res = gCtls->tetherCtrl.disableNat(intIface.c_str(), extIface.c_str());
Luke Huang19b49c52018-10-22 12:12:05 +09001159 return statusFromErrcode(res);
1160}
1161
Chenbo Fengf5663d82018-11-08 16:10:48 -08001162binder::Status NetdNativeService::setTcpRWmemorySize(const std::string& rmemValues,
1163 const std::string& wmemValues) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001164 ENFORCE_NETWORK_STACK_PERMISSIONS();
Chenbo Fengf5663d82018-11-08 16:10:48 -08001165 if (!WriteStringToFile(rmemValues, TCP_RMEM_PROC_FILE)) {
1166 int ret = -errno;
Chenbo Fengf5663d82018-11-08 16:10:48 -08001167 return statusFromErrcode(ret);
1168 }
1169
1170 if (!WriteStringToFile(wmemValues, TCP_WMEM_PROC_FILE)) {
1171 int ret = -errno;
Chenbo Fengf5663d82018-11-08 16:10:48 -08001172 return statusFromErrcode(ret);
1173 }
Chenbo Fengf5663d82018-11-08 16:10:48 -08001174 return binder::Status::ok();
1175}
1176
Luke Huang528af602018-08-29 19:06:05 +08001177binder::Status NetdNativeService::registerUnsolicitedEventListener(
1178 const android::sp<android::net::INetdUnsolicitedEventListener>& listener) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001179 ENFORCE_NETWORK_STACK_PERMISSIONS();
Bernie Innocenti9ee088d2019-02-01 17:14:32 +09001180 gCtls->eventReporter.registerUnsolEventListener(listener);
Luke Huang528af602018-08-29 19:06:05 +08001181 return binder::Status::ok();
1182}
1183
Luke Huange60bfd82019-04-26 11:39:31 +08001184binder::Status NetdNativeService::getOemNetd(android::sp<android::IBinder>* listener) {
1185 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang0e5e69d2019-03-06 15:42:38 +08001186 *listener = com::android::internal::net::OemNetdListener::getListener();
1187
Luke Huange60bfd82019-04-26 11:39:31 +08001188 return binder::Status::ok();
1189}
1190
Lorenzo Colittie4d626e2016-02-02 17:19:04 +09001191} // namespace net
1192} // namespace android