Merge "Tell the resolver what protocols to use." into ics-factoryrom

This commit is contained in:
Robert Greenwalt
2011-09-22 16:57:43 -07:00
committed by Android (Google) Code Review

View File

@@ -1974,7 +1974,8 @@ public class ConnectivityService extends IConnectivityManager.Stub {
Integer pid = (Integer)pids.get(j); Integer pid = (Integer)pids.get(j);
if (pid.intValue() == myPid) { if (pid.intValue() == myPid) {
Collection<InetAddress> dnses = p.getDnses(); Collection<InetAddress> dnses = p.getDnses();
writePidDns(dnses, myPid); String proto = determineProto(p);
writePidDns(dnses, myPid, proto);
if (doBump) { if (doBump) {
bumpDns(); bumpDns();
} }
@@ -1984,6 +1985,9 @@ public class ConnectivityService extends IConnectivityManager.Stub {
} }
} }
// nothing found - delete // nothing found - delete
if (SystemProperties.get("net.dnsproto." + myPid).length() != 0) {
SystemProperties.set("net.dnsproto." + myPid, "");
}
for (int i = 1; ; i++) { for (int i = 1; ; i++) {
String prop = "net.dns" + i + "." + myPid; String prop = "net.dns" + i + "." + myPid;
if (SystemProperties.get(prop).length() == 0) { if (SystemProperties.get(prop).length() == 0) {
@@ -1997,7 +2001,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
} }
// return true if results in a change // return true if results in a change
private boolean writePidDns(Collection <InetAddress> dnses, int pid) { private boolean writePidDns(Collection <InetAddress> dnses, int pid, String proto) {
int j = 1; int j = 1;
boolean changed = false; boolean changed = false;
for (InetAddress dns : dnses) { for (InetAddress dns : dnses) {
@@ -2007,6 +2011,11 @@ public class ConnectivityService extends IConnectivityManager.Stub {
SystemProperties.set("net.dns" + j++ + "." + pid, dns.getHostAddress()); SystemProperties.set("net.dns" + j++ + "." + pid, dns.getHostAddress());
} }
} }
if (dnses.size() > 0 && (changed || !proto.equals(SystemProperties.get("net.dnsproto." +
pid)))) {
changed = true;
SystemProperties.set("net.dnsproto." + pid, proto);
}
return changed; return changed;
} }
@@ -2037,7 +2046,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
// Caller must grab mDnsLock. // Caller must grab mDnsLock.
private boolean updateDns(String network, String iface, private boolean updateDns(String network, String iface,
Collection<InetAddress> dnses, String domains) { Collection<InetAddress> dnses, String domains, String proto) {
boolean changed = false; boolean changed = false;
int last = 0; int last = 0;
if (dnses.size() == 0 && mDefaultDns != null) { if (dnses.size() == 0 && mDefaultDns != null) {
@@ -2073,6 +2082,11 @@ public class ConnectivityService extends IConnectivityManager.Stub {
} }
mNumDnsEntries = last; mNumDnsEntries = last;
if (changed || !proto.equals(SystemProperties.get("net.dnsproto"))) {
changed = true;
SystemProperties.set("net.dnsproto", proto);
}
if (changed) { if (changed) {
try { try {
mNetd.setDnsServersForInterface(iface, NetworkUtils.makeStrings(dnses)); mNetd.setDnsServersForInterface(iface, NetworkUtils.makeStrings(dnses));
@@ -2096,11 +2110,14 @@ public class ConnectivityService extends IConnectivityManager.Stub {
if (p == null) return; if (p == null) return;
Collection<InetAddress> dnses = p.getDnses(); Collection<InetAddress> dnses = p.getDnses();
boolean changed = false; boolean changed = false;
String proto = determineProto(p);
if (mNetConfigs[netType].isDefault()) { if (mNetConfigs[netType].isDefault()) {
String network = nt.getNetworkInfo().getTypeName(); String network = nt.getNetworkInfo().getTypeName();
synchronized (mDnsLock) { synchronized (mDnsLock) {
if (!mDnsOverridden) { if (!mDnsOverridden) {
changed = updateDns(network, p.getInterfaceName(), dnses, ""); changed = updateDns(network, p.getInterfaceName(), dnses, "",
proto);
} }
} }
} else { } else {
@@ -2114,13 +2131,35 @@ public class ConnectivityService extends IConnectivityManager.Stub {
List pids = mNetRequestersPids[netType]; List pids = mNetRequestersPids[netType];
for (int y=0; y< pids.size(); y++) { for (int y=0; y< pids.size(); y++) {
Integer pid = (Integer)pids.get(y); Integer pid = (Integer)pids.get(y);
changed = writePidDns(dnses, pid.intValue()); changed = writePidDns(dnses, pid.intValue(), proto);
} }
} }
if (changed) bumpDns(); if (changed) bumpDns();
} }
} }
private String determineProto(LinkProperties p) {
boolean v4 = false;
boolean v6 = false;
for (RouteInfo r : p.getRoutes()) {
if (r.getDestination().getAddress() instanceof Inet6Address) {
v6 = true;
} else {
v4 = true;
}
}
// secondary connections often don't have routes and we infer routes
// to the dns servers. Look at the dns addrs too
for (InetAddress i : p.getDnses()) {
if (i instanceof Inet6Address) {
v6 = true;
} else {
v4 = true;
}
}
return (v4 ? "v4" : "") + (v6 ? "v6" : "");
}
private int getRestoreDefaultNetworkDelay(int networkType) { private int getRestoreDefaultNetworkDelay(int networkType) {
String restoreDefaultNetworkDelayStr = SystemProperties.get( String restoreDefaultNetworkDelayStr = SystemProperties.get(
NETWORK_RESTORE_DELAY_PROP_NAME); NETWORK_RESTORE_DELAY_PROP_NAME);
@@ -2842,7 +2881,7 @@ public class ConnectivityService extends IConnectivityManager.Stub {
// Apply DNS changes. // Apply DNS changes.
boolean changed = false; boolean changed = false;
synchronized (mDnsLock) { synchronized (mDnsLock) {
changed = updateDns("VPN", "VPN", addresses, domains); changed = updateDns("VPN", "VPN", addresses, domains, "v4");
mDnsOverridden = true; mDnsOverridden = true;
} }
if (changed) { if (changed) {