Add full support for UIDs in VPNs.
Major:
+ Implement the functions mentioned in http://go/android-multinetwork-routing
correctly, including handling accept(), connect(), setNetworkForSocket()
and protect() and supporting functions like canUserSelectNetwork().
+ Eliminate the old code path of getting/setting UID ranges through
SecondaryTableController (which is currently unused) and mUidMap.
Minor:
+ Rename some methods/variables for clarity and consistency.
+ Moved some methods in .cpp files to match declaration order in the .h files.
Bug: 15409918
Change-Id: Ic6ce3646c58cf645db0d9a53cbeefdd7ffafff93
diff --git a/server/VirtualNetwork.cpp b/server/VirtualNetwork.cpp
index 024d2cf..565bd55 100644
--- a/server/VirtualNetwork.cpp
+++ b/server/VirtualNetwork.cpp
@@ -21,12 +21,48 @@
#define LOG_TAG "Netd"
#include "log/log.h"
-VirtualNetwork::VirtualNetwork(unsigned netId): Network(netId) {
+VirtualNetwork::VirtualNetwork(unsigned netId, bool hasDns): Network(netId), mHasDns(hasDns) {
}
VirtualNetwork::~VirtualNetwork() {
}
+bool VirtualNetwork::getHasDns() const {
+ return mHasDns;
+}
+
+bool VirtualNetwork::appliesToUser(uid_t uid) const {
+ return mUidRanges.hasUid(uid);
+}
+
+int VirtualNetwork::addUsers(const UidRanges& uidRanges) {
+ for (const std::string& interface : mInterfaces) {
+ if (int ret = RouteController::addUsersToVirtualNetwork(mNetId, interface.c_str(),
+ uidRanges)) {
+ ALOGE("failed to add users on interface %s of netId %u", interface.c_str(), mNetId);
+ return ret;
+ }
+ }
+ mUidRanges.add(uidRanges);
+ return 0;
+}
+
+int VirtualNetwork::removeUsers(const UidRanges& uidRanges) {
+ for (const std::string& interface : mInterfaces) {
+ if (int ret = RouteController::removeUsersFromVirtualNetwork(mNetId, interface.c_str(),
+ uidRanges)) {
+ ALOGE("failed to remove users on interface %s of netId %u", interface.c_str(), mNetId);
+ return ret;
+ }
+ }
+ mUidRanges.remove(uidRanges);
+ return 0;
+}
+
+Network::Type VirtualNetwork::getType() const {
+ return VIRTUAL;
+}
+
int VirtualNetwork::addInterface(const std::string& interface) {
if (hasInterface(interface)) {
return 0;
@@ -52,31 +88,3 @@
mInterfaces.erase(interface);
return 0;
}
-
-Network::Type VirtualNetwork::getType() const {
- return VIRTUAL;
-}
-
-int VirtualNetwork::addUsers(const UidRanges& uidRanges) {
- for (const std::string& interface : mInterfaces) {
- if (int ret = RouteController::addUsersToVirtualNetwork(mNetId, interface.c_str(),
- uidRanges)) {
- ALOGE("failed to add users on interface %s of netId %u", interface.c_str(), mNetId);
- return ret;
- }
- }
- mUidRanges.add(uidRanges);
- return 0;
-}
-
-int VirtualNetwork::removeUsers(const UidRanges& uidRanges) {
- for (const std::string& interface : mInterfaces) {
- if (int ret = RouteController::removeUsersFromVirtualNetwork(mNetId, interface.c_str(),
- uidRanges)) {
- ALOGE("failed to remove users on interface %s of netId %u", interface.c_str(), mNetId);
- return ret;
- }
- }
- mUidRanges.remove(uidRanges);
- return 0;
-}