NetdNativeService.cpp revision 08b84cd0d223ae3059ce7d4d55b389fdea187580
1e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti/**
2e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * Copyright (c) 2016, The Android Open Source Project
3e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti *
4e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * Licensed under the Apache License, Version 2.0 (the "License");
5e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * you may not use this file except in compliance with the License.
6e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * You may obtain a copy of the License at
7e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti *
8e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti *     http://www.apache.org/licenses/LICENSE-2.0
9e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti *
10e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * Unless required by applicable law or agreed to in writing, software
11e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * distributed under the License is distributed on an "AS IS" BASIS,
12e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * See the License for the specific language governing permissions and
14e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti * limitations under the License.
15e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti */
16e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti
17e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#define LOG_TAG "Netd"
18e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti
1989faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti#include <vector>
2089faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti
21e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#include <android-base/stringprintf.h>
22e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#include <cutils/log.h>
232cf561722c2661cc0d4db502a44a3021609f307eRobin Lee#include <cutils/properties.h>
24e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#include <utils/Errors.h>
25beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai#include <utils/String16.h>
26e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti
27e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#include <binder/IPCThreadState.h>
28e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#include <binder/IServiceManager.h>
29e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#include "android/net/BnNetd.h"
30e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti
3189faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti#include "Controllers.h"
322d3a163433c435ff053402ae8965f8602c7ac6daErik Kline#include "DumpWriter.h"
33d544011db2537092fe4f76d238dfe3a82ad15a36Michal Karpinski#include "EventReporter.h"
3455b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline#include "InterfaceController.h"
35e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#include "NetdConstants.h"
36e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#include "NetdNativeService.h"
37b8087363143050d214d48e5620a330776ca95a69Robin Lee#include "RouteController.h"
38563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti#include "SockDiag.h"
39b8087363143050d214d48e5620a330776ca95a69Robin Lee#include "UidRanges.h"
40e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti
41e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colittiusing android::base::StringPrintf;
42e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti
43e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colittinamespace android {
44e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colittinamespace net {
45e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti
46e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colittinamespace {
47e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti
48e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitticonst char CONNECTIVITY_INTERNAL[] = "android.permission.CONNECTIVITY_INTERNAL";
4908b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelzconst char NETWORK_STACK[] = "android.permission.NETWORK_STACK";
502d3a163433c435ff053402ae8965f8602c7ac6daErik Klineconst char DUMP[] = "android.permission.DUMP";
51e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti
5208b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelzbinder::Status toBinderStatus(const netdutils::Status s) {
5308b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelz    if (isOk(s)) {
5408b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelz        return binder::Status::ok();
5508b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelz    }
5608b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelz    return binder::Status::fromExceptionCode(s.code(), s.msg().c_str());
5708b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelz}
5808b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelz
59e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colittibinder::Status checkPermission(const char *permission) {
60e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti    pid_t pid;
61e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti    uid_t uid;
62e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti
63e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti    if (checkCallingPermission(String16(permission), (int32_t *) &pid, (int32_t *) &uid)) {
64e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti        return binder::Status::ok();
65e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti    } else {
66e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti        auto err = StringPrintf("UID %d / PID %d lacks permission %s", uid, pid, permission);
67e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti        return binder::Status::fromExceptionCode(binder::Status::EX_SECURITY, String8(err.c_str()));
68e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti    }
69e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti}
70e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti
711a37153768aa605e0787591c39d73b674acd92c3Nathan Haroldbinder::Status getXfrmStatus(int xfrmCode) {
721a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    switch(xfrmCode) {
731a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        case 0:
741a37153768aa605e0787591c39d73b674acd92c3Nathan Harold            return binder::Status::ok();
751a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        case -ENOENT:
761a37153768aa605e0787591c39d73b674acd92c3Nathan Harold            return binder::Status::fromServiceSpecificError(xfrmCode);
771a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    }
781a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    return binder::Status::fromExceptionCode(xfrmCode);
791a37153768aa605e0787591c39d73b674acd92c3Nathan Harold}
801a37153768aa605e0787591c39d73b674acd92c3Nathan Harold
812cf561722c2661cc0d4db502a44a3021609f307eRobin Lee#define ENFORCE_DEBUGGABLE() {                              \
822cf561722c2661cc0d4db502a44a3021609f307eRobin Lee    char value[PROPERTY_VALUE_MAX + 1];                     \
832cf561722c2661cc0d4db502a44a3021609f307eRobin Lee    if (property_get("ro.debuggable", value, NULL) != 1     \
842cf561722c2661cc0d4db502a44a3021609f307eRobin Lee            || value[0] != '1') {                           \
852cf561722c2661cc0d4db502a44a3021609f307eRobin Lee        return binder::Status::fromExceptionCode(           \
862cf561722c2661cc0d4db502a44a3021609f307eRobin Lee            binder::Status::EX_SECURITY,                    \
872cf561722c2661cc0d4db502a44a3021609f307eRobin Lee            String8("Not available in production builds.")  \
882cf561722c2661cc0d4db502a44a3021609f307eRobin Lee        );                                                  \
892cf561722c2661cc0d4db502a44a3021609f307eRobin Lee    }                                                       \
902cf561722c2661cc0d4db502a44a3021609f307eRobin Lee}
912cf561722c2661cc0d4db502a44a3021609f307eRobin Lee
92e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#define ENFORCE_PERMISSION(permission) {                    \
93e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti    binder::Status status = checkPermission((permission));  \
94e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti    if (!status.isOk()) {                                   \
95e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti        return status;                                      \
96e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti    }                                                       \
97e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti}
98e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti
9989faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti#define NETD_LOCKING_RPC(permission, lock)                  \
10089faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti    ENFORCE_PERMISSION(permission);                         \
10189faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti    android::RWLock::AutoWLock _lock(lock);
10289faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti
10389faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti#define NETD_BIG_LOCK_RPC(permission) NETD_LOCKING_RPC((permission), gBigNetdLock)
104e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti}  // namespace
105e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti
106e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti
107e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colittistatus_t NetdNativeService::start() {
108e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti    IPCThreadState::self()->disableBackgroundScheduling(true);
109e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti    status_t ret = BinderService<NetdNativeService>::publish();
110e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti    if (ret != android::OK) {
111e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti        return ret;
112e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti    }
113e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti    sp<ProcessState> ps(ProcessState::self());
114e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti    ps->startThreadPool();
115e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti    ps->giveThreadPoolName();
116e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti    return android::OK;
117e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti}
118e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti
1192d3a163433c435ff053402ae8965f8602c7ac6daErik Klinestatus_t NetdNativeService::dump(int fd, const Vector<String16> & /* args */) {
1202d3a163433c435ff053402ae8965f8602c7ac6daErik Kline    const binder::Status dump_permission = checkPermission(DUMP);
1212d3a163433c435ff053402ae8965f8602c7ac6daErik Kline    if (!dump_permission.isOk()) {
1222d3a163433c435ff053402ae8965f8602c7ac6daErik Kline        const String8 msg(dump_permission.toString8());
1232d3a163433c435ff053402ae8965f8602c7ac6daErik Kline        write(fd, msg.string(), msg.size());
1242d3a163433c435ff053402ae8965f8602c7ac6daErik Kline        return PERMISSION_DENIED;
1252d3a163433c435ff053402ae8965f8602c7ac6daErik Kline    }
1262d3a163433c435ff053402ae8965f8602c7ac6daErik Kline
1272d3a163433c435ff053402ae8965f8602c7ac6daErik Kline    // This method does not grab any locks. If individual classes need locking
1282d3a163433c435ff053402ae8965f8602c7ac6daErik Kline    // their dump() methods MUST handle locking appropriately.
1292d3a163433c435ff053402ae8965f8602c7ac6daErik Kline    DumpWriter dw(fd);
1302d3a163433c435ff053402ae8965f8602c7ac6daErik Kline    dw.blankline();
1312d3a163433c435ff053402ae8965f8602c7ac6daErik Kline    gCtls->netCtrl.dump(dw);
1322d3a163433c435ff053402ae8965f8602c7ac6daErik Kline    dw.blankline();
1332d3a163433c435ff053402ae8965f8602c7ac6daErik Kline
1342d3a163433c435ff053402ae8965f8602c7ac6daErik Kline    return NO_ERROR;
1352d3a163433c435ff053402ae8965f8602c7ac6daErik Kline}
1362d3a163433c435ff053402ae8965f8602c7ac6daErik Kline
137e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colittibinder::Status NetdNativeService::isAlive(bool *alive) {
13889faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti    NETD_BIG_LOCK_RPC(CONNECTIVITY_INTERNAL);
139e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti
140e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti    *alive = true;
141e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti    return binder::Status::ok();
142e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti}
143e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti
14489faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colittibinder::Status NetdNativeService::firewallReplaceUidChain(const android::String16& chainName,
14589faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti        bool isWhitelist, const std::vector<int32_t>& uids, bool *ret) {
14689faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti    NETD_LOCKING_RPC(CONNECTIVITY_INTERNAL, gCtls->firewallCtrl.lock);
14789faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti
14889faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti    android::String8 name = android::String8(chainName);
14989faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti    int err = gCtls->firewallCtrl.replaceUidChain(name.string(), isWhitelist, uids);
15089faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti    *ret = (err == 0);
15189faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti    return binder::Status::ok();
152dedd271d9961dbe8b99ffa7d54ffd63ac326f866Lorenzo Colitti}
153dedd271d9961dbe8b99ffa7d54ffd63ac326f866Lorenzo Colitti
154dedd271d9961dbe8b99ffa7d54ffd63ac326f866Lorenzo Colittibinder::Status NetdNativeService::bandwidthEnableDataSaver(bool enable, bool *ret) {
155dedd271d9961dbe8b99ffa7d54ffd63ac326f866Lorenzo Colitti    NETD_LOCKING_RPC(CONNECTIVITY_INTERNAL, gCtls->bandwidthCtrl.lock);
15689faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti
157dedd271d9961dbe8b99ffa7d54ffd63ac326f866Lorenzo Colitti    int err = gCtls->bandwidthCtrl.enableDataSaver(enable);
158dedd271d9961dbe8b99ffa7d54ffd63ac326f866Lorenzo Colitti    *ret = (err == 0);
159dedd271d9961dbe8b99ffa7d54ffd63ac326f866Lorenzo Colitti    return binder::Status::ok();
16089faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti}
161dedd271d9961dbe8b99ffa7d54ffd63ac326f866Lorenzo Colitti
162b8087363143050d214d48e5620a330776ca95a69Robin Leebinder::Status NetdNativeService::networkRejectNonSecureVpn(bool add,
163b8087363143050d214d48e5620a330776ca95a69Robin Lee        const std::vector<UidRange>& uidRangeArray) {
164b8087363143050d214d48e5620a330776ca95a69Robin Lee    // TODO: elsewhere RouteController is only used from the tethering and network controllers, so
165b8087363143050d214d48e5620a330776ca95a69Robin Lee    // it should be possible to use the same lock as NetworkController. However, every call through
166b8087363143050d214d48e5620a330776ca95a69Robin Lee    // the CommandListener "network" command will need to hold this lock too, not just the ones that
167b8087363143050d214d48e5620a330776ca95a69Robin Lee    // read/modify network internal state (that is sufficient for ::dump() because it doesn't
168b8087363143050d214d48e5620a330776ca95a69Robin Lee    // look at routes, but it's not enough here).
169b8087363143050d214d48e5620a330776ca95a69Robin Lee    NETD_BIG_LOCK_RPC(CONNECTIVITY_INTERNAL);
170b8087363143050d214d48e5620a330776ca95a69Robin Lee
171563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti    UidRanges uidRanges(uidRangeArray);
172b8087363143050d214d48e5620a330776ca95a69Robin Lee
173b8087363143050d214d48e5620a330776ca95a69Robin Lee    int err;
174b8087363143050d214d48e5620a330776ca95a69Robin Lee    if (add) {
175b8087363143050d214d48e5620a330776ca95a69Robin Lee        err = RouteController::addUsersToRejectNonSecureNetworkRule(uidRanges);
176b8087363143050d214d48e5620a330776ca95a69Robin Lee    } else {
177b8087363143050d214d48e5620a330776ca95a69Robin Lee        err = RouteController::removeUsersFromRejectNonSecureNetworkRule(uidRanges);
178b8087363143050d214d48e5620a330776ca95a69Robin Lee    }
179b8087363143050d214d48e5620a330776ca95a69Robin Lee
180b8087363143050d214d48e5620a330776ca95a69Robin Lee    if (err != 0) {
181b8087363143050d214d48e5620a330776ca95a69Robin Lee        return binder::Status::fromServiceSpecificError(-err,
182b8087363143050d214d48e5620a330776ca95a69Robin Lee                String8::format("RouteController error: %s", strerror(-err)));
183b8087363143050d214d48e5620a330776ca95a69Robin Lee    }
184b8087363143050d214d48e5620a330776ca95a69Robin Lee    return binder::Status::ok();
185b8087363143050d214d48e5620a330776ca95a69Robin Lee}
186b8087363143050d214d48e5620a330776ca95a69Robin Lee
187563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colittibinder::Status NetdNativeService::socketDestroy(const std::vector<UidRange>& uids,
188563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti        const std::vector<int32_t>& skipUids) {
189563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti
190563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti    ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
191563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti
192563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti    SockDiag sd;
193563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti    if (!sd.open()) {
194563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti        return binder::Status::fromServiceSpecificError(EIO,
195563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti                String8("Could not open SOCK_DIAG socket"));
196563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti    }
197563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti
198563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti    UidRanges uidRanges(uids);
199e5c3c9971a5d1525380c18fff65c2816eb79923eLorenzo Colitti    int err = sd.destroySockets(uidRanges, std::set<uid_t>(skipUids.begin(), skipUids.end()),
200e5c3c9971a5d1525380c18fff65c2816eb79923eLorenzo Colitti                                true /* excludeLoopback */);
201563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti
202563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti    if (err) {
203563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti        return binder::Status::fromServiceSpecificError(-err,
204563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti                String8::format("destroySockets: %s", strerror(-err)));
205563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti    }
206beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai    return binder::Status::ok();
207beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai}
208beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai
209beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imaibinder::Status NetdNativeService::setResolverConfiguration(int32_t netId,
210beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai        const std::vector<std::string>& servers, const std::vector<std::string>& domains,
211beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai        const std::vector<int32_t>& params) {
212beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai    // This function intentionally does not lock within Netd, as Bionic is thread-safe.
213beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai    ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
214563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti
215beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai    int err = gCtls->resolverCtrl.setResolverConfiguration(netId, servers, domains, params);
216beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai    if (err != 0) {
217beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai        return binder::Status::fromServiceSpecificError(-err,
218beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai                String8::format("ResolverController error: %s", strerror(-err)));
219beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai    }
220beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai    return binder::Status::ok();
221beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai}
222beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai
223beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imaibinder::Status NetdNativeService::getResolverInfo(int32_t netId,
224beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai        std::vector<std::string>* servers, std::vector<std::string>* domains,
225beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai        std::vector<int32_t>* params, std::vector<int32_t>* stats) {
226beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai    // This function intentionally does not lock within Netd, as Bionic is thread-safe.
227beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai    ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
228beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai
229beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai    int err = gCtls->resolverCtrl.getResolverInfo(netId, servers, domains, params, stats);
230beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai    if (err != 0) {
231beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai        return binder::Status::fromServiceSpecificError(-err,
232beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai                String8::format("ResolverController error: %s", strerror(-err)));
233beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai    }
234563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti    return binder::Status::ok();
235563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti}
236563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti
237f48e4dd80eb164394a8119abc59a5b9ecf36c4dbErik Klinebinder::Status NetdNativeService::tetherApplyDnsInterfaces(bool *ret) {
238f48e4dd80eb164394a8119abc59a5b9ecf36c4dbErik Kline    NETD_BIG_LOCK_RPC(CONNECTIVITY_INTERNAL);
239f48e4dd80eb164394a8119abc59a5b9ecf36c4dbErik Kline
240f48e4dd80eb164394a8119abc59a5b9ecf36c4dbErik Kline    *ret = gCtls->tetherCtrl.applyDnsInterfaces();
241f48e4dd80eb164394a8119abc59a5b9ecf36c4dbErik Kline    return binder::Status::ok();
242f48e4dd80eb164394a8119abc59a5b9ecf36c4dbErik Kline}
243f48e4dd80eb164394a8119abc59a5b9ecf36c4dbErik Kline
24453c2088c4091e511c713ee759ce905e40e6d8975Erik Klinebinder::Status NetdNativeService::interfaceAddAddress(const std::string &ifName,
24553c2088c4091e511c713ee759ce905e40e6d8975Erik Kline        const std::string &addrString, int prefixLength) {
24653c2088c4091e511c713ee759ce905e40e6d8975Erik Kline    ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
24753c2088c4091e511c713ee759ce905e40e6d8975Erik Kline
24853c2088c4091e511c713ee759ce905e40e6d8975Erik Kline    const int err = InterfaceController::addAddress(
24953c2088c4091e511c713ee759ce905e40e6d8975Erik Kline            ifName.c_str(), addrString.c_str(), prefixLength);
25053c2088c4091e511c713ee759ce905e40e6d8975Erik Kline    if (err != 0) {
25153c2088c4091e511c713ee759ce905e40e6d8975Erik Kline        return binder::Status::fromServiceSpecificError(-err,
25253c2088c4091e511c713ee759ce905e40e6d8975Erik Kline                String8::format("InterfaceController error: %s", strerror(-err)));
25353c2088c4091e511c713ee759ce905e40e6d8975Erik Kline    }
25453c2088c4091e511c713ee759ce905e40e6d8975Erik Kline    return binder::Status::ok();
25553c2088c4091e511c713ee759ce905e40e6d8975Erik Kline}
25653c2088c4091e511c713ee759ce905e40e6d8975Erik Kline
25753c2088c4091e511c713ee759ce905e40e6d8975Erik Klinebinder::Status NetdNativeService::interfaceDelAddress(const std::string &ifName,
25853c2088c4091e511c713ee759ce905e40e6d8975Erik Kline        const std::string &addrString, int prefixLength) {
25953c2088c4091e511c713ee759ce905e40e6d8975Erik Kline    ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
26053c2088c4091e511c713ee759ce905e40e6d8975Erik Kline
26153c2088c4091e511c713ee759ce905e40e6d8975Erik Kline    const int err = InterfaceController::delAddress(
26253c2088c4091e511c713ee759ce905e40e6d8975Erik Kline            ifName.c_str(), addrString.c_str(), prefixLength);
26353c2088c4091e511c713ee759ce905e40e6d8975Erik Kline    if (err != 0) {
26453c2088c4091e511c713ee759ce905e40e6d8975Erik Kline        return binder::Status::fromServiceSpecificError(-err,
26553c2088c4091e511c713ee759ce905e40e6d8975Erik Kline                String8::format("InterfaceController error: %s", strerror(-err)));
26653c2088c4091e511c713ee759ce905e40e6d8975Erik Kline    }
26753c2088c4091e511c713ee759ce905e40e6d8975Erik Kline    return binder::Status::ok();
26853c2088c4091e511c713ee759ce905e40e6d8975Erik Kline}
26953c2088c4091e511c713ee759ce905e40e6d8975Erik Kline
27055b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Klinebinder::Status NetdNativeService::setProcSysNet(
27155b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline        int32_t family, int32_t which, const std::string &ifname, const std::string &parameter,
27255b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline        const std::string &value) {
27355b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline    ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
27455b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline
27555b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline    const char *familyStr;
27655b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline    switch (family) {
27755b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline        case INetd::IPV4:
27855b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline            familyStr = "ipv4";
27955b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline            break;
28055b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline        case INetd::IPV6:
28155b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline            familyStr = "ipv6";
28255b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline            break;
28355b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline        default:
28455b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline            return binder::Status::fromServiceSpecificError(EAFNOSUPPORT, String8("Bad family"));
28555b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline    }
28655b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline
28755b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline    const char *whichStr;
28855b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline    switch (which) {
28955b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline        case INetd::CONF:
29055b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline            whichStr = "conf";
29155b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline            break;
29255b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline        case INetd::NEIGH:
29355b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline            whichStr = "neigh";
29455b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline            break;
29555b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline        default:
29655b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline            return binder::Status::fromServiceSpecificError(EINVAL, String8("Bad category"));
29755b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline    }
29855b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline
29955b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline    const int err = InterfaceController::setParameter(
30055b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline            familyStr, whichStr, ifname.c_str(), parameter.c_str(),
30155b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline            value.c_str());
30255b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline    if (err != 0) {
30355b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline        return binder::Status::fromServiceSpecificError(-err,
30455b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline                String8::format("ResolverController error: %s", strerror(-err)));
30555b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline    }
30655b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline    return binder::Status::ok();
30755b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline}
30855b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline
3092cf561722c2661cc0d4db502a44a3021609f307eRobin Leebinder::Status NetdNativeService::getMetricsReportingLevel(int *reportingLevel) {
3102cf561722c2661cc0d4db502a44a3021609f307eRobin Lee    // This function intentionally does not lock, since the only thing it does is one read from an
3112cf561722c2661cc0d4db502a44a3021609f307eRobin Lee    // atomic_int.
3122cf561722c2661cc0d4db502a44a3021609f307eRobin Lee    ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
3132cf561722c2661cc0d4db502a44a3021609f307eRobin Lee    ENFORCE_DEBUGGABLE();
3142cf561722c2661cc0d4db502a44a3021609f307eRobin Lee
315d544011db2537092fe4f76d238dfe3a82ad15a36Michal Karpinski    *reportingLevel = gCtls->eventReporter.getMetricsReportingLevel();
3162cf561722c2661cc0d4db502a44a3021609f307eRobin Lee    return binder::Status::ok();
3172cf561722c2661cc0d4db502a44a3021609f307eRobin Lee}
3182cf561722c2661cc0d4db502a44a3021609f307eRobin Lee
3192cf561722c2661cc0d4db502a44a3021609f307eRobin Leebinder::Status NetdNativeService::setMetricsReportingLevel(const int reportingLevel) {
3202cf561722c2661cc0d4db502a44a3021609f307eRobin Lee    // This function intentionally does not lock, since the only thing it does is one write to an
3212cf561722c2661cc0d4db502a44a3021609f307eRobin Lee    // atomic_int.
3222cf561722c2661cc0d4db502a44a3021609f307eRobin Lee    ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
3232cf561722c2661cc0d4db502a44a3021609f307eRobin Lee    ENFORCE_DEBUGGABLE();
3242cf561722c2661cc0d4db502a44a3021609f307eRobin Lee
325d544011db2537092fe4f76d238dfe3a82ad15a36Michal Karpinski    return (gCtls->eventReporter.setMetricsReportingLevel(reportingLevel) == 0)
326d544011db2537092fe4f76d238dfe3a82ad15a36Michal Karpinski            ? binder::Status::ok()
327d544011db2537092fe4f76d238dfe3a82ad15a36Michal Karpinski            : binder::Status::fromExceptionCode(binder::Status::EX_ILLEGAL_ARGUMENT);
3282cf561722c2661cc0d4db502a44a3021609f307eRobin Lee}
3292cf561722c2661cc0d4db502a44a3021609f307eRobin Lee
3301a37153768aa605e0787591c39d73b674acd92c3Nathan Haroldbinder::Status NetdNativeService::ipSecAllocateSpi(
3311a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        int32_t transformId,
3321a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        int32_t direction,
3331a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        const std::string& localAddress,
3341a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        const std::string& remoteAddress,
3351a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        int32_t inSpi,
3361a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        int32_t* outSpi) {
3371a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    // Necessary locking done in IpSecService and kernel
3381a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
3391a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    ALOGD("ipSecAllocateSpi()");
3401a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    return getXfrmStatus(gCtls->xfrmCtrl.ipSecAllocateSpi(
3411a37153768aa605e0787591c39d73b674acd92c3Nathan Harold                    transformId,
3421a37153768aa605e0787591c39d73b674acd92c3Nathan Harold                    direction,
3431a37153768aa605e0787591c39d73b674acd92c3Nathan Harold                    localAddress,
3441a37153768aa605e0787591c39d73b674acd92c3Nathan Harold                    remoteAddress,
3451a37153768aa605e0787591c39d73b674acd92c3Nathan Harold                    inSpi,
3461a37153768aa605e0787591c39d73b674acd92c3Nathan Harold                    outSpi));
3471a37153768aa605e0787591c39d73b674acd92c3Nathan Harold}
3481a37153768aa605e0787591c39d73b674acd92c3Nathan Harold
3491a37153768aa605e0787591c39d73b674acd92c3Nathan Haroldbinder::Status NetdNativeService::ipSecAddSecurityAssociation(
3501a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        int32_t transformId,
3511a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        int32_t mode,
3521a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        int32_t direction,
3531a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        const std::string& localAddress,
3541a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        const std::string& remoteAddress,
3551a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        int64_t underlyingNetworkHandle,
3561a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        int32_t spi,
3571a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        const std::string& authAlgo, const std::vector<uint8_t>& authKey, int32_t authTruncBits,
3581a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        const std::string& cryptAlgo, const std::vector<uint8_t>& cryptKey, int32_t cryptTruncBits,
3591a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        int32_t encapType,
3601a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        int32_t encapLocalPort,
3611a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        int32_t encapRemotePort,
3621a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        int32_t* allocatedSpi) {
3631a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    // Necessary locking done in IpSecService and kernel
3641a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
3651a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    ALOGD("ipSecAddSecurityAssociation()");
3661a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    return getXfrmStatus(gCtls->xfrmCtrl.ipSecAddSecurityAssociation(
3671a37153768aa605e0787591c39d73b674acd92c3Nathan Harold              transformId, mode, direction, localAddress, remoteAddress,
3681a37153768aa605e0787591c39d73b674acd92c3Nathan Harold              underlyingNetworkHandle,
3691a37153768aa605e0787591c39d73b674acd92c3Nathan Harold              spi,
3701a37153768aa605e0787591c39d73b674acd92c3Nathan Harold              authAlgo, authKey, authTruncBits,
3711a37153768aa605e0787591c39d73b674acd92c3Nathan Harold              cryptAlgo, cryptKey, cryptTruncBits,
3721a37153768aa605e0787591c39d73b674acd92c3Nathan Harold              encapType, encapLocalPort, encapRemotePort,
3731a37153768aa605e0787591c39d73b674acd92c3Nathan Harold              allocatedSpi));
3741a37153768aa605e0787591c39d73b674acd92c3Nathan Harold}
3751a37153768aa605e0787591c39d73b674acd92c3Nathan Harold
3761a37153768aa605e0787591c39d73b674acd92c3Nathan Haroldbinder::Status NetdNativeService::ipSecDeleteSecurityAssociation(
3771a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        int32_t transformId,
3781a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        int32_t direction,
3791a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        const std::string& localAddress,
3801a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        const std::string& remoteAddress,
3811a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        int32_t spi) {
3821a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    // Necessary locking done in IpSecService and kernel
3831a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
3841a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    ALOGD("ipSecDeleteSecurityAssociation()");
3851a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    return getXfrmStatus(gCtls->xfrmCtrl.ipSecDeleteSecurityAssociation(
3861a37153768aa605e0787591c39d73b674acd92c3Nathan Harold                    transformId,
3871a37153768aa605e0787591c39d73b674acd92c3Nathan Harold                    direction,
3881a37153768aa605e0787591c39d73b674acd92c3Nathan Harold                    localAddress,
3891a37153768aa605e0787591c39d73b674acd92c3Nathan Harold                    remoteAddress,
3901a37153768aa605e0787591c39d73b674acd92c3Nathan Harold                    spi));
3911a37153768aa605e0787591c39d73b674acd92c3Nathan Harold}
3921a37153768aa605e0787591c39d73b674acd92c3Nathan Harold
3931a37153768aa605e0787591c39d73b674acd92c3Nathan Haroldbinder::Status NetdNativeService::ipSecApplyTransportModeTransform(
3941a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        const android::base::unique_fd& socket,
3951a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        int32_t transformId,
3961a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        int32_t direction,
3971a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        const std::string& localAddress,
3981a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        const std::string& remoteAddress,
3991a37153768aa605e0787591c39d73b674acd92c3Nathan Harold        int32_t spi) {
4001a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    // Necessary locking done in IpSecService and kernel
4011a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
4021a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    ALOGD("ipSecApplyTransportModeTransform()");
4031a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    return getXfrmStatus(gCtls->xfrmCtrl.ipSecApplyTransportModeTransform(
4041a37153768aa605e0787591c39d73b674acd92c3Nathan Harold                    socket,
4051a37153768aa605e0787591c39d73b674acd92c3Nathan Harold                    transformId,
4061a37153768aa605e0787591c39d73b674acd92c3Nathan Harold                    direction,
4071a37153768aa605e0787591c39d73b674acd92c3Nathan Harold                    localAddress,
4081a37153768aa605e0787591c39d73b674acd92c3Nathan Harold                    remoteAddress,
4091a37153768aa605e0787591c39d73b674acd92c3Nathan Harold                    spi));
4101a37153768aa605e0787591c39d73b674acd92c3Nathan Harold}
4111a37153768aa605e0787591c39d73b674acd92c3Nathan Harold
4121a37153768aa605e0787591c39d73b674acd92c3Nathan Haroldbinder::Status NetdNativeService::ipSecRemoveTransportModeTransform(
4131a37153768aa605e0787591c39d73b674acd92c3Nathan Harold            const android::base::unique_fd& socket) {
4141a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    // Necessary locking done in IpSecService and kernel
4151a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL);
4161a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    ALOGD("ipSecRemoveTransportModeTransform()");
4171a37153768aa605e0787591c39d73b674acd92c3Nathan Harold    return getXfrmStatus(gCtls->xfrmCtrl.ipSecRemoveTransportModeTransform(
4181a37153768aa605e0787591c39d73b674acd92c3Nathan Harold                    socket));
4191a37153768aa605e0787591c39d73b674acd92c3Nathan Harold}
4201a37153768aa605e0787591c39d73b674acd92c3Nathan Harold
42108b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelzbinder::Status NetdNativeService::wakeupAddInterface(const std::string& ifName,
42208b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelz                                                     const std::string& prefix, int32_t mark,
42308b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelz                                                     int32_t mask) {
42408b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelz    ENFORCE_PERMISSION(NETWORK_STACK);
42508b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelz    return toBinderStatus(gCtls->wakeupCtrl.addInterface(ifName, prefix, mark, mask));
42608b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelz}
42708b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelz
42808b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelzbinder::Status NetdNativeService::wakeupDelInterface(const std::string& ifName,
42908b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelz                                                     const std::string& prefix, int32_t mark,
43008b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelz                                                     int32_t mask) {
43108b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelz    ENFORCE_PERMISSION(NETWORK_STACK);
43208b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelz    return toBinderStatus(gCtls->wakeupCtrl.delInterface(ifName, prefix, mark, mask));
43308b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelz}
43408b84cd0d223ae3059ce7d4d55b389fdea187580Joel Scherpelz
435e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti}  // namespace net
436e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti}  // namespace android
437