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 ¶meter, 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