Merge "Move VPN routing decisions from iptables to ip" into klp-dev
diff --git a/CommandListener.cpp b/CommandListener.cpp
index b9df842..d6a284f 100644
--- a/CommandListener.cpp
+++ b/CommandListener.cpp
@@ -1014,9 +1014,11 @@
                     "Wrong number of arguments to resolver setifaceforuid", false);
             return 0;
         }
-    } else if (!strcmp(argv[1], "clearifaceforuidrange")) { // resolver clearifaceforuid <l> <h>
-        if (argc == 4) {
-            rc = sResolverCtrl->clearDnsInterfaceForUidRange(atoi(argv[2]), atoi(argv[3]));
+    } else if (!strcmp(argv[1], "clearifaceforuidrange")) {
+        // resolver clearifaceforuid <if> <l> <h>
+        if (argc == 5) {
+            rc = sResolverCtrl->clearDnsInterfaceForUidRange(argv[2], atoi(argv[3]),
+                    atoi(argv[4]));
         } else {
             cli->sendMsg(ResponseCode::CommandSyntaxError,
                     "Wrong number of arguments to resolver clearifaceforuid", false);
diff --git a/DnsProxyListener.cpp b/DnsProxyListener.cpp
index eb02f01..6990f26 100644
--- a/DnsProxyListener.cpp
+++ b/DnsProxyListener.cpp
@@ -133,8 +133,7 @@
     if (mIface == NULL) {
         //fall back to the per uid interface if no per pid interface exists
         if(!_resolv_get_pids_associated_interface(mPid, tmp, sizeof(tmp)))
-            if(!_resolv_get_uids_associated_interface(mUid, tmp, sizeof(tmp)))
-                mark = -1; // if we don't have a targeted iface don't use a mark
+            _resolv_get_uids_associated_interface(mUid, tmp, sizeof(tmp));
     }
 
     struct addrinfo* result = NULL;
@@ -473,8 +472,7 @@
     if (mIface == NULL) {
         //fall back to the per uid interface if no per pid interface exists
         if(!_resolv_get_pids_associated_interface(mPid, tmp, sizeof(tmp)))
-            if(!_resolv_get_uids_associated_interface(mUid, tmp, sizeof(tmp)))
-                mark = -1;
+            _resolv_get_uids_associated_interface(mUid, tmp, sizeof(tmp));
     }
     struct hostent* hp;
 
diff --git a/NetdConstants.h b/NetdConstants.h
index d686968..2508ea2 100644
--- a/NetdConstants.h
+++ b/NetdConstants.h
@@ -21,6 +21,8 @@
 #include <list>
 #include <stdarg.h>
 
+const int PROTECT_MARK = 0x1;
+
 extern const char * const IPTABLES_PATH;
 extern const char * const IP6TABLES_PATH;
 extern const char * const IP_PATH;
diff --git a/ResolverController.cpp b/ResolverController.cpp
index e61fae7..8a43916 100644
--- a/ResolverController.cpp
+++ b/ResolverController.cpp
@@ -105,12 +105,13 @@
     return _resolv_set_iface_for_uid_range(iface, uid_start, uid_end);
 }
 
-int ResolverController::clearDnsInterfaceForUidRange(int uid_start, int uid_end) {
+int ResolverController::clearDnsInterfaceForUidRange(const char* iface, int uid_start,
+        int uid_end) {
     if (DBG) {
-        ALOGD("clearDnsIfaceForUidRange range = [%d,%d]\n", uid_start, uid_end);
+        ALOGD("clearDnsIfaceForUidRange iface = %s range = [%d,%d]\n", iface, uid_start, uid_end);
     }
 
-    return _resolv_clear_iface_for_uid_range(uid_start, uid_end);
+    return _resolv_clear_iface_for_uid_range(iface, uid_start, uid_end);
 }
 
 int ResolverController::clearDnsInterfaceMappings()
diff --git a/ResolverController.h b/ResolverController.h
index e705c8f..c1d5580 100644
--- a/ResolverController.h
+++ b/ResolverController.h
@@ -34,7 +34,7 @@
     int setDnsInterfaceForPid(const char* iface, int pid);
     int clearDnsInterfaceForPid(int pid);
     int setDnsInterfaceForUidRange(const char* iface, int uid_start, int uid_end);
-    int clearDnsInterfaceForUidRange(int uid_start, int uid_end);
+    int clearDnsInterfaceForUidRange(const char* iface, int uid_start, int uid_end);
     int clearDnsInterfaceMappings();
 };
 
diff --git a/SecondaryTableController.h b/SecondaryTableController.h
index ded60a8..e286075 100644
--- a/SecondaryTableController.h
+++ b/SecondaryTableController.h
@@ -30,7 +30,6 @@
 static const int INTERFACES_TRACKED = 10;
 static const int BASE_TABLE_NUMBER = 60;
 static int MAX_TABLE_NUMBER = BASE_TABLE_NUMBER + INTERFACES_TRACKED;
-static const int PROTECT_MARK = 0x1;
 static const char *EXEMPT_PRIO = "99";
 static const char *RULE_PRIO = "100";
 
diff --git a/UidMarkMap.cpp b/UidMarkMap.cpp
index d30ac53..13630d3 100644
--- a/UidMarkMap.cpp
+++ b/UidMarkMap.cpp
@@ -15,6 +15,7 @@
  */
 
 #include "UidMarkMap.h"
+#include "NetdConstants.h"
 
 UidMarkMap::UidMarkEntry::UidMarkEntry(int start, int end, int new_mark) :
                                             uid_start(start),
@@ -27,16 +28,9 @@
     if (uid_start > uid_end) {
         return false;
     }
-    android::netd::List<UidMarkEntry*>::iterator it;
-    for (it = mMap.begin(); it != mMap.end(); it++) {
-        UidMarkEntry *entry = *it;
-        if (entry->uid_start <= uid_end && uid_start <= entry->uid_end) {
-            return false;
-        }
-    }
 
     UidMarkEntry *e = new UidMarkEntry(uid_start, uid_end, mark);
-    mMap.push_back(e);
+    mMap.push_front(e);
     return true;
 };
 
@@ -63,7 +57,9 @@
             return entry->mark;
         }
     }
-    return -1;
+    // If the uid has no mark specified then it should be protected from any VPN rules that might
+    // be affecting the service acting on its behalf.
+    return PROTECT_MARK;
 };
 
 bool UidMarkMap::anyRulesForMark(int mark) {