blob: dcf8e0241acda49a07905492a71f3f4c9ad4491e [file] [log] [blame]
Lorenzo Colittie4d626e2016-02-02 17:19:04 +09001/**
2 * Copyright (c) 2016, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "Netd"
18
Luke Huangcaebcbb2018-09-27 20:37:14 +080019#include <cinttypes>
Xiao Ma33d562a2018-12-16 16:27:38 +090020#include <numeric>
Ben Schwartz4204ecf2017-10-02 12:35:48 -040021#include <set>
Erik Kline38e51f12018-09-06 20:14:44 +090022#include <tuple>
Lorenzo Colitti89faa342016-02-26 11:38:47 +090023#include <vector>
24
Chenbo Fengf5663d82018-11-08 16:10:48 -080025#include <android-base/file.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090026#include <android-base/stringprintf.h>
Ben Schwartz4204ecf2017-10-02 12:35:48 -040027#include <android-base/strings.h>
Robin Lee2cf56172016-09-13 18:55:42 +090028#include <cutils/properties.h>
Logan Chien3f461482018-04-23 14:31:32 +080029#include <log/log.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090030#include <utils/Errors.h>
Pierre Imaibeedec32016-04-13 06:44:51 +090031#include <utils/String16.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090032
33#include <binder/IPCThreadState.h>
34#include <binder/IServiceManager.h>
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090035
Xiao Ma33d562a2018-12-16 16:27:38 +090036#include <json/value.h>
Ben Schwartze7601812017-04-28 16:38:29 -040037#include <openssl/base64.h>
38
Lorenzo Colitti89faa342016-02-26 11:38:47 +090039#include "Controllers.h"
Erik Kline2d3a1632016-03-15 16:33:48 +090040#include "DumpWriter.h"
Erik Kline55b06f82016-07-04 09:57:18 +090041#include "InterfaceController.h"
Mike Yu5ae61542018-10-19 22:11:43 +080042#include "NetdConstants.h" // SHA256_SIZE
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090043#include "NetdNativeService.h"
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090044#include "NetdPermissions.h"
Luke Huangb670d162018-08-23 20:01:13 +080045#include "Permission.h"
Erik Kline85890042018-05-25 19:19:11 +090046#include "Process.h"
Robin Leeb8087362016-03-30 18:43:08 +010047#include "RouteController.h"
Lorenzo Colitti563d98b2016-04-24 13:13:14 +090048#include "SockDiag.h"
Robin Leeb8087362016-03-30 18:43:08 +010049#include "UidRanges.h"
Xiao Ma33d562a2018-12-16 16:27:38 +090050#include "android/net/BnNetd.h"
Bernie Innocenti189eb502018-10-01 23:10:18 +090051#include "netid_client.h" // NETID_UNSET
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090052
53using android::base::StringPrintf;
Chenbo Fengf5663d82018-11-08 16:10:48 -080054using android::base::WriteStringToFile;
Luke Huangcaebcbb2018-09-27 20:37:14 +080055using android::net::TetherStatsParcel;
Luke Huang94658ac2018-10-18 19:35:12 +090056using android::net::UidRangeParcel;
Luke Huange203a152018-11-23 11:47:28 +080057using android::os::ParcelFileDescriptor;
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090058
59namespace android {
60namespace net {
61
62namespace {
Erik Klineb31fd692018-06-06 20:50:11 +090063const char OPT_SHORT[] = "--short";
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090064
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090065binder::Status checkAnyPermission(const std::vector<const char*>& permissions) {
Luke Huanga38b65c2018-09-26 16:31:03 +080066 pid_t pid = IPCThreadState::self()->getCallingPid();
67 uid_t uid = IPCThreadState::self()->getCallingUid();
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090068
Luke Huanga38b65c2018-09-26 16:31:03 +080069 // If the caller is the system UID, don't check permissions.
70 // Otherwise, if the system server's binder thread pool is full, and all the threads are
71 // blocked on a thread that's waiting for us to complete, we deadlock. http://b/69389492
72 //
73 // From a security perspective, there is currently no difference, because:
74 // 1. The only permissions we check in netd's binder interface are CONNECTIVITY_INTERNAL
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090075 // and NETWORK_STACK, which the system server always has (or MAINLINE_NETWORK_STACK, which
76 // is equivalent to having both CONNECTIVITY_INTERNAL and NETWORK_STACK).
Luke Huanga38b65c2018-09-26 16:31:03 +080077 // 2. AID_SYSTEM always has all permissions. See ActivityManager#checkComponentPermission.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090078 if (uid == AID_SYSTEM) {
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090079 return binder::Status::ok();
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090080 }
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090081
82 for (const char* permission : permissions) {
83 if (checkPermission(String16(permission), pid, uid)) {
84 return binder::Status::ok();
85 }
86 }
87
88 auto err = StringPrintf("UID %d / PID %d does not have any of the following permissions: %s",
89 uid, pid, android::base::Join(permissions, ',').c_str());
90 return binder::Status::fromExceptionCode(binder::Status::EX_SECURITY, err.c_str());
Lorenzo Colittie4d626e2016-02-02 17:19:04 +090091}
92
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +090093#define ENFORCE_ANY_PERMISSION(...) \
94 do { \
95 binder::Status status = checkAnyPermission({__VA_ARGS__}); \
96 if (!status.isOk()) { \
97 return status; \
98 } \
99 } while (0)
Robin Lee2cf56172016-09-13 18:55:42 +0900100
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900101#define NETD_LOCKING_RPC(lock, ... /* permissions */) \
102 ENFORCE_ANY_PERMISSION(__VA_ARGS__); \
Bernie Innocentiabf8a342018-08-10 15:17:16 +0900103 std::lock_guard _lock(lock);
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900104
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900105#define NETD_BIG_LOCK_RPC(... /* permissions */) NETD_LOCKING_RPC(gBigNetdLock, __VA_ARGS__)
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900106
Luke Huangf7782042018-08-08 13:13:04 +0800107#define RETURN_BINDER_STATUS_IF_NOT_OK(logEntry, res) \
108 do { \
109 if (!isOk((res))) { \
110 logErrorStatus((logEntry), (res)); \
111 return asBinderStatus((res)); \
112 } \
113 } while (0)
114
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900115#define ENFORCE_INTERNAL_PERMISSIONS() \
116 ENFORCE_ANY_PERMISSION(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK)
117
118#define ENFORCE_NETWORK_STACK_PERMISSIONS() \
119 ENFORCE_ANY_PERMISSION(PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK)
120
Luke Huangf7782042018-08-08 13:13:04 +0800121void logErrorStatus(netdutils::LogEntry& logEntry, const netdutils::Status& status) {
122 gLog.log(logEntry.returns(status.code()).withAutomaticDuration());
123}
124
Bernie Innocenti97f388f2018-10-16 19:17:08 +0900125binder::Status asBinderStatus(const netdutils::Status& status) {
126 if (isOk(status)) {
127 return binder::Status::ok();
128 }
129 return binder::Status::fromServiceSpecificError(status.code(), status.msg().c_str());
130}
131
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900132inline binder::Status statusFromErrcode(int ret) {
133 if (ret) {
134 return binder::Status::fromServiceSpecificError(-ret, strerror(-ret));
135 }
136 return binder::Status::ok();
137}
138
Erik Klineb31fd692018-06-06 20:50:11 +0900139bool contains(const Vector<String16>& words, const String16& word) {
140 for (const auto& w : words) {
141 if (w == word) return true;
142 }
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900143
Erik Klineb31fd692018-06-06 20:50:11 +0900144 return false;
145}
146
147} // namespace
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900148
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900149status_t NetdNativeService::start() {
150 IPCThreadState::self()->disableBackgroundScheduling(true);
Erik Klineb31fd692018-06-06 20:50:11 +0900151 const status_t ret = BinderService<NetdNativeService>::publish();
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900152 if (ret != android::OK) {
153 return ret;
154 }
155 sp<ProcessState> ps(ProcessState::self());
156 ps->startThreadPool();
157 ps->giveThreadPoolName();
Xiao Ma33d562a2018-12-16 16:27:38 +0900158
159 // register log callback to BnNetd::logFunc
160 BnNetd::logFunc = [](const Json::Value& logTransaction) {
161 bool hasReturnArgs;
162 std::string output;
163 const Json::Value& inputArgs = logTransaction["input_args"];
164 const Json::Value& returnArgs = logTransaction["_aidl_return"];
165 Json::Value::Members member = inputArgs.getMemberNames();
166
167 hasReturnArgs = !returnArgs.empty();
168 output.append(logTransaction["method_name"].asString().c_str() + std::string("("));
169
170 // input args
171 for (Json::Value::Members::iterator iter = member.begin(); iter != member.end(); ++iter) {
172 std::string value = inputArgs[(*iter).c_str()].asString();
173 if (value.empty()) value = std::string("null");
174 output.append(value);
175 if (iter != member.end() - 1) {
176 output.append(", ");
177 }
178 }
179 output.append(std::string(")"));
180 // return args
181 if (hasReturnArgs) {
182 output.append(StringPrintf(" -> (%s)", returnArgs.asString().c_str()));
183 }
184 // duration time
185 output.append(StringPrintf(" <%sms>", logTransaction["duration_ms"].asString().c_str()));
186 gLog.info("%s", output.c_str());
187 };
188
Lorenzo Colittie4851de2016-03-17 13:23:28 +0900189 return android::OK;
190}
191
Hugo Benichi7b314e12018-01-15 21:54:00 +0900192status_t NetdNativeService::dump(int fd, const Vector<String16> &args) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900193 const binder::Status dump_permission = checkAnyPermission({PERM_DUMP});
Erik Kline2d3a1632016-03-15 16:33:48 +0900194 if (!dump_permission.isOk()) {
195 const String8 msg(dump_permission.toString8());
196 write(fd, msg.string(), msg.size());
197 return PERMISSION_DENIED;
198 }
199
200 // This method does not grab any locks. If individual classes need locking
201 // their dump() methods MUST handle locking appropriately.
Hugo Benichi7b314e12018-01-15 21:54:00 +0900202
Erik Kline2d3a1632016-03-15 16:33:48 +0900203 DumpWriter dw(fd);
Hugo Benichi7b314e12018-01-15 21:54:00 +0900204
205 if (!args.isEmpty() && args[0] == TcpSocketMonitor::DUMP_KEYWORD) {
206 dw.blankline();
207 gCtls->tcpSocketMonitor.dump(dw);
208 dw.blankline();
209 return NO_ERROR;
210 }
211
Chenbo Fengef297172018-03-26 10:53:33 -0700212 if (!args.isEmpty() && args[0] == TrafficController::DUMP_KEYWORD) {
213 dw.blankline();
214 gCtls->trafficCtrl.dump(dw, true);
215 dw.blankline();
216 return NO_ERROR;
217 }
218
Erik Kline85890042018-05-25 19:19:11 +0900219 process::dump(dw);
Erik Kline2d3a1632016-03-15 16:33:48 +0900220 dw.blankline();
221 gCtls->netCtrl.dump(dw);
222 dw.blankline();
223
Chenbo Fengef297172018-03-26 10:53:33 -0700224 gCtls->trafficCtrl.dump(dw, false);
225 dw.blankline();
226
Benedict Wongaf855432018-05-10 17:07:37 -0700227 gCtls->xfrmCtrl.dump(dw);
228 dw.blankline();
229
Erik Klineb31fd692018-06-06 20:50:11 +0900230 {
231 ScopedIndent indentLog(dw);
232 if (contains(args, String16(OPT_SHORT))) {
233 dw.println("Log: <omitted>");
234 } else {
235 dw.println("Log:");
236 ScopedIndent indentLogEntries(dw);
237 gLog.forEachEntry([&dw](const std::string& entry) mutable { dw.println(entry); });
238 }
239 dw.blankline();
240 }
241
Luke Huang528af602018-08-29 19:06:05 +0800242 {
243 ScopedIndent indentLog(dw);
244 if (contains(args, String16(OPT_SHORT))) {
245 dw.println("UnsolicitedLog: <omitted>");
246 } else {
247 dw.println("UnsolicitedLog:");
248 ScopedIndent indentLogEntries(dw);
249 gUnsolicitedLog.forEachEntry(
250 [&dw](const std::string& entry) mutable { dw.println(entry); });
251 }
252 dw.blankline();
253 }
254
Erik Kline2d3a1632016-03-15 16:33:48 +0900255 return NO_ERROR;
256}
257
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900258binder::Status NetdNativeService::isAlive(bool *alive) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900259 NETD_BIG_LOCK_RPC(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900260
261 *alive = true;
Erik Klineb31fd692018-06-06 20:50:11 +0900262
Lorenzo Colittie4d626e2016-02-02 17:19:04 +0900263 return binder::Status::ok();
264}
265
Erik Klinef52d4522018-03-14 15:01:46 +0900266binder::Status NetdNativeService::firewallReplaceUidChain(const std::string& chainName,
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900267 bool isWhitelist, const std::vector<int32_t>& uids, bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900268 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_CONNECTIVITY_INTERNAL,
269 PERM_MAINLINE_NETWORK_STACK);
Erik Klinef52d4522018-03-14 15:01:46 +0900270 int err = gCtls->firewallCtrl.replaceUidChain(chainName, isWhitelist, uids);
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900271 *ret = (err == 0);
272 return binder::Status::ok();
Lorenzo Colitti89faa342016-02-26 11:38:47 +0900273}
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900274
275binder::Status NetdNativeService::bandwidthEnableDataSaver(bool enable, bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900276 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_CONNECTIVITY_INTERNAL,
277 PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colittidedd2712016-03-22 12:36:29 +0900278 int err = gCtls->bandwidthCtrl.enableDataSaver(enable);
279 *ret = (err == 0);
280 return binder::Status::ok();
281}
282
Luke Huang531f5d32018-08-03 15:19:05 +0800283binder::Status NetdNativeService::bandwidthSetInterfaceQuota(const std::string& ifName,
284 int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900285 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800286 int res = gCtls->bandwidthCtrl.setInterfaceQuota(ifName, bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800287 return statusFromErrcode(res);
288}
289
290binder::Status NetdNativeService::bandwidthRemoveInterfaceQuota(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900291 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800292 int res = gCtls->bandwidthCtrl.removeInterfaceQuota(ifName);
Luke Huang531f5d32018-08-03 15:19:05 +0800293 return statusFromErrcode(res);
294}
295
296binder::Status NetdNativeService::bandwidthSetInterfaceAlert(const std::string& ifName,
297 int64_t bytes) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900298 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800299 int res = gCtls->bandwidthCtrl.setInterfaceAlert(ifName, bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800300 return statusFromErrcode(res);
301}
302
303binder::Status NetdNativeService::bandwidthRemoveInterfaceAlert(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900304 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800305 int res = gCtls->bandwidthCtrl.removeInterfaceAlert(ifName);
Luke Huang531f5d32018-08-03 15:19:05 +0800306 return statusFromErrcode(res);
307}
308
309binder::Status NetdNativeService::bandwidthSetGlobalAlert(int64_t bytes) {
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 int res = gCtls->bandwidthCtrl.setGlobalAlert(bytes);
Luke Huang531f5d32018-08-03 15:19:05 +0800312 return statusFromErrcode(res);
313}
314
315binder::Status NetdNativeService::bandwidthAddNaughtyApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900316 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800317 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
318 int res = gCtls->bandwidthCtrl.addNaughtyApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800319 return statusFromErrcode(res);
320}
321
322binder::Status NetdNativeService::bandwidthRemoveNaughtyApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900323 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800324 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
325 int res = gCtls->bandwidthCtrl.removeNaughtyApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800326 return statusFromErrcode(res);
327}
328
329binder::Status NetdNativeService::bandwidthAddNiceApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900330 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800331 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
332 int res = gCtls->bandwidthCtrl.addNiceApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800333 return statusFromErrcode(res);
334}
335
336binder::Status NetdNativeService::bandwidthRemoveNiceApp(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900337 NETD_LOCKING_RPC(gCtls->bandwidthCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang531f5d32018-08-03 15:19:05 +0800338 std::vector<std::string> appStrUids = {std::to_string(abs(uid))};
339 int res = gCtls->bandwidthCtrl.removeNiceApps(appStrUids);
Luke Huang531f5d32018-08-03 15:19:05 +0800340 return statusFromErrcode(res);
341}
342
Luke Huangb670d162018-08-23 20:01:13 +0800343binder::Status NetdNativeService::networkCreatePhysical(int32_t netId, int32_t permission) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900344 ENFORCE_INTERNAL_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +0800345 int ret = gCtls->netCtrl.createPhysicalNetwork(netId, convertPermission(permission));
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900346 return statusFromErrcode(ret);
347}
348
cken67cd14c2018-12-05 17:26:59 +0900349binder::Status NetdNativeService::networkCreateVpn(int32_t netId, bool secure) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900350 ENFORCE_NETWORK_STACK_PERMISSIONS();
cken67cd14c2018-12-05 17:26:59 +0900351 int ret = gCtls->netCtrl.createVirtualNetwork(netId, secure);
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900352 return statusFromErrcode(ret);
353}
354
355binder::Status NetdNativeService::networkDestroy(int32_t netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900356 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klinec8b6a9c2018-01-15 17:06:48 +0900357 // Both of these functions manage their own locking internally.
Mike Yu3e348b62018-12-24 17:05:02 +0800358 // Clear DNS servers before deleting the cache to avoid the cache being created again.
Erik Klinec8b6a9c2018-01-15 17:06:48 +0900359 gCtls->resolverCtrl.clearDnsServers(netId);
Mike Yu4fe1b9c2019-01-29 17:50:19 +0800360 const int ret = gCtls->netCtrl.destroyNetwork(netId);
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900361 return statusFromErrcode(ret);
362}
363
364binder::Status NetdNativeService::networkAddInterface(int32_t netId, const std::string& iface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900365 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900366 int ret = gCtls->netCtrl.addInterfaceToNetwork(netId, iface.c_str());
367 return statusFromErrcode(ret);
368}
369
370binder::Status NetdNativeService::networkRemoveInterface(int32_t netId, const std::string& iface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900371 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900372 int ret = gCtls->netCtrl.removeInterfaceFromNetwork(netId, iface.c_str());
373 return statusFromErrcode(ret);
374}
375
Luke Huang94658ac2018-10-18 19:35:12 +0900376binder::Status NetdNativeService::networkAddUidRanges(
377 int32_t netId, const std::vector<UidRangeParcel>& uidRangeArray) {
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900378 // NetworkController::addUsersToNetwork is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900379 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900380 int ret = gCtls->netCtrl.addUsersToNetwork(netId, UidRanges(uidRangeArray));
381 return statusFromErrcode(ret);
382}
383
Luke Huang94658ac2018-10-18 19:35:12 +0900384binder::Status NetdNativeService::networkRemoveUidRanges(
385 int32_t netId, const std::vector<UidRangeParcel>& uidRangeArray) {
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900386 // NetworkController::removeUsersFromNetwork is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900387 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900388 int ret = gCtls->netCtrl.removeUsersFromNetwork(netId, UidRanges(uidRangeArray));
389 return statusFromErrcode(ret);
390}
391
Luke Huang94658ac2018-10-18 19:35:12 +0900392binder::Status NetdNativeService::networkRejectNonSecureVpn(
393 bool add, const std::vector<UidRangeParcel>& uidRangeArray) {
Robin Leeb8087362016-03-30 18:43:08 +0100394 // TODO: elsewhere RouteController is only used from the tethering and network controllers, so
395 // it should be possible to use the same lock as NetworkController. However, every call through
396 // the CommandListener "network" command will need to hold this lock too, not just the ones that
397 // read/modify network internal state (that is sufficient for ::dump() because it doesn't
398 // look at routes, but it's not enough here).
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900399 NETD_BIG_LOCK_RPC(PERM_CONNECTIVITY_INTERNAL, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900400 UidRanges uidRanges(uidRangeArray);
Robin Leeb8087362016-03-30 18:43:08 +0100401
402 int err;
403 if (add) {
404 err = RouteController::addUsersToRejectNonSecureNetworkRule(uidRanges);
405 } else {
406 err = RouteController::removeUsersFromRejectNonSecureNetworkRule(uidRanges);
407 }
Lorenzo Colittid33e96d2016-12-15 23:59:01 +0900408 return statusFromErrcode(err);
Robin Leeb8087362016-03-30 18:43:08 +0100409}
410
Luke Huang94658ac2018-10-18 19:35:12 +0900411binder::Status NetdNativeService::socketDestroy(const std::vector<UidRangeParcel>& uids,
412 const std::vector<int32_t>& skipUids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900413 ENFORCE_INTERNAL_PERMISSIONS();
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900414
415 SockDiag sd;
416 if (!sd.open()) {
417 return binder::Status::fromServiceSpecificError(EIO,
418 String8("Could not open SOCK_DIAG socket"));
419 }
420
421 UidRanges uidRanges(uids);
Lorenzo Colittie5c3c992016-07-26 17:53:50 +0900422 int err = sd.destroySockets(uidRanges, std::set<uid_t>(skipUids.begin(), skipUids.end()),
423 true /* excludeLoopback */);
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900424 if (err) {
425 return binder::Status::fromServiceSpecificError(-err,
426 String8::format("destroySockets: %s", strerror(-err)));
427 }
Pierre Imaibeedec32016-04-13 06:44:51 +0900428 return binder::Status::ok();
429}
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900430
Ben Schwartz4204ecf2017-10-02 12:35:48 -0400431// Parse a base64 encoded string into a vector of bytes.
432// On failure, return an empty vector.
433static std::vector<uint8_t> parseBase64(const std::string& input) {
434 std::vector<uint8_t> decoded;
435 size_t out_len;
436 if (EVP_DecodedLength(&out_len, input.size()) != 1) {
437 return decoded;
438 }
439 // out_len is now an upper bound on the output length.
440 decoded.resize(out_len);
441 if (EVP_DecodeBase64(decoded.data(), &out_len, decoded.size(),
442 reinterpret_cast<const uint8_t*>(input.data()), input.size()) == 1) {
443 // Possibly shrink the vector if the actual output was smaller than the bound.
444 decoded.resize(out_len);
445 } else {
446 decoded.clear();
447 }
448 if (out_len != SHA256_SIZE) {
449 decoded.clear();
450 }
451 return decoded;
452}
453
Pierre Imaibeedec32016-04-13 06:44:51 +0900454binder::Status NetdNativeService::setResolverConfiguration(int32_t netId,
455 const std::vector<std::string>& servers, const std::vector<std::string>& domains,
Erik Klinea1476fb2018-03-04 21:01:56 +0900456 const std::vector<int32_t>& params, const std::string& tlsName,
457 const std::vector<std::string>& tlsServers,
Ben Schwartz4204ecf2017-10-02 12:35:48 -0400458 const std::vector<std::string>& tlsFingerprints) {
Pierre Imaibeedec32016-04-13 06:44:51 +0900459 // This function intentionally does not lock within Netd, as Bionic is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900460 ENFORCE_INTERNAL_PERMISSIONS();
Pierre Imaibeedec32016-04-13 06:44:51 +0900461
Ben Schwartz4204ecf2017-10-02 12:35:48 -0400462 std::set<std::vector<uint8_t>> decoded_fingerprints;
463 for (const std::string& fingerprint : tlsFingerprints) {
464 std::vector<uint8_t> decoded = parseBase64(fingerprint);
465 if (decoded.empty()) {
466 return binder::Status::fromServiceSpecificError(EINVAL,
467 String8::format("ResolverController error: bad fingerprint"));
468 }
469 decoded_fingerprints.emplace(decoded);
470 }
471
472 int err = gCtls->resolverCtrl.setResolverConfiguration(netId, servers, domains, params,
Erik Klinea1476fb2018-03-04 21:01:56 +0900473 tlsName, tlsServers, decoded_fingerprints);
Pierre Imaibeedec32016-04-13 06:44:51 +0900474 if (err != 0) {
475 return binder::Status::fromServiceSpecificError(-err,
476 String8::format("ResolverController error: %s", strerror(-err)));
477 }
478 return binder::Status::ok();
479}
480
Ken Chen2a429352018-12-22 21:46:55 +0800481binder::Status NetdNativeService::getResolverInfo(
482 int32_t netId, std::vector<std::string>* servers, std::vector<std::string>* domains,
483 std::vector<std::string>* tlsServers, std::vector<int32_t>* params,
484 std::vector<int32_t>* stats, std::vector<int32_t>* wait_for_pending_req_timeout_count) {
Pierre Imaibeedec32016-04-13 06:44:51 +0900485 // This function intentionally does not lock within Netd, as Bionic is thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900486 ENFORCE_NETWORK_STACK_PERMISSIONS();
Pierre Imaibeedec32016-04-13 06:44:51 +0900487
Ken Chen2a429352018-12-22 21:46:55 +0800488 int err = gCtls->resolverCtrl.getResolverInfo(netId, servers, domains, tlsServers, params,
489 stats, wait_for_pending_req_timeout_count);
Pierre Imaibeedec32016-04-13 06:44:51 +0900490 if (err != 0) {
491 return binder::Status::fromServiceSpecificError(-err,
492 String8::format("ResolverController error: %s", strerror(-err)));
493 }
Lorenzo Colitti563d98b2016-04-24 13:13:14 +0900494 return binder::Status::ok();
495}
496
Lorenzo Colittib5d45872019-02-18 10:59:29 +0900497binder::Status NetdNativeService::resolverStartPrefix64Discovery(int32_t netId) {
498 // Locking happens in Dns64Configuration.
499 ENFORCE_NETWORK_STACK_PERMISSIONS();
500 gCtls->resolverCtrl.startPrefix64Discovery(netId);
501 return binder::Status::ok();
502}
503
504binder::Status NetdNativeService::resolverStopPrefix64Discovery(int32_t netId) {
505 // Locking happens in Dns64Configuration.
506 ENFORCE_NETWORK_STACK_PERMISSIONS();
507 gCtls->resolverCtrl.stopPrefix64Discovery(netId);
508 return binder::Status::ok();
509}
510
Erik Klinef48e4dd2016-07-18 04:02:07 +0900511binder::Status NetdNativeService::tetherApplyDnsInterfaces(bool *ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900512 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Erik Klinef48e4dd2016-07-18 04:02:07 +0900513 *ret = gCtls->tetherCtrl.applyDnsInterfaces();
514 return binder::Status::ok();
515}
516
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900517namespace {
518
Luke Huangcaebcbb2018-09-27 20:37:14 +0800519void tetherAddStatsByInterface(TetherController::TetherStats* tetherStatsParcel,
520 const TetherController::TetherStats& tetherStats) {
521 if (tetherStatsParcel->extIface == tetherStats.extIface) {
522 tetherStatsParcel->rxBytes += tetherStats.rxBytes;
523 tetherStatsParcel->rxPackets += tetherStats.rxPackets;
524 tetherStatsParcel->txBytes += tetherStats.txBytes;
525 tetherStatsParcel->txPackets += tetherStats.txPackets;
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900526 }
Luke Huangcaebcbb2018-09-27 20:37:14 +0800527}
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900528
Luke Huangcaebcbb2018-09-27 20:37:14 +0800529TetherStatsParcel toTetherStatsParcel(const TetherController::TetherStats& stats) {
530 TetherStatsParcel result;
531 result.iface = stats.extIface;
532 result.rxBytes = stats.rxBytes;
533 result.rxPackets = stats.rxPackets;
534 result.txBytes = stats.txBytes;
535 result.txPackets = stats.txPackets;
536 return result;
537}
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900538
Luke Huangcaebcbb2018-09-27 20:37:14 +0800539void setTetherStatsParcelVecByInterface(std::vector<TetherStatsParcel>* tetherStatsVec,
540 const TetherController::TetherStatsList& statsList) {
541 std::map<std::string, TetherController::TetherStats> statsMap;
542 for (const auto& stats : statsList) {
543 auto iter = statsMap.find(stats.extIface);
544 if (iter != statsMap.end()) {
545 tetherAddStatsByInterface(&(iter->second), stats);
546 } else {
547 statsMap.insert(
548 std::pair<std::string, TetherController::TetherStats>(stats.extIface, stats));
549 }
550 }
551 for (auto iter = statsMap.begin(); iter != statsMap.end(); iter++) {
552 tetherStatsVec->push_back(toTetherStatsParcel(iter->second));
553 }
554}
555
556std::vector<std::string> tetherStatsParcelVecToStringVec(std::vector<TetherStatsParcel>* tVec) {
557 std::vector<std::string> result;
558 for (const auto& t : *tVec) {
559 result.push_back(StringPrintf("%s:%" PRId64 ",%" PRId64 ",%" PRId64 ",%" PRId64,
560 t.iface.c_str(), t.rxBytes, t.rxPackets, t.txBytes,
561 t.txPackets));
562 }
563 return result;
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900564}
565
566} // namespace
567
Luke Huangcaebcbb2018-09-27 20:37:14 +0800568binder::Status NetdNativeService::tetherGetStats(
569 std::vector<TetherStatsParcel>* tetherStatsParcelVec) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900570 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti5192bf72017-09-04 13:30:59 +0900571 const auto& statsList = gCtls->tetherCtrl.getTetherStats();
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900572 if (!isOk(statsList)) {
Nathan Harold28ccfef2018-03-16 19:02:47 -0700573 return asBinderStatus(statsList);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900574 }
Luke Huangcaebcbb2018-09-27 20:37:14 +0800575 setTetherStatsParcelVecByInterface(tetherStatsParcelVec, statsList.value());
576 auto statsResults = tetherStatsParcelVecToStringVec(tetherStatsParcelVec);
Lorenzo Colitti9a8a9ff2017-01-31 19:06:59 +0900577 return binder::Status::ok();
578}
579
Erik Kline53c20882016-08-02 15:22:53 +0900580binder::Status NetdNativeService::interfaceAddAddress(const std::string &ifName,
581 const std::string &addrString, int prefixLength) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900582 ENFORCE_INTERNAL_PERMISSIONS();
Erik Kline53c20882016-08-02 15:22:53 +0900583 const int err = InterfaceController::addAddress(
584 ifName.c_str(), addrString.c_str(), prefixLength);
585 if (err != 0) {
586 return binder::Status::fromServiceSpecificError(-err,
587 String8::format("InterfaceController error: %s", strerror(-err)));
588 }
589 return binder::Status::ok();
590}
591
592binder::Status NetdNativeService::interfaceDelAddress(const std::string &ifName,
593 const std::string &addrString, int prefixLength) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900594 ENFORCE_INTERNAL_PERMISSIONS();
Erik Kline53c20882016-08-02 15:22:53 +0900595 const int err = InterfaceController::delAddress(
596 ifName.c_str(), addrString.c_str(), prefixLength);
597 if (err != 0) {
598 return binder::Status::fromServiceSpecificError(-err,
599 String8::format("InterfaceController error: %s", strerror(-err)));
600 }
601 return binder::Status::ok();
602}
603
Erik Kline38e51f12018-09-06 20:14:44 +0900604namespace {
Erik Kline55b06f82016-07-04 09:57:18 +0900605
Erik Kline38e51f12018-09-06 20:14:44 +0900606std::tuple<binder::Status, const char*, const char*> getPathComponents(int32_t ipversion,
607 int32_t category) {
608 const char* ipversionStr = nullptr;
609 switch (ipversion) {
Erik Kline55b06f82016-07-04 09:57:18 +0900610 case INetd::IPV4:
Erik Kline38e51f12018-09-06 20:14:44 +0900611 ipversionStr = "ipv4";
Erik Kline55b06f82016-07-04 09:57:18 +0900612 break;
613 case INetd::IPV6:
Erik Kline38e51f12018-09-06 20:14:44 +0900614 ipversionStr = "ipv6";
Erik Kline55b06f82016-07-04 09:57:18 +0900615 break;
616 default:
Erik Kline38e51f12018-09-06 20:14:44 +0900617 return {binder::Status::fromServiceSpecificError(EAFNOSUPPORT, "Bad IP version"),
618 nullptr, nullptr};
Erik Kline55b06f82016-07-04 09:57:18 +0900619 }
620
Erik Kline38e51f12018-09-06 20:14:44 +0900621 const char* whichStr = nullptr;
622 switch (category) {
Erik Kline55b06f82016-07-04 09:57:18 +0900623 case INetd::CONF:
624 whichStr = "conf";
625 break;
626 case INetd::NEIGH:
627 whichStr = "neigh";
628 break;
629 default:
Erik Kline38e51f12018-09-06 20:14:44 +0900630 return {binder::Status::fromServiceSpecificError(EINVAL, "Bad category"), nullptr,
631 nullptr};
Erik Kline55b06f82016-07-04 09:57:18 +0900632 }
633
Erik Kline38e51f12018-09-06 20:14:44 +0900634 return {binder::Status::ok(), ipversionStr, whichStr};
635}
636
637} // namespace
638
639binder::Status NetdNativeService::getProcSysNet(int32_t ipversion, int32_t which,
640 const std::string& ifname,
641 const std::string& parameter, std::string* value) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900642 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline38e51f12018-09-06 20:14:44 +0900643 const auto pathParts = getPathComponents(ipversion, which);
644 const auto& pathStatus = std::get<0>(pathParts);
645 if (!pathStatus.isOk()) {
Erik Kline38e51f12018-09-06 20:14:44 +0900646 return pathStatus;
Erik Kline55b06f82016-07-04 09:57:18 +0900647 }
Erik Kline38e51f12018-09-06 20:14:44 +0900648
649 const int err = InterfaceController::getParameter(std::get<1>(pathParts),
650 std::get<2>(pathParts), ifname.c_str(),
651 parameter.c_str(), value);
Erik Kline38e51f12018-09-06 20:14:44 +0900652 return statusFromErrcode(err);
653}
654
655binder::Status NetdNativeService::setProcSysNet(int32_t ipversion, int32_t which,
656 const std::string& ifname,
657 const std::string& parameter,
658 const std::string& value) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900659 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Kline38e51f12018-09-06 20:14:44 +0900660 const auto pathParts = getPathComponents(ipversion, which);
661 const auto& pathStatus = std::get<0>(pathParts);
662 if (!pathStatus.isOk()) {
Erik Kline38e51f12018-09-06 20:14:44 +0900663 return pathStatus;
664 }
665
666 const int err = InterfaceController::setParameter(std::get<1>(pathParts),
667 std::get<2>(pathParts), ifname.c_str(),
668 parameter.c_str(), value.c_str());
Erik Kline38e51f12018-09-06 20:14:44 +0900669 return statusFromErrcode(err);
Erik Kline55b06f82016-07-04 09:57:18 +0900670}
671
Luke Huange203a152018-11-23 11:47:28 +0800672binder::Status NetdNativeService::ipSecSetEncapSocketOwner(const ParcelFileDescriptor& socket,
673 int newUid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900674 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900675 gLog.log("ipSecSetEncapSocketOwner()");
Benedict Wongb2daefb2017-12-06 22:05:46 -0800676
677 uid_t callerUid = IPCThreadState::self()->getCallingUid();
Luke Huange203a152018-11-23 11:47:28 +0800678 return asBinderStatus(
679 gCtls->xfrmCtrl.ipSecSetEncapSocketOwner(socket.get(), newUid, callerUid));
Benedict Wongb2daefb2017-12-06 22:05:46 -0800680}
681
Nathan Harold1a371532017-01-30 12:30:48 -0800682binder::Status NetdNativeService::ipSecAllocateSpi(
683 int32_t transformId,
Nathan Haroldda54f122018-01-09 16:42:57 -0800684 const std::string& sourceAddress,
685 const std::string& destinationAddress,
Nathan Harold1a371532017-01-30 12:30:48 -0800686 int32_t inSpi,
687 int32_t* outSpi) {
688 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900689 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900690 gLog.log("ipSecAllocateSpi()");
ludi6e8eccd2017-08-14 14:40:37 -0700691 return asBinderStatus(gCtls->xfrmCtrl.ipSecAllocateSpi(
Nathan Harold1a371532017-01-30 12:30:48 -0800692 transformId,
Nathan Haroldda54f122018-01-09 16:42:57 -0800693 sourceAddress,
694 destinationAddress,
Nathan Harold1a371532017-01-30 12:30:48 -0800695 inSpi,
696 outSpi));
697}
698
699binder::Status NetdNativeService::ipSecAddSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700700 int32_t transformId, int32_t mode, const std::string& sourceAddress,
701 const std::string& destinationAddress, int32_t underlyingNetId, int32_t spi,
702 int32_t markValue, int32_t markMask, const std::string& authAlgo,
703 const std::vector<uint8_t>& authKey, int32_t authTruncBits, const std::string& cryptAlgo,
704 const std::vector<uint8_t>& cryptKey, int32_t cryptTruncBits, const std::string& aeadAlgo,
705 const std::vector<uint8_t>& aeadKey, int32_t aeadIcvBits, int32_t encapType,
706 int32_t encapLocalPort, int32_t encapRemotePort, int32_t interfaceId) {
Nathan Harold1a371532017-01-30 12:30:48 -0800707 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900708 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900709 gLog.log("ipSecAddSecurityAssociation()");
ludi6e8eccd2017-08-14 14:40:37 -0700710 return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityAssociation(
Benedict Wongad600cb2018-05-14 17:22:35 -0700711 transformId, mode, sourceAddress, destinationAddress, underlyingNetId, spi, markValue,
712 markMask, authAlgo, authKey, authTruncBits, cryptAlgo, cryptKey, cryptTruncBits,
Benedict Wonga450e722018-05-07 10:29:02 -0700713 aeadAlgo, aeadKey, aeadIcvBits, encapType, encapLocalPort, encapRemotePort,
714 interfaceId));
Nathan Harold1a371532017-01-30 12:30:48 -0800715}
716
717binder::Status NetdNativeService::ipSecDeleteSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700718 int32_t transformId, const std::string& sourceAddress,
719 const std::string& destinationAddress, int32_t spi, int32_t markValue, int32_t markMask,
720 int32_t interfaceId) {
Nathan Harold1a371532017-01-30 12:30:48 -0800721 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900722 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900723 gLog.log("ipSecDeleteSecurityAssociation()");
ludi6e8eccd2017-08-14 14:40:37 -0700724 return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityAssociation(
Benedict Wonga450e722018-05-07 10:29:02 -0700725 transformId, sourceAddress, destinationAddress, spi, markValue, markMask, interfaceId));
Nathan Harold1a371532017-01-30 12:30:48 -0800726}
727
728binder::Status NetdNativeService::ipSecApplyTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800729 const ParcelFileDescriptor& socket, int32_t transformId, int32_t direction,
730 const std::string& sourceAddress, const std::string& destinationAddress, int32_t spi) {
Nathan Harold1a371532017-01-30 12:30:48 -0800731 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900732 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900733 gLog.log("ipSecApplyTransportModeTransform()");
ludi6e8eccd2017-08-14 14:40:37 -0700734 return asBinderStatus(gCtls->xfrmCtrl.ipSecApplyTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800735 socket.get(), transformId, direction, sourceAddress, destinationAddress, spi));
Nathan Harold1a371532017-01-30 12:30:48 -0800736}
737
738binder::Status NetdNativeService::ipSecRemoveTransportModeTransform(
Luke Huange203a152018-11-23 11:47:28 +0800739 const ParcelFileDescriptor& socket) {
Nathan Harold1a371532017-01-30 12:30:48 -0800740 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900741 ENFORCE_INTERNAL_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900742 gLog.log("ipSecRemoveTransportModeTransform()");
Luke Huange203a152018-11-23 11:47:28 +0800743 return asBinderStatus(gCtls->xfrmCtrl.ipSecRemoveTransportModeTransform(socket.get()));
Nathan Harold1a371532017-01-30 12:30:48 -0800744}
745
Benedict Wonga04ffa72018-05-09 21:42:42 -0700746binder::Status NetdNativeService::ipSecAddSecurityPolicy(int32_t transformId, int32_t selAddrFamily,
747 int32_t direction,
Benedict Wongad600cb2018-05-14 17:22:35 -0700748 const std::string& tmplSrcAddress,
749 const std::string& tmplDstAddress,
750 int32_t spi, int32_t markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700751 int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800752 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900753 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900754 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800755 return asBinderStatus(gCtls->xfrmCtrl.ipSecAddSecurityPolicy(
Benedict Wonga04ffa72018-05-09 21:42:42 -0700756 transformId, selAddrFamily, direction, tmplSrcAddress, tmplDstAddress, spi, markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700757 markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800758}
759
Benedict Wonga450e722018-05-07 10:29:02 -0700760binder::Status NetdNativeService::ipSecUpdateSecurityPolicy(
761 int32_t transformId, int32_t selAddrFamily, int32_t direction,
762 const std::string& tmplSrcAddress, const std::string& tmplDstAddress, int32_t spi,
763 int32_t markValue, int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800764 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900765 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900766 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800767 return asBinderStatus(gCtls->xfrmCtrl.ipSecUpdateSecurityPolicy(
Benedict Wonga04ffa72018-05-09 21:42:42 -0700768 transformId, selAddrFamily, direction, tmplSrcAddress, tmplDstAddress, spi, markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700769 markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800770}
771
Benedict Wonga04ffa72018-05-09 21:42:42 -0700772binder::Status NetdNativeService::ipSecDeleteSecurityPolicy(int32_t transformId,
773 int32_t selAddrFamily,
774 int32_t direction, int32_t markValue,
Benedict Wonga450e722018-05-07 10:29:02 -0700775 int32_t markMask, int32_t interfaceId) {
Benedict Wong84a8dca2018-01-19 12:12:17 -0800776 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900777 ENFORCE_NETWORK_STACK_PERMISSIONS();
Erik Klineb31fd692018-06-06 20:50:11 +0900778 gLog.log("ipSecAddSecurityPolicy()");
Benedict Wong84a8dca2018-01-19 12:12:17 -0800779 return asBinderStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityPolicy(
Benedict Wonga450e722018-05-07 10:29:02 -0700780 transformId, selAddrFamily, direction, markValue, markMask, interfaceId));
Benedict Wong84a8dca2018-01-19 12:12:17 -0800781}
782
Benedict Wong319f17e2018-05-15 17:06:44 -0700783binder::Status NetdNativeService::ipSecAddTunnelInterface(const std::string& deviceName,
784 const std::string& localAddress,
785 const std::string& remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700786 int32_t iKey, int32_t oKey,
787 int32_t interfaceId) {
manojboopathi8707f232018-01-02 14:45:47 -0800788 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900789 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700790 netdutils::Status result = gCtls->xfrmCtrl.ipSecAddTunnelInterface(
Benedict Wonga450e722018-05-07 10:29:02 -0700791 deviceName, localAddress, remoteAddress, iKey, oKey, interfaceId, false);
Benedict Wong319f17e2018-05-15 17:06:44 -0700792 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800793}
794
Benedict Wong319f17e2018-05-15 17:06:44 -0700795binder::Status NetdNativeService::ipSecUpdateTunnelInterface(const std::string& deviceName,
796 const std::string& localAddress,
797 const std::string& remoteAddress,
Benedict Wonga450e722018-05-07 10:29:02 -0700798 int32_t iKey, int32_t oKey,
799 int32_t interfaceId) {
manojboopathi8707f232018-01-02 14:45:47 -0800800 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900801 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700802 netdutils::Status result = gCtls->xfrmCtrl.ipSecAddTunnelInterface(
Benedict Wonga450e722018-05-07 10:29:02 -0700803 deviceName, localAddress, remoteAddress, iKey, oKey, interfaceId, true);
Benedict Wong319f17e2018-05-15 17:06:44 -0700804 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800805}
806
Benedict Wong319f17e2018-05-15 17:06:44 -0700807binder::Status NetdNativeService::ipSecRemoveTunnelInterface(const std::string& deviceName) {
manojboopathi8707f232018-01-02 14:45:47 -0800808 // Necessary locking done in IpSecService and kernel
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900809 ENFORCE_NETWORK_STACK_PERMISSIONS();
Benedict Wong319f17e2018-05-15 17:06:44 -0700810 netdutils::Status result = gCtls->xfrmCtrl.ipSecRemoveTunnelInterface(deviceName);
Benedict Wong319f17e2018-05-15 17:06:44 -0700811 return binder::Status::ok();
manojboopathi8707f232018-01-02 14:45:47 -0800812}
813
Joel Scherpelzde937962017-06-01 13:20:21 +0900814binder::Status NetdNativeService::setIPv6AddrGenMode(const std::string& ifName,
815 int32_t mode) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900816 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700817 return asBinderStatus(InterfaceController::setIPv6AddrGenMode(ifName, mode));
Joel Scherpelzde937962017-06-01 13:20:21 +0900818}
819
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900820binder::Status NetdNativeService::wakeupAddInterface(const std::string& ifName,
821 const std::string& prefix, int32_t mark,
822 int32_t mask) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900823 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700824 return asBinderStatus(gCtls->wakeupCtrl.addInterface(ifName, prefix, mark, mask));
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900825}
826
827binder::Status NetdNativeService::wakeupDelInterface(const std::string& ifName,
828 const std::string& prefix, int32_t mark,
829 int32_t mask) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900830 ENFORCE_NETWORK_STACK_PERMISSIONS();
Nathan Harold28ccfef2018-03-16 19:02:47 -0700831 return asBinderStatus(gCtls->wakeupCtrl.delInterface(ifName, prefix, mark, mask));
Joel Scherpelz08b84cd2017-05-22 13:11:54 +0900832}
833
Luke Huang0051a622018-07-23 20:30:16 +0800834binder::Status NetdNativeService::idletimerAddInterface(const std::string& ifName, int32_t timeout,
835 const std::string& classLabel) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900836 NETD_LOCKING_RPC(gCtls->idletimerCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang0051a622018-07-23 20:30:16 +0800837 int res =
838 gCtls->idletimerCtrl.addInterfaceIdletimer(ifName.c_str(), timeout, classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +0800839 return statusFromErrcode(res);
840}
841
842binder::Status NetdNativeService::idletimerRemoveInterface(const std::string& ifName,
843 int32_t timeout,
844 const std::string& classLabel) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900845 NETD_LOCKING_RPC(gCtls->idletimerCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang0051a622018-07-23 20:30:16 +0800846 int res = gCtls->idletimerCtrl.removeInterfaceIdletimer(ifName.c_str(), timeout,
847 classLabel.c_str());
Luke Huang0051a622018-07-23 20:30:16 +0800848 return statusFromErrcode(res);
849}
Luke Huanga67dd562018-07-17 19:58:25 +0800850
851binder::Status NetdNativeService::strictUidCleartextPenalty(int32_t uid, int32_t policyPenalty) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900852 NETD_LOCKING_RPC(gCtls->strictCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huanga67dd562018-07-17 19:58:25 +0800853 StrictPenalty penalty;
854 switch (policyPenalty) {
855 case INetd::PENALTY_POLICY_REJECT:
856 penalty = REJECT;
857 break;
858 case INetd::PENALTY_POLICY_LOG:
859 penalty = LOG;
860 break;
861 case INetd::PENALTY_POLICY_ACCEPT:
862 penalty = ACCEPT;
863 break;
864 default:
865 return statusFromErrcode(-EINVAL);
866 break;
867 }
868 int res = gCtls->strictCtrl.setUidCleartextPenalty((uid_t) uid, penalty);
Luke Huanga67dd562018-07-17 19:58:25 +0800869 return statusFromErrcode(res);
870}
Luke Huange64fa382018-07-24 16:38:22 +0800871
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +0900872binder::Status NetdNativeService::clatdStart(const std::string& ifName,
873 const std::string& nat64Prefix, std::string* v6Addr) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900874 NETD_LOCKING_RPC(gCtls->clatdCtrl.mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Lorenzo Colitti7ef8c0f2019-01-11 22:34:58 +0900875 int res = gCtls->clatdCtrl.startClatd(ifName.c_str(), nat64Prefix, v6Addr);
Luke Huang6d301232018-08-01 14:05:18 +0800876 return statusFromErrcode(res);
877}
878
879binder::Status NetdNativeService::clatdStop(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900880 NETD_LOCKING_RPC(gCtls->clatdCtrl.mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang6d301232018-08-01 14:05:18 +0800881 int res = gCtls->clatdCtrl.stopClatd(ifName.c_str());
Luke Huang6d301232018-08-01 14:05:18 +0800882 return statusFromErrcode(res);
883}
Luke Huanga67dd562018-07-17 19:58:25 +0800884
Luke Huang457d4702018-08-16 15:39:15 +0800885binder::Status NetdNativeService::ipfwdEnabled(bool* status) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900886 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang457d4702018-08-16 15:39:15 +0800887 *status = (gCtls->tetherCtrl.forwardingRequestCount() > 0) ? true : false;
Luke Huang457d4702018-08-16 15:39:15 +0800888 return binder::Status::ok();
889}
890
891binder::Status NetdNativeService::ipfwdEnableForwarding(const std::string& requester) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900892 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang457d4702018-08-16 15:39:15 +0800893 int res = (gCtls->tetherCtrl.enableForwarding(requester.c_str())) ? 0 : -EREMOTEIO;
Luke Huang457d4702018-08-16 15:39:15 +0800894 return statusFromErrcode(res);
895}
896
897binder::Status NetdNativeService::ipfwdDisableForwarding(const std::string& requester) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900898 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang457d4702018-08-16 15:39:15 +0800899 int res = (gCtls->tetherCtrl.disableForwarding(requester.c_str())) ? 0 : -EREMOTEIO;
Luke Huang457d4702018-08-16 15:39:15 +0800900 return statusFromErrcode(res);
901}
902
903binder::Status NetdNativeService::ipfwdAddInterfaceForward(const std::string& fromIface,
904 const std::string& toIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900905 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang457d4702018-08-16 15:39:15 +0800906 int res = RouteController::enableTethering(fromIface.c_str(), toIface.c_str());
Luke Huang457d4702018-08-16 15:39:15 +0800907 return statusFromErrcode(res);
908}
909
910binder::Status NetdNativeService::ipfwdRemoveInterfaceForward(const std::string& fromIface,
911 const std::string& toIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900912 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huang457d4702018-08-16 15:39:15 +0800913 int res = RouteController::disableTethering(fromIface.c_str(), toIface.c_str());
Luke Huang457d4702018-08-16 15:39:15 +0800914 return statusFromErrcode(res);
915}
916
Luke Huangf7782042018-08-08 13:13:04 +0800917namespace {
918std::string addSquareBrackets(const std::string& s) {
919 return "[" + s + "]";
920}
921
922std::string addCurlyBrackets(const std::string& s) {
923 return "{" + s + "}";
924}
925
926} // namespace
Xiao Ma33d562a2018-12-16 16:27:38 +0900927
Luke Huangf7782042018-08-08 13:13:04 +0800928binder::Status NetdNativeService::interfaceGetList(std::vector<std::string>* interfaceListResult) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900929 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800930 auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__);
931
932 const auto& ifaceList = InterfaceController::getIfaceNames();
933 RETURN_BINDER_STATUS_IF_NOT_OK(entry, ifaceList);
934
935 interfaceListResult->clear();
936 interfaceListResult->reserve(ifaceList.value().size());
937 interfaceListResult->insert(end(*interfaceListResult), begin(ifaceList.value()),
938 end(ifaceList.value()));
939
940 gLog.log(entry.returns(addSquareBrackets(base::Join(*interfaceListResult, ", ")))
941 .withAutomaticDuration());
942 return binder::Status::ok();
943}
944
945std::string interfaceConfigurationParcelToString(const InterfaceConfigurationParcel& cfg) {
946 std::vector<std::string> result{cfg.ifName, cfg.hwAddr, cfg.ipv4Addr,
947 std::to_string(cfg.prefixLength)};
948 result.insert(end(result), begin(cfg.flags), end(cfg.flags));
949 return addCurlyBrackets(base::Join(result, ", "));
950}
951
952binder::Status NetdNativeService::interfaceGetCfg(
953 const std::string& ifName, InterfaceConfigurationParcel* interfaceGetCfgResult) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900954 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800955 auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__).arg(ifName);
956
957 const auto& cfgRes = InterfaceController::getCfg(ifName);
958 RETURN_BINDER_STATUS_IF_NOT_OK(entry, cfgRes);
959
960 *interfaceGetCfgResult = cfgRes.value();
961 gLog.log(entry.returns(interfaceConfigurationParcelToString(*interfaceGetCfgResult))
962 .withAutomaticDuration());
963 return binder::Status::ok();
964}
965
966binder::Status NetdNativeService::interfaceSetCfg(const InterfaceConfigurationParcel& cfg) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900967 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800968 auto entry = gLog.newEntry()
969 .prettyFunction(__PRETTY_FUNCTION__)
970 .arg(interfaceConfigurationParcelToString(cfg));
971
972 const auto& res = InterfaceController::setCfg(cfg);
973 RETURN_BINDER_STATUS_IF_NOT_OK(entry, res);
974
975 gLog.log(entry.withAutomaticDuration());
976 return binder::Status::ok();
977}
978
979binder::Status NetdNativeService::interfaceSetIPv6PrivacyExtensions(const std::string& ifName,
980 bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900981 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800982 int res = InterfaceController::setIPv6PrivacyExtensions(ifName.c_str(), enable);
Luke Huangf7782042018-08-08 13:13:04 +0800983 return statusFromErrcode(res);
984}
985
986binder::Status NetdNativeService::interfaceClearAddrs(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900987 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800988 int res = InterfaceController::clearAddrs(ifName.c_str());
Luke Huangf7782042018-08-08 13:13:04 +0800989 return statusFromErrcode(res);
990}
991
992binder::Status NetdNativeService::interfaceSetEnableIPv6(const std::string& ifName, bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900993 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +0800994 int res = InterfaceController::setEnableIPv6(ifName.c_str(), enable);
Luke Huangf7782042018-08-08 13:13:04 +0800995 return statusFromErrcode(res);
996}
997
998binder::Status NetdNativeService::interfaceSetMtu(const std::string& ifName, int32_t mtuValue) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +0900999 NETD_LOCKING_RPC(InterfaceController::mutex, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangf7782042018-08-08 13:13:04 +08001000 std::string mtu = std::to_string(mtuValue);
1001 int res = InterfaceController::setMtu(ifName.c_str(), mtu.c_str());
Luke Huangf7782042018-08-08 13:13:04 +08001002 return statusFromErrcode(res);
1003}
1004
Luke Huangb5733d72018-08-21 17:17:19 +08001005binder::Status NetdNativeService::tetherStart(const std::vector<std::string>& dhcpRanges) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001006 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001007 if (dhcpRanges.size() % 2 == 1) {
1008 return statusFromErrcode(-EINVAL);
1009 }
1010 int res = gCtls->tetherCtrl.startTethering(dhcpRanges);
Luke Huangb5733d72018-08-21 17:17:19 +08001011 return statusFromErrcode(res);
1012}
1013
1014binder::Status NetdNativeService::tetherStop() {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001015 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001016 int res = gCtls->tetherCtrl.stopTethering();
Luke Huangb5733d72018-08-21 17:17:19 +08001017 return statusFromErrcode(res);
1018}
1019
1020binder::Status NetdNativeService::tetherIsEnabled(bool* enabled) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001021 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001022 *enabled = gCtls->tetherCtrl.isTetheringStarted();
Luke Huangb5733d72018-08-21 17:17:19 +08001023 return binder::Status::ok();
1024}
1025
1026binder::Status NetdNativeService::tetherInterfaceAdd(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001027 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001028 int res = gCtls->tetherCtrl.tetherInterface(ifName.c_str());
Luke Huangb5733d72018-08-21 17:17:19 +08001029 return statusFromErrcode(res);
1030}
1031
1032binder::Status NetdNativeService::tetherInterfaceRemove(const std::string& ifName) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001033 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001034 int res = gCtls->tetherCtrl.untetherInterface(ifName.c_str());
Luke Huangb5733d72018-08-21 17:17:19 +08001035 return statusFromErrcode(res);
1036}
1037
1038binder::Status NetdNativeService::tetherInterfaceList(std::vector<std::string>* ifList) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001039 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001040 for (const auto& ifname : gCtls->tetherCtrl.getTetheredInterfaceList()) {
1041 ifList->push_back(ifname);
1042 }
Luke Huangb5733d72018-08-21 17:17:19 +08001043 return binder::Status::ok();
1044}
1045
1046binder::Status NetdNativeService::tetherDnsSet(int32_t netId,
1047 const std::vector<std::string>& dnsAddrs) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001048 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001049 int res = gCtls->tetherCtrl.setDnsForwarders(netId, dnsAddrs);
Luke Huangb5733d72018-08-21 17:17:19 +08001050 return statusFromErrcode(res);
1051}
1052
1053binder::Status NetdNativeService::tetherDnsList(std::vector<std::string>* dnsList) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001054 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangb5733d72018-08-21 17:17:19 +08001055 for (const auto& fwdr : gCtls->tetherCtrl.getDnsForwarders()) {
1056 dnsList->push_back(fwdr);
1057 }
Luke Huangb5733d72018-08-21 17:17:19 +08001058 return binder::Status::ok();
1059}
1060
Luke Huangb670d162018-08-23 20:01:13 +08001061binder::Status NetdNativeService::networkAddRoute(int32_t netId, const std::string& ifName,
1062 const std::string& destination,
1063 const std::string& nextHop) {
1064 // Public methods of NetworkController are thread-safe.
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001065 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001066 bool legacy = false;
1067 uid_t uid = 0; // UID is only meaningful for legacy routes.
1068 int res = gCtls->netCtrl.addRoute(netId, ifName.c_str(), destination.c_str(),
1069 nextHop.empty() ? nullptr : nextHop.c_str(), legacy, uid);
Luke Huangb670d162018-08-23 20:01:13 +08001070 return statusFromErrcode(res);
1071}
1072
1073binder::Status NetdNativeService::networkRemoveRoute(int32_t netId, const std::string& ifName,
1074 const std::string& destination,
1075 const std::string& nextHop) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001076 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001077 bool legacy = false;
1078 uid_t uid = 0; // UID is only meaningful for legacy routes.
1079 int res = gCtls->netCtrl.removeRoute(netId, ifName.c_str(), destination.c_str(),
1080 nextHop.empty() ? nullptr : nextHop.c_str(), legacy, uid);
Luke Huangb670d162018-08-23 20:01:13 +08001081 return statusFromErrcode(res);
1082}
1083
1084binder::Status NetdNativeService::networkAddLegacyRoute(int32_t netId, const std::string& ifName,
1085 const std::string& destination,
1086 const std::string& nextHop, int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001087 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001088 bool legacy = true;
1089 int res = gCtls->netCtrl.addRoute(netId, ifName.c_str(), destination.c_str(),
1090 nextHop.empty() ? nullptr : nextHop.c_str(), legacy,
1091 (uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001092 return statusFromErrcode(res);
1093}
1094
1095binder::Status NetdNativeService::networkRemoveLegacyRoute(int32_t netId, const std::string& ifName,
1096 const std::string& destination,
1097 const std::string& nextHop,
1098 int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001099 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001100 bool legacy = true;
1101 int res = gCtls->netCtrl.removeRoute(netId, ifName.c_str(), destination.c_str(),
1102 nextHop.empty() ? nullptr : nextHop.c_str(), legacy,
1103 (uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001104 return statusFromErrcode(res);
1105}
1106
1107binder::Status NetdNativeService::networkGetDefault(int32_t* netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001108 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001109 *netId = gCtls->netCtrl.getDefaultNetwork();
Luke Huangb670d162018-08-23 20:01:13 +08001110 return binder::Status::ok();
1111}
1112
1113binder::Status NetdNativeService::networkSetDefault(int32_t netId) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001114 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001115 int res = gCtls->netCtrl.setDefaultNetwork(netId);
Luke Huangb670d162018-08-23 20:01:13 +08001116 return statusFromErrcode(res);
1117}
1118
1119binder::Status NetdNativeService::networkClearDefault() {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001120 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001121 unsigned netId = NETID_UNSET;
1122 int res = gCtls->netCtrl.setDefaultNetwork(netId);
Luke Huangb670d162018-08-23 20:01:13 +08001123 return statusFromErrcode(res);
1124}
1125
1126std::vector<uid_t> NetdNativeService::intsToUids(const std::vector<int32_t>& intUids) {
1127 return {begin(intUids), end(intUids)};
1128}
1129
1130Permission NetdNativeService::convertPermission(int32_t permission) {
1131 switch (permission) {
1132 case INetd::PERMISSION_NETWORK:
1133 return Permission::PERMISSION_NETWORK;
1134 case INetd::PERMISSION_SYSTEM:
1135 return Permission::PERMISSION_SYSTEM;
1136 default:
1137 return Permission::PERMISSION_NONE;
1138 }
1139}
1140
1141binder::Status NetdNativeService::networkSetPermissionForNetwork(int32_t netId,
1142 int32_t permission) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001143 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001144 std::vector<unsigned> netIds = {(unsigned) netId};
1145 int res = gCtls->netCtrl.setPermissionForNetworks(convertPermission(permission), netIds);
Luke Huangb670d162018-08-23 20:01:13 +08001146 return statusFromErrcode(res);
1147}
1148
1149binder::Status NetdNativeService::networkSetPermissionForUser(int32_t permission,
1150 const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001151 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001152 gCtls->netCtrl.setPermissionForUsers(convertPermission(permission), intsToUids(uids));
Luke Huangb670d162018-08-23 20:01:13 +08001153 return binder::Status::ok();
1154}
1155
1156binder::Status NetdNativeService::networkClearPermissionForUser(const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001157 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001158 Permission permission = Permission::PERMISSION_NONE;
1159 gCtls->netCtrl.setPermissionForUsers(permission, intsToUids(uids));
Luke Huangb670d162018-08-23 20:01:13 +08001160 return binder::Status::ok();
1161}
1162
1163binder::Status NetdNativeService::NetdNativeService::networkSetProtectAllow(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001164 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001165 std::vector<uid_t> uids = {(uid_t) uid};
1166 gCtls->netCtrl.allowProtect(uids);
Luke Huangb670d162018-08-23 20:01:13 +08001167 return binder::Status::ok();
1168}
1169
1170binder::Status NetdNativeService::networkSetProtectDeny(int32_t uid) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001171 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001172 std::vector<uid_t> uids = {(uid_t) uid};
1173 gCtls->netCtrl.denyProtect(uids);
Luke Huangb670d162018-08-23 20:01:13 +08001174 return binder::Status::ok();
1175}
1176
1177binder::Status NetdNativeService::networkCanProtect(int32_t uid, bool* ret) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001178 ENFORCE_NETWORK_STACK_PERMISSIONS();
Luke Huangb670d162018-08-23 20:01:13 +08001179 *ret = gCtls->netCtrl.canProtect((uid_t) uid);
Luke Huangb670d162018-08-23 20:01:13 +08001180 return binder::Status::ok();
1181}
1182
Chenbo Feng48eaed32018-12-26 17:40:21 -08001183binder::Status NetdNativeService::trafficSetNetPermForUids(int32_t permission,
1184 const std::vector<int32_t>& uids) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001185 ENFORCE_NETWORK_STACK_PERMISSIONS();
Chenbo Feng48eaed32018-12-26 17:40:21 -08001186 auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__).arg(permission).arg(uids);
1187 gCtls->trafficCtrl.setPermissionForUids(permission, intsToUids(uids));
1188 gLog.log(entry.withAutomaticDuration());
1189 return binder::Status::ok();
1190}
1191
Luke Huange64fa382018-07-24 16:38:22 +08001192binder::Status NetdNativeService::firewallSetFirewallType(int32_t firewallType) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001193 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001194 auto type = static_cast<FirewallType>(firewallType);
1195
1196 int res = gCtls->firewallCtrl.setFirewallType(type);
Luke Huange64fa382018-07-24 16:38:22 +08001197 return statusFromErrcode(res);
1198}
1199
1200binder::Status NetdNativeService::firewallSetInterfaceRule(const std::string& ifName,
1201 int32_t firewallRule) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001202 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001203 auto rule = static_cast<FirewallRule>(firewallRule);
1204
1205 int res = gCtls->firewallCtrl.setInterfaceRule(ifName.c_str(), rule);
Luke Huange64fa382018-07-24 16:38:22 +08001206 return statusFromErrcode(res);
1207}
1208
1209binder::Status NetdNativeService::firewallSetUidRule(int32_t childChain, int32_t uid,
1210 int32_t firewallRule) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001211 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001212 auto chain = static_cast<ChildChain>(childChain);
1213 auto rule = static_cast<FirewallRule>(firewallRule);
1214
1215 int res = gCtls->firewallCtrl.setUidRule(chain, uid, rule);
Luke Huange64fa382018-07-24 16:38:22 +08001216 return statusFromErrcode(res);
1217}
1218
1219binder::Status NetdNativeService::firewallEnableChildChain(int32_t childChain, bool enable) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001220 NETD_LOCKING_RPC(gCtls->firewallCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huange64fa382018-07-24 16:38:22 +08001221 auto chain = static_cast<ChildChain>(childChain);
1222
1223 int res = gCtls->firewallCtrl.enableChildChains(chain, enable);
Luke Huange64fa382018-07-24 16:38:22 +08001224 return statusFromErrcode(res);
1225}
1226
Luke Huang19b49c52018-10-22 12:12:05 +09001227binder::Status NetdNativeService::tetherAddForward(const std::string& intIface,
1228 const std::string& extIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001229 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huang19b49c52018-10-22 12:12:05 +09001230
1231 int res = gCtls->tetherCtrl.enableNat(intIface.c_str(), extIface.c_str());
Luke Huang19b49c52018-10-22 12:12:05 +09001232 return statusFromErrcode(res);
1233}
1234
1235binder::Status NetdNativeService::tetherRemoveForward(const std::string& intIface,
1236 const std::string& extIface) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001237 NETD_LOCKING_RPC(gCtls->tetherCtrl.lock, PERM_NETWORK_STACK, PERM_MAINLINE_NETWORK_STACK);
Luke Huangae038f82018-11-05 11:17:31 +09001238 int res = gCtls->tetherCtrl.disableNat(intIface.c_str(), extIface.c_str());
Luke Huang19b49c52018-10-22 12:12:05 +09001239 return statusFromErrcode(res);
1240}
1241
Chenbo Fengf5663d82018-11-08 16:10:48 -08001242binder::Status NetdNativeService::setTcpRWmemorySize(const std::string& rmemValues,
1243 const std::string& wmemValues) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001244 ENFORCE_NETWORK_STACK_PERMISSIONS();
Chenbo Fengf5663d82018-11-08 16:10:48 -08001245 if (!WriteStringToFile(rmemValues, TCP_RMEM_PROC_FILE)) {
1246 int ret = -errno;
Chenbo Fengf5663d82018-11-08 16:10:48 -08001247 return statusFromErrcode(ret);
1248 }
1249
1250 if (!WriteStringToFile(wmemValues, TCP_WMEM_PROC_FILE)) {
1251 int ret = -errno;
Chenbo Fengf5663d82018-11-08 16:10:48 -08001252 return statusFromErrcode(ret);
1253 }
Chenbo Fengf5663d82018-11-08 16:10:48 -08001254 return binder::Status::ok();
1255}
1256
nuccachenf52f7a52018-07-17 18:07:23 +08001257binder::Status NetdNativeService::getPrefix64(int netId, std::string* _aidl_return) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001258 ENFORCE_NETWORK_STACK_PERMISSIONS();
nuccachenf52f7a52018-07-17 18:07:23 +08001259 netdutils::IPPrefix prefix{};
1260 int err = gCtls->resolverCtrl.getPrefix64(netId, &prefix);
1261 if (err != 0) {
1262 return binder::Status::fromServiceSpecificError(
1263 -err, String8::format("ResolverController error: %s", strerror(-err)));
1264 }
1265 *_aidl_return = prefix.toString();
1266 return binder::Status::ok();
1267}
1268
Luke Huang528af602018-08-29 19:06:05 +08001269binder::Status NetdNativeService::registerUnsolicitedEventListener(
1270 const android::sp<android::net::INetdUnsolicitedEventListener>& listener) {
Remi NGUYEN VANa686ebc2019-02-07 12:25:23 +09001271 ENFORCE_NETWORK_STACK_PERMISSIONS();
Bernie Innocenti9ee088d2019-02-01 17:14:32 +09001272 auto entry = gLog.newEntry().prettyFunction(__PRETTY_FUNCTION__);
1273 gCtls->eventReporter.registerUnsolEventListener(listener);
Luke Huang528af602018-08-29 19:06:05 +08001274 gLog.log(entry.withAutomaticDuration());
1275 return binder::Status::ok();
1276}
1277
Lorenzo Colittie4d626e2016-02-02 17:19:04 +09001278} // namespace net
1279} // namespace android