Implement the fallthrough rule to support split tunnel VPNs.

Change-Id: Ibc48caedb5954c6b12bfa553d978bab56c4b09aa
diff --git a/server/PhysicalNetwork.cpp b/server/PhysicalNetwork.cpp
index 395bea4..62343c4 100644
--- a/server/PhysicalNetwork.cpp
+++ b/server/PhysicalNetwork.cpp
@@ -24,28 +24,38 @@
 namespace {
 
 WARN_UNUSED_RESULT int addToDefault(unsigned netId, const std::string& interface,
-                                    Permission permission) {
+                                    Permission permission, PhysicalNetwork::Delegate* delegate) {
     if (int ret = RouteController::addInterfaceToDefaultNetwork(interface.c_str(), permission)) {
         ALOGE("failed to add interface %s to default netId %u", interface.c_str(), netId);
         return ret;
     }
+    if (int ret = delegate->addFallthrough(interface, permission)) {
+        return ret;
+    }
     return 0;
 }
 
 WARN_UNUSED_RESULT int removeFromDefault(unsigned netId, const std::string& interface,
-                                         Permission permission) {
+                                         Permission permission,
+                                         PhysicalNetwork::Delegate* delegate) {
     if (int ret = RouteController::removeInterfaceFromDefaultNetwork(interface.c_str(),
                                                                      permission)) {
         ALOGE("failed to remove interface %s from default netId %u", interface.c_str(), netId);
         return ret;
     }
+    if (int ret = delegate->removeFallthrough(interface, permission)) {
+        return ret;
+    }
     return 0;
 }
 
 }  // namespace
 
-PhysicalNetwork::PhysicalNetwork(unsigned netId) :
-        Network(netId), mPermission(PERMISSION_NONE), mIsDefault(false) {
+PhysicalNetwork::Delegate::~Delegate() {
+}
+
+PhysicalNetwork::PhysicalNetwork(unsigned netId, PhysicalNetwork::Delegate* delegate) :
+        Network(netId), mDelegate(delegate), mPermission(PERMISSION_NONE), mIsDefault(false) {
 }
 
 PhysicalNetwork::~PhysicalNetwork() {
@@ -69,10 +79,10 @@
     }
     if (mIsDefault) {
         for (const std::string& interface : mInterfaces) {
-            if (int ret = addToDefault(mNetId, interface, permission)) {
+            if (int ret = addToDefault(mNetId, interface, permission, mDelegate)) {
                 return ret;
             }
-            if (int ret = removeFromDefault(mNetId, interface, mPermission)) {
+            if (int ret = removeFromDefault(mNetId, interface, mPermission, mDelegate)) {
                 return ret;
             }
         }
@@ -86,7 +96,7 @@
         return 0;
     }
     for (const std::string& interface : mInterfaces) {
-        if (int ret = addToDefault(mNetId, interface, mPermission)) {
+        if (int ret = addToDefault(mNetId, interface, mPermission, mDelegate)) {
             return ret;
         }
     }
@@ -99,7 +109,7 @@
         return 0;
     }
     for (const std::string& interface : mInterfaces) {
-        if (int ret = removeFromDefault(mNetId, interface, mPermission)) {
+        if (int ret = removeFromDefault(mNetId, interface, mPermission, mDelegate)) {
             return ret;
         }
     }
@@ -121,7 +131,7 @@
         return ret;
     }
     if (mIsDefault) {
-        if (int ret = addToDefault(mNetId, interface, mPermission)) {
+        if (int ret = addToDefault(mNetId, interface, mPermission, mDelegate)) {
             return ret;
         }
     }
@@ -139,7 +149,7 @@
         return ret;
     }
     if (mIsDefault) {
-        if (int ret = removeFromDefault(mNetId, interface, mPermission)) {
+        if (int ret = removeFromDefault(mNetId, interface, mPermission, mDelegate)) {
             return ret;
         }
     }