am 2b62c4fb: am 38bb0123: Merge "Added methods to support dns cache per interface"

* commit '2b62c4fbfeb7df0988bf216c50cd4a24f05add9f':
  Added methods to support dns cache per interface
diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl
index 212c5fb..08403af 100644
--- a/core/java/android/os/INetworkManagementService.aidl
+++ b/core/java/android/os/INetworkManagementService.aidl
@@ -207,4 +207,23 @@
      */
     int getInterfaceTxThrottle(String iface);
 
+    /**
+     * Sets the name of the default interface in the DNS resolver.
+     */
+    void setDefaultInterfaceForDns(String iface);
+
+    /**
+     * Bind name servers to an interface in the DNS resolver.
+     */
+    void setDnsServersForInterface(String iface, in String[] servers);
+
+    /**
+     * Flush the DNS cache associated with the default interface
+     */
+    void flushDefaultDnsCache();
+
+    /**
+     * Flush the DNS cache associated with the specified interface
+     */
+    void flushInterfaceDnsCache(String iface);
 }
diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java
index f0acdc0..edc7c5a 100644
--- a/services/java/com/android/server/NetworkManagementService.java
+++ b/services/java/com/android/server/NetworkManagementService.java
@@ -784,4 +784,65 @@
     public int getInterfaceTxThrottle(String iface) {
         return getInterfaceThrottle(iface, false);
     }
+
+    public void setDefaultInterfaceForDns(String iface) throws IllegalStateException {
+        mContext.enforceCallingOrSelfPermission(
+                android.Manifest.permission.CHANGE_NETWORK_STATE, "NetworkManagementService");
+        try {
+            String cmd = "resolver setdefaultif " + iface;
+
+            mConnector.doCommand(cmd);
+        } catch (NativeDaemonConnectorException e) {
+            throw new IllegalStateException(
+                    "Error communicating with native daemon to set default interface", e);
+        }
+    }
+
+    public void setDnsServersForInterface(String iface, String[] servers)
+            throws IllegalStateException {
+        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.CHANGE_NETWORK_STATE,
+                "NetworkManagementService");
+        try {
+            String cmd = "resolver setifdns " + iface;
+            for (String s : servers) {
+                if (s != null && !"0.0.0.0".equals(s) &&
+                        !"::".equals(s) && !"0:0:0:0:0:0:0:0".equals(s)) {
+                    cmd += " " + InetAddress.getByName(s).getHostAddress();
+                }
+            }
+
+            mConnector.doCommand(cmd);
+        } catch (UnknownHostException e) {
+            throw new IllegalStateException("failed to resolve dns address.", e);
+        } catch (NativeDaemonConnectorException e) {
+            throw new IllegalStateException(
+                    "Error communicating with native deamon to set dns for interface", e);
+        }
+    }
+
+    public void flushDefaultDnsCache() throws IllegalStateException {
+        mContext.enforceCallingOrSelfPermission(
+                android.Manifest.permission.CHANGE_NETWORK_STATE, "NetworkManagementService");
+        try {
+            String cmd = "resolver flushdefaultif";
+
+            mConnector.doCommand(cmd);
+        } catch (NativeDaemonConnectorException e) {
+            throw new IllegalStateException(
+                    "Error communicating with native deamon to flush default interface", e);
+        }
+    }
+
+    public void flushInterfaceDnsCache(String iface) throws IllegalStateException {
+        mContext.enforceCallingOrSelfPermission(
+                android.Manifest.permission.CHANGE_NETWORK_STATE, "NetworkManagementService");
+        try {
+            String cmd = "resolver flushif " + iface;
+
+            mConnector.doCommand(cmd);
+        } catch (NativeDaemonConnectorException e) {
+            throw new IllegalStateException(
+                    "Error communicating with native deamon to flush interface " + iface, e);
+        }
+    }
 }