diff options
author | Lorenzo Colitti <lorenzo@google.com> | 2015-02-25 10:26:19 +0900 |
---|---|---|
committer | Lorenzo Colitti <lorenzo@google.com> | 2015-02-25 13:50:49 +0900 |
commit | 3667936aadcabddc708797ac38ce1ffb2f992cb3 (patch) | |
tree | 5b2945957c1f42dc3dbcfb68555dc524b49b4161 | |
parent | 799625cd5b0a2191632f5b042bf9ff559c18a848 (diff) | |
download | netd-3667936aadcabddc708797ac38ce1ffb2f992cb3.tar.gz |
Add a dummy network that discards all packets.
Bug: 19500693
Change-Id: Ic25f2d8c481f1528e887e43ca3fa868189582110
-rw-r--r-- | server/Android.mk | 1 | ||||
-rw-r--r-- | server/DummyNetwork.cpp | 43 | ||||
-rw-r--r-- | server/DummyNetwork.h | 34 | ||||
-rw-r--r-- | server/Network.h | 1 | ||||
-rw-r--r-- | server/NetworkController.cpp | 5 | ||||
-rw-r--r-- | server/NetworkController.h | 1 | ||||
-rw-r--r-- | server/RouteController.cpp | 40 |
7 files changed, 124 insertions, 1 deletions
diff --git a/server/Android.mk b/server/Android.mk index 55aa87cd..9111d84e 100644 --- a/server/Android.mk +++ b/server/Android.mk @@ -44,6 +44,7 @@ LOCAL_SRC_FILES := \ ClatdController.cpp \ CommandListener.cpp \ DnsProxyListener.cpp \ + DummyNetwork.cpp \ FirewallController.cpp \ FwmarkServer.cpp \ IdletimerController.cpp \ diff --git a/server/DummyNetwork.cpp b/server/DummyNetwork.cpp new file mode 100644 index 00000000..ff2cb412 --- /dev/null +++ b/server/DummyNetwork.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "DummyNetwork.h" + +#include "RouteController.h" + +#define LOG_TAG "Netd" +#include "log/log.h" + +const char* DummyNetwork::INTERFACE_NAME = "dummy0"; + +DummyNetwork::DummyNetwork(unsigned netId) : Network(netId) { + mInterfaces.insert(INTERFACE_NAME); +} + +DummyNetwork::~DummyNetwork() { +} + +Network::Type DummyNetwork::getType() const { + return DUMMY; +} + +int DummyNetwork::addInterface(const std::string& /* interface */) { + return -EINVAL; +} + +int DummyNetwork::removeInterface(const std::string& /* interface */) { + return -EINVAL; +} diff --git a/server/DummyNetwork.h b/server/DummyNetwork.h new file mode 100644 index 00000000..7bc0d3d4 --- /dev/null +++ b/server/DummyNetwork.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef NETD_SERVER_DUMMY_NETWORK_H +#define NETD_SERVER_DUMMY_NETWORK_H + +#include "Network.h" + +class DummyNetwork : public Network { +public: + static const char* INTERFACE_NAME; + explicit DummyNetwork(unsigned netId); + virtual ~DummyNetwork(); + +private: + Type getType() const override; + int addInterface(const std::string& interface) override WARN_UNUSED_RESULT; + int removeInterface(const std::string& interface) override WARN_UNUSED_RESULT; +}; + +#endif // NETD_SERVER_DUMMY_NETWORK_H diff --git a/server/Network.h b/server/Network.h index 115997ad..3af53d97 100644 --- a/server/Network.h +++ b/server/Network.h @@ -26,6 +26,7 @@ class Network { public: enum Type { + DUMMY, LOCAL, PHYSICAL, VIRTUAL, diff --git a/server/NetworkController.cpp b/server/NetworkController.cpp index 20d8e977..76e4a6af 100644 --- a/server/NetworkController.cpp +++ b/server/NetworkController.cpp @@ -32,6 +32,7 @@ #include "NetworkController.h" +#include "DummyNetwork.h" #include "Fwmark.h" #include "LocalNetwork.h" #include "PhysicalNetwork.h" @@ -53,7 +54,8 @@ const unsigned MAX_NET_ID = 65535; const unsigned NetworkController::MIN_OEM_ID = 1; const unsigned NetworkController::MAX_OEM_ID = 50; -// NetIds 51..98 are reserved for future use. +const unsigned NetworkController::DUMMY_NET_ID = 51; +// NetIds 52..98 are reserved for future use. const unsigned NetworkController::LOCAL_NET_ID = 99; // All calls to methods here are made while holding a write lock on mRWLock. @@ -132,6 +134,7 @@ int NetworkController::DelegateImpl::modifyFallthrough(const std::string& physic NetworkController::NetworkController() : mDelegateImpl(new NetworkController::DelegateImpl(this)), mDefaultNetId(NETID_UNSET) { mNetworks[LOCAL_NET_ID] = new LocalNetwork(LOCAL_NET_ID); + mNetworks[DUMMY_NET_ID] = new DummyNetwork(DUMMY_NET_ID); } unsigned NetworkController::getDefaultNetwork() const { diff --git a/server/NetworkController.h b/server/NetworkController.h index 5596f0c0..073745da 100644 --- a/server/NetworkController.h +++ b/server/NetworkController.h @@ -43,6 +43,7 @@ public: static const unsigned MIN_OEM_ID; static const unsigned MAX_OEM_ID; static const unsigned LOCAL_NET_ID; + static const unsigned DUMMY_NET_ID; NetworkController(); diff --git a/server/RouteController.cpp b/server/RouteController.cpp index c3a600d9..a7d823bb 100644 --- a/server/RouteController.cpp +++ b/server/RouteController.cpp @@ -18,10 +18,12 @@ #include "Fwmark.h" #include "UidRanges.h" +#include "DummyNetwork.h" #define LOG_TAG "Netd" #include "log/log.h" #include "logwrap/logwrap.h" +#include "netutils/ifc.h" #include "resolv_netid.h" #include <arpa/inet.h> @@ -644,6 +646,41 @@ WARN_UNUSED_RESULT int addLocalNetworkRules(unsigned localNetId) { fwmark.intValue, mask.intValue); } +int configureDummyNetwork() { + const char *interface = DummyNetwork::INTERFACE_NAME; + uint32_t table = getRouteTableForInterface(interface); + if (table == RT_TABLE_UNSPEC) { + // getRouteTableForInterface has already looged an error. + return -ESRCH; + } + + ifc_init(); + int ret = ifc_up(interface); + ifc_close(); + if (ret) { + ALOGE("Can't bring up %s: %s", interface, strerror(errno)); + return -errno; + } + + if ((ret = modifyOutputInterfaceRule(interface, table, PERMISSION_NONE, + INVALID_UID, INVALID_UID, ACTION_ADD))) { + ALOGE("Can't create oif rule for %s: %s", interface, strerror(-ret)); + return ret; + } + + if ((ret = modifyIpRoute(RTM_NEWROUTE, table, interface, "0.0.0.0/0", NULL))) { + ALOGE("Can't add IPv4 default route to %s: %s", interface, strerror(-ret)); + return ret; + } + + if ((ret = modifyIpRoute(RTM_NEWROUTE, table, interface, "::/0", NULL))) { + ALOGE("Can't add IPv6 default route to %s: %s", interface, strerror(-ret)); + return ret; + } + + return 0; +} + // Add a new rule to look up the 'main' table, with the same selectors as the "default network" // rule, but with a lower priority. We will never create routes in the main table; it should only be // used for directly-connected routes implicitly created by the kernel when adding IP addresses. @@ -889,6 +926,9 @@ int RouteController::Init(unsigned localNetId) { if (int ret = addUnreachableRule()) { return ret; } + // Don't complain if we can't add the dummy network, since not all devices support it. + configureDummyNetwork(); + updateTableNamesFile(); return 0; } |