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 &parameter,
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