Support for dns domain. bug:6799630 Change-Id: I10070eddb65b7b60f0bc2b3e1e320e1aa4ec6e98
diff --git a/core/java/android/net/DhcpResults.java b/core/java/android/net/DhcpResults.java index 23297df..2f300de 100644 --- a/core/java/android/net/DhcpResults.java +++ b/core/java/android/net/DhcpResults.java
@@ -238,4 +238,7 @@ vendorInfo = info; } + public void setDomains(String domains) { + linkProperties.setDomains(domains); + } }
diff --git a/core/java/android/net/LinkProperties.java b/core/java/android/net/LinkProperties.java index 60bf640b..b9362da 100644 --- a/core/java/android/net/LinkProperties.java +++ b/core/java/android/net/LinkProperties.java
@@ -54,6 +54,7 @@ private String mIfaceName; private Collection<LinkAddress> mLinkAddresses = new ArrayList<LinkAddress>(); private Collection<InetAddress> mDnses = new ArrayList<InetAddress>(); + private String mDomains; private Collection<RouteInfo> mRoutes = new ArrayList<RouteInfo>(); private ProxyProperties mHttpProxy; @@ -82,9 +83,10 @@ mIfaceName = source.getInterfaceName(); for (LinkAddress l : source.getLinkAddresses()) mLinkAddresses.add(l); for (InetAddress i : source.getDnses()) mDnses.add(i); + mDomains = source.getDomains(); for (RouteInfo r : source.getRoutes()) mRoutes.add(r); mHttpProxy = (source.getHttpProxy() == null) ? - null : new ProxyProperties(source.getHttpProxy()); + null : new ProxyProperties(source.getHttpProxy()); } } @@ -120,6 +122,14 @@ return Collections.unmodifiableCollection(mDnses); } + public String getDomains() { + return mDomains; + } + + public void setDomains(String domains) { + mDomains = domains; + } + public void addRoute(RouteInfo route) { if (route != null) mRoutes.add(route); } @@ -138,6 +148,7 @@ mIfaceName = null; mLinkAddresses.clear(); mDnses.clear(); + mDomains = null; mRoutes.clear(); mHttpProxy = null; } @@ -162,12 +173,14 @@ for (InetAddress addr : mDnses) dns += addr.getHostAddress() + ","; dns += "] "; - String routes = "Routes: ["; + String domainName = "Domains: " + mDomains; + + String routes = " Routes: ["; for (RouteInfo route : mRoutes) routes += route.toString() + ","; routes += "] "; String proxy = (mHttpProxy == null ? "" : "HttpProxy: " + mHttpProxy.toString() + " "); - return ifaceName + linkAddresses + routes + dns + proxy; + return ifaceName + linkAddresses + routes + dns + domainName + proxy; } /** @@ -201,6 +214,12 @@ */ public boolean isIdenticalDnses(LinkProperties target) { Collection<InetAddress> targetDnses = target.getDnses(); + String targetDomains = target.getDomains(); + if (mDomains == null) { + if (targetDomains != null) return false; + } else { + if (mDomains.equals(targetDomains) == false) return false; + } return (mDnses.size() == targetDnses.size()) ? mDnses.containsAll(targetDnses) : false; } @@ -359,6 +378,7 @@ return ((null == mIfaceName) ? 0 : mIfaceName.hashCode() + mLinkAddresses.size() * 31 + mDnses.size() * 37 + + ((null == mDomains) ? 0 : mDomains.hashCode()) + mRoutes.size() * 41 + ((null == mHttpProxy) ? 0 : mHttpProxy.hashCode())); } @@ -377,6 +397,7 @@ for(InetAddress d : mDnses) { dest.writeByteArray(d.getAddress()); } + dest.writeString(mDomains); dest.writeInt(mRoutes.size()); for(RouteInfo route : mRoutes) { @@ -413,6 +434,7 @@ netProp.addDns(InetAddress.getByAddress(in.createByteArray())); } catch (UnknownHostException e) { } } + netProp.setDomains(in.readString()); addressCount = in.readInt(); for (int i=0; i<addressCount; i++) { netProp.addRoute((RouteInfo)in.readParcelable(null));
diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl index 2179fa1..80abd0f 100644 --- a/core/java/android/os/INetworkManagementService.aidl +++ b/core/java/android/os/INetworkManagementService.aidl
@@ -351,7 +351,7 @@ /** * Bind name servers to an interface in the DNS resolver. */ - void setDnsServersForInterface(String iface, in String[] servers); + void setDnsServersForInterface(String iface, in String[] servers, String domains); /** * Flush the DNS cache associated with the default interface.
diff --git a/core/jni/android_net_NetUtils.cpp b/core/jni/android_net_NetUtils.cpp index 5bdaac6..296add3 100644 --- a/core/jni/android_net_NetUtils.cpp +++ b/core/jni/android_net_NetUtils.cpp
@@ -36,7 +36,8 @@ const char *dns2, const char *server, uint32_t *lease, - const char *vendorInfo); + const char *vendorInfo, + const char *domains); int dhcp_do_request_renew(const char *ifname, const char *ipaddr, @@ -46,7 +47,8 @@ const char *dns2, const char *server, uint32_t *lease, - const char *vendorInfo); + const char *vendorInfo, + const char *domains); int dhcp_stop(const char *ifname); int dhcp_release_lease(const char *ifname); @@ -68,6 +70,7 @@ jmethodID addLinkAddress; jmethodID addGateway; jmethodID addDns; + jmethodID setDomains; jmethodID setServerAddress; jmethodID setLeaseDuration; jmethodID setVendorInfo; @@ -120,18 +123,18 @@ char server[PROPERTY_VALUE_MAX]; uint32_t lease; char vendorInfo[PROPERTY_VALUE_MAX]; + char domains[PROPERTY_VALUE_MAX]; const char *nameStr = env->GetStringUTFChars(ifname, NULL); if (nameStr == NULL) return (jboolean)false; if (renew) { result = ::dhcp_do_request_renew(nameStr, ipaddr, gateway, &prefixLength, - dns1, dns2, server, &lease, vendorInfo); + dns1, dns2, server, &lease, vendorInfo, domains); } else { result = ::dhcp_do_request(nameStr, ipaddr, gateway, &prefixLength, - dns1, dns2, server, &lease, vendorInfo); + dns1, dns2, server, &lease, vendorInfo, domains); } - env->ReleaseStringUTFChars(ifname, nameStr); if (result == 0) { env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.clear); @@ -160,6 +163,9 @@ } if (result == 0) { + env->CallVoidMethod(dhcpResults, dhcpResultsFieldIds.setDomains, + env->NewStringUTF(domains)); + result = env->CallBooleanMethod(dhcpResults, dhcpResultsFieldIds.addDns, env->NewStringUTF(dns2)); } @@ -251,6 +257,8 @@ env->GetMethodID(dhcpResultsClass, "addGateway", "(Ljava/lang/String;)Z"); dhcpResultsFieldIds.addDns = env->GetMethodID(dhcpResultsClass, "addDns", "(Ljava/lang/String;)Z"); + dhcpResultsFieldIds.setDomains = + env->GetMethodID(dhcpResultsClass, "setDomains", "(Ljava/lang/String;)V"); dhcpResultsFieldIds.setServerAddress = env->GetMethodID(dhcpResultsClass, "setServerAddress", "(Ljava/lang/String;)Z"); dhcpResultsFieldIds.setLeaseDuration =
diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index ad1dfb2..c59c3d9 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java
@@ -2524,19 +2524,19 @@ SystemProperties.set(key, ""); } mNumDnsEntries = last; + if (SystemProperties.get("net.dns.search").equals(domains) == false) { + SystemProperties.set("net.dns.search", domains); + changed = true; + } if (changed) { try { - mNetd.setDnsServersForInterface(iface, NetworkUtils.makeStrings(dnses)); + mNetd.setDnsServersForInterface(iface, NetworkUtils.makeStrings(dnses), domains); mNetd.setDefaultInterfaceForDns(iface); } catch (Exception e) { if (DBG) loge("exception setting default dns interface: " + e); } } - if (!domains.equals(SystemProperties.get("net.dns.search"))) { - SystemProperties.set("net.dns.search", domains); - changed = true; - } return changed; } @@ -2552,13 +2552,13 @@ String network = nt.getNetworkInfo().getTypeName(); synchronized (mDnsLock) { if (!mDnsOverridden) { - changed = updateDns(network, p.getInterfaceName(), dnses, ""); + changed = updateDns(network, p.getInterfaceName(), dnses, p.getDomains()); } } } else { try { mNetd.setDnsServersForInterface(p.getInterfaceName(), - NetworkUtils.makeStrings(dnses)); + NetworkUtils.makeStrings(dnses), p.getDomains()); } catch (Exception e) { if (DBG) loge("exception setting dns servers: " + e); }
diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java index 3ddae3e..9ce02e3 100644 --- a/services/java/com/android/server/NetworkManagementService.java +++ b/services/java/com/android/server/NetworkManagementService.java
@@ -1398,10 +1398,12 @@ } @Override - public void setDnsServersForInterface(String iface, String[] servers) { + public void setDnsServersForInterface(String iface, String[] servers, String domains) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); - final Command cmd = new Command("resolver", "setifdns", iface); + final Command cmd = new Command("resolver", "setifdns", iface, + (domains == null ? "" : domains)); + for (String s : servers) { InetAddress a = NetworkUtils.numericToInetAddress(s); if (a.isAnyLocalAddress() == false) {
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java index b6fcbd1..44b2eac 100644 --- a/wifi/java/android/net/wifi/WifiStateMachine.java +++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -1805,6 +1805,12 @@ private void handleSuccessfulIpConfiguration(DhcpResults dhcpResults) { mLastSignalLevel = -1; // force update of signal strength mReconnectCount = 0; //Reset IP failure tracking + if (dhcpResults.serverAddress == null) { + dhcpResults = null; + } + synchronized (mDhcpResultsLock) { + mDhcpResults = dhcpResults; + } LinkProperties linkProperties = dhcpResults.linkProperties; mWifiConfigStore.setLinkProperties(mLastNetworkId, linkProperties); InetAddress addr = null; @@ -1826,7 +1832,6 @@ sendLinkConfigurationChangedBroadcast(); } } else { - mLinkProperties = linkProperties; configureLinkProperties(); } }