diff options
| author | 2011-07-26 13:21:09 -0700 | |
|---|---|---|
| committer | 2011-07-26 13:21:09 -0700 | |
| commit | 41394a361020e9f58524f23d6831bb8e63063856 (patch) | |
| tree | 29a9c842f03d748df6c3718bd5bee4aa60604e42 | |
| parent | ac74551bb42eb2d6775d994357481113375574e7 (diff) | |
| parent | 572b7048a6ed6cf6c5f6bc6c9d542dc377d601ff (diff) | |
Merge "Use dns proxy a bit." into honeycomb-LTE
4 files changed, 105 insertions, 0 deletions
diff --git a/core/java/android/net/NetworkUtils.java b/core/java/android/net/NetworkUtils.java index 76534ef3d8a7..e07cbcefbb89 100644 --- a/core/java/android/net/NetworkUtils.java +++ b/core/java/android/net/NetworkUtils.java @@ -20,6 +20,7 @@ import java.net.InetAddress; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.UnknownHostException; +import java.util.Collection; import android.util.Log; @@ -235,4 +236,18 @@ public class NetworkUtils { throw new IllegalArgumentException(e); } } + + /** + * Create a string array of host addresses from a collection of InetAddresses + * @param addrs a Collection of InetAddresses + * @return an array of Strings containing their host addresses + */ + public static String[] makeStrings(Collection<InetAddress> addrs) { + String[] result = new String[addrs.size()]; + int i=0; + for (InetAddress addr : addrs) { + result[i++] = addr.getHostAddress(); + } + return result; + } } diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl index 5a245f878545..87c2d5932f8b 100644 --- a/core/java/android/os/INetworkManagementService.aidl +++ b/core/java/android/os/INetworkManagementService.aidl @@ -224,4 +224,23 @@ interface INetworkManagementService */ int getInterfaceTxThrottle(String iface); + /** + * Sets the name fo 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/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index 06be27bb6510..8ad9f91ab2a4 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -1783,8 +1783,19 @@ public class ConnectivityService extends IConnectivityManager.Stub { LinkProperties p = nt.getLinkProperties(); if (p == null) return; Collection<InetAddress> dnses = p.getDnses(); + try { + mNetd.setDnsServersForInterface(p.getInterfaceName(), + NetworkUtils.makeStrings(dnses)); + } catch (Exception e) { + Slog.e(TAG, "exception setting dns servers: " + e); + } boolean changed = false; if (mNetConfigs[netType].isDefault()) { + try { + mNetd.setDefaultInterfaceForDns(p.getInterfaceName()); + } catch (Exception e) { + Slog.e(TAG, "exception setting default dns interface: " + e); + } int j = 1; if (dnses.size() == 0 && mDefaultDns != null) { String dnsString = mDefaultDns.getHostAddress(); diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java index 0b4b95893254..9a5d0becfe2a 100644 --- a/services/java/com/android/server/NetworkManagementService.java +++ b/services/java/com/android/server/NetworkManagementService.java @@ -949,4 +949,64 @@ class NetworkManagementService extends INetworkManagementService.Stub { 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) { + InetAddress a = NetworkUtils.numericToInetAddress(s); + if (a.isAnyLocalAddress() == false) { + cmd += " " + a.getHostAddress(); + } + } + mConnector.doCommand(cmd); + } catch (IllegalArgumentException e) { + throw new IllegalStateException("Error setting dnsn for interface", e); + } catch (NativeDaemonConnectorException e) { + throw new IllegalStateException( + "Error communicating with native daemon 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 daemon 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 daemon to flush interface " + iface, e); + } + } } |