NetdNativeService.cpp revision d544011db2537092fe4f76d238dfe3a82ad15a36
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"; 492d3a163433c435ff053402ae8965f8602c7ac6daErik Klineconst char DUMP[] = "android.permission.DUMP"; 50e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 51e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colittibinder::Status checkPermission(const char *permission) { 52e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti pid_t pid; 53e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti uid_t uid; 54e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 55e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti if (checkCallingPermission(String16(permission), (int32_t *) &pid, (int32_t *) &uid)) { 56e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti return binder::Status::ok(); 57e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti } else { 58e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti auto err = StringPrintf("UID %d / PID %d lacks permission %s", uid, pid, permission); 59e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti return binder::Status::fromExceptionCode(binder::Status::EX_SECURITY, String8(err.c_str())); 60e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti } 61e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti} 62e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 632cf561722c2661cc0d4db502a44a3021609f307eRobin Lee#define ENFORCE_DEBUGGABLE() { \ 642cf561722c2661cc0d4db502a44a3021609f307eRobin Lee char value[PROPERTY_VALUE_MAX + 1]; \ 652cf561722c2661cc0d4db502a44a3021609f307eRobin Lee if (property_get("ro.debuggable", value, NULL) != 1 \ 662cf561722c2661cc0d4db502a44a3021609f307eRobin Lee || value[0] != '1') { \ 672cf561722c2661cc0d4db502a44a3021609f307eRobin Lee return binder::Status::fromExceptionCode( \ 682cf561722c2661cc0d4db502a44a3021609f307eRobin Lee binder::Status::EX_SECURITY, \ 692cf561722c2661cc0d4db502a44a3021609f307eRobin Lee String8("Not available in production builds.") \ 702cf561722c2661cc0d4db502a44a3021609f307eRobin Lee ); \ 712cf561722c2661cc0d4db502a44a3021609f307eRobin Lee } \ 722cf561722c2661cc0d4db502a44a3021609f307eRobin Lee} 732cf561722c2661cc0d4db502a44a3021609f307eRobin Lee 74e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti#define ENFORCE_PERMISSION(permission) { \ 75e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti binder::Status status = checkPermission((permission)); \ 76e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti if (!status.isOk()) { \ 77e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti return status; \ 78e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti } \ 79e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti} 80e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 8189faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti#define NETD_LOCKING_RPC(permission, lock) \ 8289faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti ENFORCE_PERMISSION(permission); \ 8389faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti android::RWLock::AutoWLock _lock(lock); 8489faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti 8589faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti#define NETD_BIG_LOCK_RPC(permission) NETD_LOCKING_RPC((permission), gBigNetdLock) 86e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti} // namespace 87e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 88e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 89e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colittistatus_t NetdNativeService::start() { 90e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti IPCThreadState::self()->disableBackgroundScheduling(true); 91e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti status_t ret = BinderService<NetdNativeService>::publish(); 92e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti if (ret != android::OK) { 93e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti return ret; 94e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti } 95e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti sp<ProcessState> ps(ProcessState::self()); 96e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti ps->startThreadPool(); 97e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti ps->giveThreadPoolName(); 98e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti return android::OK; 99e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti} 100e4851dede1dd24bbd80ffd30c4e89c7753fed121Lorenzo Colitti 1012d3a163433c435ff053402ae8965f8602c7ac6daErik Klinestatus_t NetdNativeService::dump(int fd, const Vector<String16> & /* args */) { 1022d3a163433c435ff053402ae8965f8602c7ac6daErik Kline const binder::Status dump_permission = checkPermission(DUMP); 1032d3a163433c435ff053402ae8965f8602c7ac6daErik Kline if (!dump_permission.isOk()) { 1042d3a163433c435ff053402ae8965f8602c7ac6daErik Kline const String8 msg(dump_permission.toString8()); 1052d3a163433c435ff053402ae8965f8602c7ac6daErik Kline write(fd, msg.string(), msg.size()); 1062d3a163433c435ff053402ae8965f8602c7ac6daErik Kline return PERMISSION_DENIED; 1072d3a163433c435ff053402ae8965f8602c7ac6daErik Kline } 1082d3a163433c435ff053402ae8965f8602c7ac6daErik Kline 1092d3a163433c435ff053402ae8965f8602c7ac6daErik Kline // This method does not grab any locks. If individual classes need locking 1102d3a163433c435ff053402ae8965f8602c7ac6daErik Kline // their dump() methods MUST handle locking appropriately. 1112d3a163433c435ff053402ae8965f8602c7ac6daErik Kline DumpWriter dw(fd); 1122d3a163433c435ff053402ae8965f8602c7ac6daErik Kline dw.blankline(); 1132d3a163433c435ff053402ae8965f8602c7ac6daErik Kline gCtls->netCtrl.dump(dw); 1142d3a163433c435ff053402ae8965f8602c7ac6daErik Kline dw.blankline(); 1152d3a163433c435ff053402ae8965f8602c7ac6daErik Kline 1162d3a163433c435ff053402ae8965f8602c7ac6daErik Kline return NO_ERROR; 1172d3a163433c435ff053402ae8965f8602c7ac6daErik Kline} 1182d3a163433c435ff053402ae8965f8602c7ac6daErik Kline 119e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colittibinder::Status NetdNativeService::isAlive(bool *alive) { 12089faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti NETD_BIG_LOCK_RPC(CONNECTIVITY_INTERNAL); 121e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 122e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti *alive = true; 123e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti return binder::Status::ok(); 124e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti} 125e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti 12689faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colittibinder::Status NetdNativeService::firewallReplaceUidChain(const android::String16& chainName, 12789faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti bool isWhitelist, const std::vector<int32_t>& uids, bool *ret) { 12889faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti NETD_LOCKING_RPC(CONNECTIVITY_INTERNAL, gCtls->firewallCtrl.lock); 12989faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti 13089faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti android::String8 name = android::String8(chainName); 13189faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti int err = gCtls->firewallCtrl.replaceUidChain(name.string(), isWhitelist, uids); 13289faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti *ret = (err == 0); 13389faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti return binder::Status::ok(); 134dedd271d9961dbe8b99ffa7d54ffd63ac326f866Lorenzo Colitti} 135dedd271d9961dbe8b99ffa7d54ffd63ac326f866Lorenzo Colitti 136dedd271d9961dbe8b99ffa7d54ffd63ac326f866Lorenzo Colittibinder::Status NetdNativeService::bandwidthEnableDataSaver(bool enable, bool *ret) { 137dedd271d9961dbe8b99ffa7d54ffd63ac326f866Lorenzo Colitti NETD_LOCKING_RPC(CONNECTIVITY_INTERNAL, gCtls->bandwidthCtrl.lock); 13889faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti 139dedd271d9961dbe8b99ffa7d54ffd63ac326f866Lorenzo Colitti int err = gCtls->bandwidthCtrl.enableDataSaver(enable); 140dedd271d9961dbe8b99ffa7d54ffd63ac326f866Lorenzo Colitti *ret = (err == 0); 141dedd271d9961dbe8b99ffa7d54ffd63ac326f866Lorenzo Colitti return binder::Status::ok(); 14289faa349525ad1110b6fa3f2149e6ef825c65662Lorenzo Colitti} 143dedd271d9961dbe8b99ffa7d54ffd63ac326f866Lorenzo Colitti 144b8087363143050d214d48e5620a330776ca95a69Robin Leebinder::Status NetdNativeService::networkRejectNonSecureVpn(bool add, 145b8087363143050d214d48e5620a330776ca95a69Robin Lee const std::vector<UidRange>& uidRangeArray) { 146b8087363143050d214d48e5620a330776ca95a69Robin Lee // TODO: elsewhere RouteController is only used from the tethering and network controllers, so 147b8087363143050d214d48e5620a330776ca95a69Robin Lee // it should be possible to use the same lock as NetworkController. However, every call through 148b8087363143050d214d48e5620a330776ca95a69Robin Lee // the CommandListener "network" command will need to hold this lock too, not just the ones that 149b8087363143050d214d48e5620a330776ca95a69Robin Lee // read/modify network internal state (that is sufficient for ::dump() because it doesn't 150b8087363143050d214d48e5620a330776ca95a69Robin Lee // look at routes, but it's not enough here). 151b8087363143050d214d48e5620a330776ca95a69Robin Lee NETD_BIG_LOCK_RPC(CONNECTIVITY_INTERNAL); 152b8087363143050d214d48e5620a330776ca95a69Robin Lee 153563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti UidRanges uidRanges(uidRangeArray); 154b8087363143050d214d48e5620a330776ca95a69Robin Lee 155b8087363143050d214d48e5620a330776ca95a69Robin Lee int err; 156b8087363143050d214d48e5620a330776ca95a69Robin Lee if (add) { 157b8087363143050d214d48e5620a330776ca95a69Robin Lee err = RouteController::addUsersToRejectNonSecureNetworkRule(uidRanges); 158b8087363143050d214d48e5620a330776ca95a69Robin Lee } else { 159b8087363143050d214d48e5620a330776ca95a69Robin Lee err = RouteController::removeUsersFromRejectNonSecureNetworkRule(uidRanges); 160b8087363143050d214d48e5620a330776ca95a69Robin Lee } 161b8087363143050d214d48e5620a330776ca95a69Robin Lee 162b8087363143050d214d48e5620a330776ca95a69Robin Lee if (err != 0) { 163b8087363143050d214d48e5620a330776ca95a69Robin Lee return binder::Status::fromServiceSpecificError(-err, 164b8087363143050d214d48e5620a330776ca95a69Robin Lee String8::format("RouteController error: %s", strerror(-err))); 165b8087363143050d214d48e5620a330776ca95a69Robin Lee } 166b8087363143050d214d48e5620a330776ca95a69Robin Lee return binder::Status::ok(); 167b8087363143050d214d48e5620a330776ca95a69Robin Lee} 168b8087363143050d214d48e5620a330776ca95a69Robin Lee 169563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colittibinder::Status NetdNativeService::socketDestroy(const std::vector<UidRange>& uids, 170563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti const std::vector<int32_t>& skipUids) { 171563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti 172563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL); 173563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti 174563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti SockDiag sd; 175563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti if (!sd.open()) { 176563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti return binder::Status::fromServiceSpecificError(EIO, 177563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti String8("Could not open SOCK_DIAG socket")); 178563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti } 179563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti 180563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti UidRanges uidRanges(uids); 181e5c3c9971a5d1525380c18fff65c2816eb79923eLorenzo Colitti int err = sd.destroySockets(uidRanges, std::set<uid_t>(skipUids.begin(), skipUids.end()), 182e5c3c9971a5d1525380c18fff65c2816eb79923eLorenzo Colitti true /* excludeLoopback */); 183563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti 184563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti if (err) { 185563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti return binder::Status::fromServiceSpecificError(-err, 186563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti String8::format("destroySockets: %s", strerror(-err))); 187563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti } 188beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai return binder::Status::ok(); 189beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai} 190beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai 191beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imaibinder::Status NetdNativeService::setResolverConfiguration(int32_t netId, 192beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai const std::vector<std::string>& servers, const std::vector<std::string>& domains, 193beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai const std::vector<int32_t>& params) { 194beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai // This function intentionally does not lock within Netd, as Bionic is thread-safe. 195beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL); 196563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti 197beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai int err = gCtls->resolverCtrl.setResolverConfiguration(netId, servers, domains, params); 198beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai if (err != 0) { 199beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai return binder::Status::fromServiceSpecificError(-err, 200beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai String8::format("ResolverController error: %s", strerror(-err))); 201beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai } 202beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai return binder::Status::ok(); 203beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai} 204beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai 205beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imaibinder::Status NetdNativeService::getResolverInfo(int32_t netId, 206beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai std::vector<std::string>* servers, std::vector<std::string>* domains, 207beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai std::vector<int32_t>* params, std::vector<int32_t>* stats) { 208beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai // This function intentionally does not lock within Netd, as Bionic is thread-safe. 209beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL); 210beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai 211beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai int err = gCtls->resolverCtrl.getResolverInfo(netId, servers, domains, params, stats); 212beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai if (err != 0) { 213beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai return binder::Status::fromServiceSpecificError(-err, 214beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai String8::format("ResolverController error: %s", strerror(-err))); 215beedec3bc42d6f40a2c83a65522e85b5ff046f79Pierre Imai } 216563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti return binder::Status::ok(); 217563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti} 218563d98b27d02a1d694fc4ed82b5554fd534c9dafLorenzo Colitti 219f48e4dd80eb164394a8119abc59a5b9ecf36c4dbErik Klinebinder::Status NetdNativeService::tetherApplyDnsInterfaces(bool *ret) { 220f48e4dd80eb164394a8119abc59a5b9ecf36c4dbErik Kline NETD_BIG_LOCK_RPC(CONNECTIVITY_INTERNAL); 221f48e4dd80eb164394a8119abc59a5b9ecf36c4dbErik Kline 222f48e4dd80eb164394a8119abc59a5b9ecf36c4dbErik Kline *ret = gCtls->tetherCtrl.applyDnsInterfaces(); 223f48e4dd80eb164394a8119abc59a5b9ecf36c4dbErik Kline return binder::Status::ok(); 224f48e4dd80eb164394a8119abc59a5b9ecf36c4dbErik Kline} 225f48e4dd80eb164394a8119abc59a5b9ecf36c4dbErik Kline 22653c2088c4091e511c713ee759ce905e40e6d8975Erik Klinebinder::Status NetdNativeService::interfaceAddAddress(const std::string &ifName, 22753c2088c4091e511c713ee759ce905e40e6d8975Erik Kline const std::string &addrString, int prefixLength) { 22853c2088c4091e511c713ee759ce905e40e6d8975Erik Kline ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL); 22953c2088c4091e511c713ee759ce905e40e6d8975Erik Kline 23053c2088c4091e511c713ee759ce905e40e6d8975Erik Kline const int err = InterfaceController::addAddress( 23153c2088c4091e511c713ee759ce905e40e6d8975Erik Kline ifName.c_str(), addrString.c_str(), prefixLength); 23253c2088c4091e511c713ee759ce905e40e6d8975Erik Kline if (err != 0) { 23353c2088c4091e511c713ee759ce905e40e6d8975Erik Kline return binder::Status::fromServiceSpecificError(-err, 23453c2088c4091e511c713ee759ce905e40e6d8975Erik Kline String8::format("InterfaceController error: %s", strerror(-err))); 23553c2088c4091e511c713ee759ce905e40e6d8975Erik Kline } 23653c2088c4091e511c713ee759ce905e40e6d8975Erik Kline return binder::Status::ok(); 23753c2088c4091e511c713ee759ce905e40e6d8975Erik Kline} 23853c2088c4091e511c713ee759ce905e40e6d8975Erik Kline 23953c2088c4091e511c713ee759ce905e40e6d8975Erik Klinebinder::Status NetdNativeService::interfaceDelAddress(const std::string &ifName, 24053c2088c4091e511c713ee759ce905e40e6d8975Erik Kline const std::string &addrString, int prefixLength) { 24153c2088c4091e511c713ee759ce905e40e6d8975Erik Kline ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL); 24253c2088c4091e511c713ee759ce905e40e6d8975Erik Kline 24353c2088c4091e511c713ee759ce905e40e6d8975Erik Kline const int err = InterfaceController::delAddress( 24453c2088c4091e511c713ee759ce905e40e6d8975Erik Kline ifName.c_str(), addrString.c_str(), prefixLength); 24553c2088c4091e511c713ee759ce905e40e6d8975Erik Kline if (err != 0) { 24653c2088c4091e511c713ee759ce905e40e6d8975Erik Kline return binder::Status::fromServiceSpecificError(-err, 24753c2088c4091e511c713ee759ce905e40e6d8975Erik Kline String8::format("InterfaceController error: %s", strerror(-err))); 24853c2088c4091e511c713ee759ce905e40e6d8975Erik Kline } 24953c2088c4091e511c713ee759ce905e40e6d8975Erik Kline return binder::Status::ok(); 25053c2088c4091e511c713ee759ce905e40e6d8975Erik Kline} 25153c2088c4091e511c713ee759ce905e40e6d8975Erik Kline 25255b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Klinebinder::Status NetdNativeService::setProcSysNet( 25355b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline int32_t family, int32_t which, const std::string &ifname, const std::string ¶meter, 25455b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline const std::string &value) { 25555b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL); 25655b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline 25755b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline const char *familyStr; 25855b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline switch (family) { 25955b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline case INetd::IPV4: 26055b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline familyStr = "ipv4"; 26155b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline break; 26255b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline case INetd::IPV6: 26355b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline familyStr = "ipv6"; 26455b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline break; 26555b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline default: 26655b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline return binder::Status::fromServiceSpecificError(EAFNOSUPPORT, String8("Bad family")); 26755b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline } 26855b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline 26955b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline const char *whichStr; 27055b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline switch (which) { 27155b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline case INetd::CONF: 27255b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline whichStr = "conf"; 27355b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline break; 27455b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline case INetd::NEIGH: 27555b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline whichStr = "neigh"; 27655b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline break; 27755b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline default: 27855b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline return binder::Status::fromServiceSpecificError(EINVAL, String8("Bad category")); 27955b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline } 28055b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline 28155b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline const int err = InterfaceController::setParameter( 28255b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline familyStr, whichStr, ifname.c_str(), parameter.c_str(), 28355b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline value.c_str()); 28455b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline if (err != 0) { 28555b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline return binder::Status::fromServiceSpecificError(-err, 28655b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline String8::format("ResolverController error: %s", strerror(-err))); 28755b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline } 28855b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline return binder::Status::ok(); 28955b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline} 29055b06f85b13553b7b0b5a76f650f452d5a9473c5Erik Kline 2912cf561722c2661cc0d4db502a44a3021609f307eRobin Leebinder::Status NetdNativeService::getMetricsReportingLevel(int *reportingLevel) { 2922cf561722c2661cc0d4db502a44a3021609f307eRobin Lee // This function intentionally does not lock, since the only thing it does is one read from an 2932cf561722c2661cc0d4db502a44a3021609f307eRobin Lee // atomic_int. 2942cf561722c2661cc0d4db502a44a3021609f307eRobin Lee ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL); 2952cf561722c2661cc0d4db502a44a3021609f307eRobin Lee ENFORCE_DEBUGGABLE(); 2962cf561722c2661cc0d4db502a44a3021609f307eRobin Lee 297d544011db2537092fe4f76d238dfe3a82ad15a36Michal Karpinski *reportingLevel = gCtls->eventReporter.getMetricsReportingLevel(); 2982cf561722c2661cc0d4db502a44a3021609f307eRobin Lee return binder::Status::ok(); 2992cf561722c2661cc0d4db502a44a3021609f307eRobin Lee} 3002cf561722c2661cc0d4db502a44a3021609f307eRobin Lee 3012cf561722c2661cc0d4db502a44a3021609f307eRobin Leebinder::Status NetdNativeService::setMetricsReportingLevel(const int reportingLevel) { 3022cf561722c2661cc0d4db502a44a3021609f307eRobin Lee // This function intentionally does not lock, since the only thing it does is one write to an 3032cf561722c2661cc0d4db502a44a3021609f307eRobin Lee // atomic_int. 3042cf561722c2661cc0d4db502a44a3021609f307eRobin Lee ENFORCE_PERMISSION(CONNECTIVITY_INTERNAL); 3052cf561722c2661cc0d4db502a44a3021609f307eRobin Lee ENFORCE_DEBUGGABLE(); 3062cf561722c2661cc0d4db502a44a3021609f307eRobin Lee 307d544011db2537092fe4f76d238dfe3a82ad15a36Michal Karpinski return (gCtls->eventReporter.setMetricsReportingLevel(reportingLevel) == 0) 308d544011db2537092fe4f76d238dfe3a82ad15a36Michal Karpinski ? binder::Status::ok() 309d544011db2537092fe4f76d238dfe3a82ad15a36Michal Karpinski : binder::Status::fromExceptionCode(binder::Status::EX_ILLEGAL_ARGUMENT); 3102cf561722c2661cc0d4db502a44a3021609f307eRobin Lee} 3112cf561722c2661cc0d4db502a44a3021609f307eRobin Lee 312e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti} // namespace net 313e4d626ea35b7a402388b524e2feafc81e6387697Lorenzo Colitti} // namespace android 314